Skip to content

Commit 3d281ae

Browse files
author
Deren Vural
committed
Better Provider-change handling
Updated MainWindow class - Updated refresh_cards() function to check for a change in provider when refreshing - Added commented out attempt to refresh pages when setting changed - need to take another approach Updated GpuPage class - Updated some comments to be clearer+correct Signed-off-by: Deren Vural <[email protected]>
1 parent 48861dc commit 3d281ae

File tree

2 files changed

+133
-28
lines changed

2 files changed

+133
-28
lines changed

src/gpu_page/mod.rs

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -337,7 +337,7 @@ impl GpuPage {
337337
labels.push(new_content_label);
338338
}
339339

340-
// Fetch uuid, needed for processor
340+
// Create thread safe container for uuid, needed for processor
341341
let uuid_store: Arc<Mutex<String>> = Arc::new(Mutex::new(self.property("uuid")));
342342

343343
// Create thread safe container for provider
@@ -346,14 +346,13 @@ impl GpuPage {
346346
// Async fill the labels
347347
glib::timeout_add_seconds_local(refresh_rate, move || {
348348
// Grab locked data
349-
// Get list of statistics
349+
// list of statistics
350350
let statistics_lock: Arc<Mutex<Vec<&str>>> = Arc::clone(&statistics_store);
351351
let statistics: MutexGuard<Vec<&str>> = statistics_lock.lock().unwrap();
352-
// Get uuid
352+
// uuid
353353
let uuid_lock: Arc<Mutex<String>> = Arc::clone(&uuid_store);
354354
let uuid: String = uuid_lock.lock().unwrap().as_str().to_owned();
355-
356-
// Create provider for scanning gpu data
355+
// current provider for scanning gpu data
357356
let provider_lock: Arc<Mutex<Option<Provider>>> = Arc::clone(&provider_store);
358357
let mut provider_container: MutexGuard<Option<Provider>> = provider_lock.lock().unwrap();
359358

src/mainwindow/imp.rs

Lines changed: 129 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -23,12 +23,13 @@ use gio::Settings;
2323
use glib::{
2424
once_cell::sync::Lazy, once_cell::sync::OnceCell, signal::Inhibit,
2525
subclass::InitializingObject, FromVariant, ParamSpec, Value,
26+
clone
2627
};
2728
use gtk::{
2829
subclass::prelude::*, Button, CompositeTemplate, PolicyType, ScrolledWindow, Stack,
2930
TemplateChild,
3031
};
31-
use std::{cell::Cell, cell::RefCell, cell::RefMut, rc::Rc};
32+
use std::{cell::Cell, cell::RefCell, cell::RefMut, rc::Rc, sync::Arc, sync::Mutex, sync::MutexGuard};
3233

3334
// Modules
3435
use crate::{
@@ -1409,34 +1410,82 @@ impl MainWindow {
14091410
match provider_container {
14101411
// If provider does exist
14111412
Some(existing_provider) => {
1412-
// Update GPU list
1413-
match existing_provider.get_gpu_uuids() {
1414-
Ok(gpu_uuids) => {
1415-
// Construct a row for each GPU
1416-
for uuid in gpu_uuids {
1417-
// Grab current provider
1418-
let provider_container: Option<Provider> = self.provider.take();
1419-
self.provider.set(provider_container.clone());
1420-
1421-
// Get GPU data
1422-
match provider_container {
1423-
Some(prov) => match prov.get_gpu_data(&uuid, "name") {
1424-
Ok(gpu_name) => {
1425-
// Create new GpuPage object and Add to list of pages
1426-
self.create_gpu_page(&uuid, &gpu_name, prov);
1427-
},
1428-
Err(err) => {
1429-
println!("..Attempt to read GPU name failed, returning: {}", err);
1413+
// Check provider type in settings
1414+
let provider_type: i32 = self.get_setting::<i32>("provider");
14301415

1431-
// Create new GpuPage object and Add to list of pages
1432-
self.create_gpu_page(&uuid, &uuid, prov);
1416+
// If type has been changed, update provider
1417+
if existing_provider.property::<i32>("provider_type") != provider_type {
1418+
// Create new provider
1419+
let new_provider_container: Option<Provider> =
1420+
Some(self.create_provider(provider_type));
1421+
self.provider.set(new_provider_container.clone());
1422+
1423+
// Using the new provider
1424+
match new_provider_container {
1425+
Some(new_provider) => {
1426+
// Update GPU list
1427+
match new_provider.get_gpu_uuids() {
1428+
Ok(gpu_uuids) => {
1429+
// Construct a row for each GPU
1430+
for uuid in gpu_uuids {
1431+
// Grab current provider
1432+
let provider_container: Option<Provider> = self.provider.take();
1433+
self.provider.set(provider_container.clone());
1434+
1435+
// Get GPU data
1436+
match provider_container {
1437+
Some(prov) => match prov.get_gpu_data(&uuid, "name") {
1438+
Ok(gpu_name) => {
1439+
// Create new GpuPage object and Add to list of pages
1440+
self.create_gpu_page(&uuid, &gpu_name, prov);
1441+
},
1442+
Err(err) => {
1443+
println!("..Attempt to read GPU name failed, returning: {}", err);
1444+
1445+
// Create new GpuPage object and Add to list of pages
1446+
self.create_gpu_page(&uuid, &uuid, prov);
1447+
}
1448+
}
1449+
None => panic!("Something weird has happened! Cannot grab known existing provider.."),
1450+
}
1451+
}
1452+
}
1453+
Err(err) => {
1454+
println!("..Attempt to update GPU list failed, returning: {}", err)
1455+
}
1456+
}
1457+
}
1458+
None => todo!(),
1459+
}
1460+
} else{
1461+
// Update GPU list
1462+
match existing_provider.get_gpu_uuids() {
1463+
Ok(gpu_uuids) => {
1464+
// Construct a row for each GPU
1465+
for uuid in gpu_uuids {
1466+
// Grab current provider
1467+
let provider_container: Option<Provider> = self.provider.take();
1468+
self.provider.set(provider_container.clone());
1469+
// Get GPU data
1470+
match provider_container {
1471+
Some(prov) => match prov.get_gpu_data(&uuid, "name") {
1472+
Ok(gpu_name) => {
1473+
// Create new GpuPage object and Add to list of pages
1474+
self.create_gpu_page(&uuid, &gpu_name, prov);
1475+
},
1476+
Err(err) => {
1477+
println!("..Attempt to read GPU name failed, returning: {}", err);
1478+
1479+
// Create new GpuPage object and Add to list of pages
1480+
self.create_gpu_page(&uuid, &uuid, prov);
1481+
}
14331482
}
1483+
None => panic!("Something weird has happened! Cannot grab known existing provider.."),
14341484
}
1435-
None => panic!("Something weird has happened! Cannot grab known existing provider.."),
14361485
}
14371486
}
1487+
Err(err) => println!("..Attempt to update GPU list failed, returning: {}", err),
14381488
}
1439-
Err(err) => println!("..Attempt to update GPU list failed, returning: {}", err),
14401489
}
14411490
}
14421491
// If provider does not exist
@@ -1488,6 +1537,63 @@ impl MainWindow {
14881537
}
14891538
}
14901539
}
1540+
1541+
/*
1542+
// Load refresh time (s) from settings
1543+
let refresh_rate: u32 = self.get_setting::<i32>("refreshrate") as u32;
1544+
1545+
// Create thread safe container for provider
1546+
// Grab copy of current provider
1547+
let provider_container: Option<Provider> = self.provider.take();
1548+
self.provider.set(provider_container.clone());
1549+
let provider_store: Arc<Mutex<Option<Provider>>> = Arc::new(Mutex::new(provider_container));
1550+
1551+
// Wrapper around `NonNull<RawType>` that just implements `Send`
1552+
struct WrappedPointer(Settings);
1553+
unsafe impl Send for WrappedPointer {}
1554+
// Safe wrapper around `WrappedPointer` that gives access to the pointer
1555+
// only with the mutex locked.
1556+
struct SafeType {
1557+
inner: Mutex<WrappedPointer>,
1558+
}
1559+
let settings_store: SafeType = SafeType
1560+
{
1561+
inner: Mutex::new(WrappedPointer(self.settings.get().expect("").to_owned()))
1562+
};
1563+
1564+
// Async check for provider changes
1565+
//glib::timeout_add_seconds(refresh_rate, clone!(@strong self as window => move || {
1566+
//glib::timeout_add_seconds(refresh_rate, clone!(@strong settings_store as window => move || {
1567+
glib::timeout_add_seconds_local(refresh_rate, move || {
1568+
// Grab locked data
1569+
// settings object
1570+
let settings_container: MutexGuard<WrappedPointer> = settings_store.inner.lock().unwrap();
1571+
// current provider for scanning gpu data
1572+
let provider_lock: Arc<Mutex<Option<Provider>>> = Arc::clone(&provider_store);
1573+
let mut provider_container: MutexGuard<Option<Provider>> = provider_lock.lock().unwrap();
1574+
1575+
1576+
// Check provider type in settings
1577+
let provider_type: i32 = settings_container.0.get("provider");
1578+
1579+
// If type has been changed, update provider
1580+
match &mut *provider_container {
1581+
Some(prov) => {
1582+
if prov.property::<i32>("provider_type") != provider_type {
1583+
//
1584+
}
1585+
}
1586+
None => todo!(),
1587+
}
1588+
1589+
Continue(true)
1590+
});
1591+
*/
1592+
}
1593+
1594+
fn update_prov(&'static self) {
1595+
//
1596+
println!("FUCKER");
14911597
}
14921598
}
14931599

0 commit comments

Comments
 (0)