gardesk/gartop / 66abe14

Browse files

Fix netlink socket blocking by enabling non-blocking mode

Authored by mfwolffe <wolffemf@dukes.jmu.edu>
SHA
66abe14f1bfdfe285dd491d5f7086fb655878de0
Parents
7db950e
Tree
2bac2ec

1 changed file

StatusFile+-
M gartop/src/collector/socket.rs 17 3
gartop/src/collector/socket.rsmodified
@@ -120,6 +120,8 @@ impl SocketCollector {
120120
             let mut socket = Socket::new(NETLINK_SOCK_DIAG)?;
121121
             socket.bind_auto()?;
122122
             socket.connect(&SocketAddr::new(0, 0))?;
123
+            // Set non-blocking to prevent hanging on recv
124
+            socket.set_non_blocking(true)?;
123125
             self.nl_socket = Some(socket);
124126
         }
125127
         Ok(())
@@ -284,10 +286,19 @@ impl SocketCollector {
284286
             socket.send(&send_buf, 0)?;
285287
 
286288
             let mut recv_buf = vec![0u8; 65536];
287
-            loop {
289
+            let mut done = false;
290
+            let mut retries = 0;
291
+            const MAX_RETRIES: u32 = 100; // 100ms max wait
292
+
293
+            while !done && retries < MAX_RETRIES {
288294
                 let n = match socket.recv(&mut recv_buf, 0) {
289295
                     Ok(n) => n,
290
-                    Err(e) if e.kind() == io::ErrorKind::WouldBlock => break,
296
+                    Err(e) if e.kind() == io::ErrorKind::WouldBlock => {
297
+                        // Wait a bit for data to arrive
298
+                        retries += 1;
299
+                        std::thread::sleep(std::time::Duration::from_millis(1));
300
+                        continue;
301
+                    }
291302
                     Err(e) => return Err(e),
292303
                 };
293304
 
@@ -305,7 +316,10 @@ impl SocketCollector {
305316
                     offset += msg.header.length as usize;
306317
 
307318
                     match msg.payload {
308
-                        NetlinkPayload::Done(_) => break,
319
+                        NetlinkPayload::Done(_) => {
320
+                            done = true;
321
+                            break;
322
+                        }
309323
                         NetlinkPayload::Error(e) => {
310324
                             if e.code.is_some() {
311325
                                 return Err(io::Error::new(io::ErrorKind::Other, "netlink error"));