From 667dfdfea7441f2b7cf0d36f6ac7965b27dc768d Mon Sep 17 00:00:00 2001 From: Chris Smowton Date: Wed, 18 Nov 2009 12:49:12 -0500 Subject: [PATCH] LTTV trace control bug fix Chris Smowton : ...whenever I tried to start a trace using the GUI, it would freeze consuming 100% CPU after I clicked "start". Turned out this was because in tracecontrol.c's start_clicked callback, you poll(2) on an FD and use a switch() statement to handle its return. Unfortunately, poll(2) doesn't work that way -- it returns a *mask* of bits, not a single value. Here poll was returning POLLIN | POLLHUP to indicate there's data ready and the FD has been closed by the other side, and since this != POLLIN and != POLLHUP, the poll loop spins forever. Attached is a patch to be applied to tracecontrol.c which fixes it to check for set-bits instead. It's still strictly broken, as the read(fd, buf, 256) call might not fully drain the child's output, but it's a step in the right direction and means I can at least use the trace-control thing. Signed-off-by: Mathieu Desnoyers --- lttv/modules/gui/tracecontrol/tracecontrol.c | 97 ++++++++++---------- 1 file changed, 51 insertions(+), 46 deletions(-) diff --git a/lttv/modules/gui/tracecontrol/tracecontrol.c b/lttv/modules/gui/tracecontrol/tracecontrol.c index 28e66556..283674b7 100644 --- a/lttv/modules/gui/tracecontrol/tracecontrol.c +++ b/lttv/modules/gui/tracecontrol/tracecontrol.c @@ -513,56 +513,61 @@ static int execute_command(const gchar *command, const gchar *username, /* Timeout : Stop waiting for chars */ if(num_rdy == 0) goto wait_child; - switch(pollfd.revents) { - case POLLERR: + /* Check for fatal errors */ + if(pollfd.revents & POLLERR) { g_warning("Error returned in polling fd\n"); num_hup++; - break; - case POLLHUP: - g_info("Polling FD : hung up."); - num_hup++; - break; - case POLLNVAL: - g_warning("Polling fd tells it is not open"); - num_hup++; - break; - case POLLPRI: - case POLLIN: - count = read (fdpty, buf, 256); - if(count > 0) { - unsigned int i; - buf[count] = '\0'; - g_printf("%s", buf); - for(i=0; i 0) { + unsigned int i; + buf[count] = '\0'; + g_printf("%s", buf); + for(i=0; i 0) { - g_warning("Child hung up too fast"); + g_warning("Child hung up without returning a full reply"); goto wait_child; } } -- 2.34.1