qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Qemu-devel] [PATCH 5/5] trace-cmd: Use polling function


From: Yoshihiro YUNOMAE
Subject: [Qemu-devel] [PATCH 5/5] trace-cmd: Use polling function
Date: Wed, 22 Aug 2012 17:43:43 +0900
User-agent: StGIT/0.14.3

Use poll() for avoiding a busy loop to read trace data of a guest from FIFO.

Signed-off-by: Yoshihiro YUNOMAE <address@hidden>
---

 trace-recorder.c |   42 ++++++++++++++++++++++++++++++++++++------
 1 files changed, 36 insertions(+), 6 deletions(-)

diff --git a/trace-recorder.c b/trace-recorder.c
index 6577fe8..bdf9798 100644
--- a/trace-recorder.c
+++ b/trace-recorder.c
@@ -34,9 +34,12 @@
 #include <ctype.h>
 #include <errno.h>
 #include <stdbool.h>
+#include <poll.h>
 
 #include "trace-cmd.h"
 
+#define WAIT_MSEC 1
+
 struct tracecmd_recorder {
        int             fd;
        int             trace_fd;
@@ -235,9 +238,37 @@ static void stop_operation_to_trace_agent(int ctl_fd)
        operation_to_trace_agent(ctl_fd, false);
 }
 
-int tracecmd_start_recording(struct tracecmd_recorder *recorder, unsigned long 
sleep)
+static int wait_data(struct tracecmd_recorder *recorder, unsigned long sleep)
 {
+       struct pollfd poll_fd;
        struct timespec req;
+       int ret = 0;
+
+       if (recorder->agent_existing) {
+               poll_fd.fd = recorder->trace_fd;
+               poll_fd.events = POLLIN;
+               while (1) {
+                       ret = poll(&poll_fd, 1, WAIT_MSEC);
+
+                       if(ret < 0) {
+                               warning("polling error");
+                               return ret;
+                       }
+
+                       if (ret)
+                               break;
+               }
+       } else if (sleep) {
+               req.tv_sec = sleep / 1000000;
+               req.tv_nsec = (sleep % 1000000) * 1000;
+               nanosleep(&req, NULL);
+       }
+
+       return ret;
+}
+
+int tracecmd_start_recording(struct tracecmd_recorder *recorder, unsigned long 
sleep)
+{
        long ret;
 
        recorder->stop = 0;
@@ -246,11 +277,10 @@ int tracecmd_start_recording(struct tracecmd_recorder 
*recorder, unsigned long s
                run_operation_to_trace_agent(recorder->ctl_fd);
        
        do {
-               if (sleep) {
-                       req.tv_sec = sleep / 1000000;
-                       req.tv_nsec = (sleep % 1000000) * 1000;
-                       nanosleep(&req, NULL);
-               }
+               ret = wait_data(recorder, sleep);
+               if (ret < 0)
+                       return ret;
+
                ret = splice_data(recorder);
                if (ret < 0)
                        return ret;





reply via email to

[Prev in Thread] Current Thread [Next in Thread]