Jakub Filak 295a36
From c12b430997567f3d68ec8e7ba76674f20c27441b Mon Sep 17 00:00:00 2001
Jakub Filak 295a36
From: Jakub Filak <jfilak@redhat.com>
Jakub Filak 295a36
Date: Fri, 7 Feb 2014 17:54:14 +0100
Jakub Filak 295a36
Subject: [ABRT PATCH 11/11] upload-watch: remove busy-wait for SIGUSR1
Jakub Filak 295a36
Jakub Filak 295a36
Unconditional checking of SIGUSR1 flag in the idle source of main loop
Jakub Filak 295a36
causes 100% CPU usage.
Jakub Filak 295a36
Jakub Filak 295a36
hanle_sigusr() function and got_sigusr flag are not necessary because
Jakub Filak 295a36
abrt-upload-watch already implements signal handling based on usage of
Jakub Filak 295a36
GIO Channels.
Jakub Filak 295a36
Jakub Filak 295a36
Closes rhbz#1060020
Jakub Filak 295a36
Jakub Filak 295a36
Signed-off-by: Jakub Filak <jfilak@redhat.com>
Jakub Filak 295a36
---
Jakub Filak 295a36
 src/daemon/abrt-upload-watch.c | 37 +++++++++----------------------------
Jakub Filak 295a36
 1 file changed, 9 insertions(+), 28 deletions(-)
Jakub Filak 295a36
Jakub Filak 295a36
diff --git a/src/daemon/abrt-upload-watch.c b/src/daemon/abrt-upload-watch.c
Jakub Filak 295a36
index 59bfbe4..a42b285 100644
Jakub Filak 295a36
--- a/src/daemon/abrt-upload-watch.c
Jakub Filak 295a36
+++ b/src/daemon/abrt-upload-watch.c
Jakub Filak 295a36
@@ -27,7 +27,6 @@
Jakub Filak 295a36
 #define DEFAULT_CACHE_MIB_SIZE 4
Jakub Filak 295a36
 
Jakub Filak 295a36
 static int g_signal_pipe[2];
Jakub Filak 295a36
-static sig_atomic_t got_sigusr;
Jakub Filak 295a36
 
Jakub Filak 295a36
 struct queue
Jakub Filak 295a36
 {
Jakub Filak 295a36
@@ -122,24 +121,11 @@ handle_new_path(struct process *proc, char *name)
Jakub Filak 295a36
     }
Jakub Filak 295a36
 }
Jakub Filak 295a36
 
Jakub Filak 295a36
-static gboolean
Jakub Filak 295a36
+static void
Jakub Filak 295a36
 print_stats(struct process *proc)
Jakub Filak 295a36
 {
Jakub Filak 295a36
-    /* there is a race, because we run this function from 2 different places
Jakub Filak 295a36
-     * 1st when a child dies
Jakub Filak 295a36
-     * 2nd as idle source from mainloop
Jakub Filak 295a36
-     * if it happens the stats will be printed twice, which I think
Jakub Filak 295a36
-     * is not a big deal, because it's only for debug and tests
Jakub Filak 295a36
-     */
Jakub Filak 295a36
-    if (got_sigusr == 1)
Jakub Filak 295a36
-    {
Jakub Filak 295a36
-        got_sigusr = 0;
Jakub Filak 295a36
-        /* this is meant only for debugging, so not marking it as translatable */
Jakub Filak 295a36
-        fprintf(stderr, "%i archives to process, %i active workers\n", g_queue_get_length(&proc->queue.q), proc->children);
Jakub Filak 295a36
-    }
Jakub Filak 295a36
-
Jakub Filak 295a36
-    /* don't remove this source from glib */
Jakub Filak 295a36
-    return true;
Jakub Filak 295a36
+    /* this is meant only for debugging, so not marking it as translatable */
Jakub Filak 295a36
+    fprintf(stderr, "%i archives to process, %i active workers\n", g_queue_get_length(&proc->queue.q), proc->children);
Jakub Filak 295a36
 }
Jakub Filak 295a36
 
Jakub Filak 295a36
 static void
Jakub Filak 295a36
@@ -157,13 +143,6 @@ process_next_in_queue(struct process *proc)
Jakub Filak 295a36
 }
Jakub Filak 295a36
 
Jakub Filak 295a36
 static void
Jakub Filak 295a36
-handle_sigusr(int signo)
Jakub Filak 295a36
-{
Jakub Filak 295a36
-    /* just set the flag and process it synchronously */
Jakub Filak 295a36
-    got_sigusr = 1;
Jakub Filak 295a36
-}
Jakub Filak 295a36
-
Jakub Filak 295a36
-static void
Jakub Filak 295a36
 handle_signal(int signo)
Jakub Filak 295a36
 {
Jakub Filak 295a36
     int save_errno = errno;
Jakub Filak 295a36
@@ -200,7 +179,11 @@ handle_signal_pipe_cb(GIOChannel *gio, GIOCondition condition, gpointer user_dat
Jakub Filak 295a36
         {
Jakub Filak 295a36
             /* we did receive a signal */
Jakub Filak 295a36
             log_debug("Got signal %d through signal pipe", signals[signo]);
Jakub Filak 295a36
-            if (signals[signo] != SIGCHLD)
Jakub Filak 295a36
+            if (signals[signo] == SIGUSR1)
Jakub Filak 295a36
+            {
Jakub Filak 295a36
+                print_stats(proc);
Jakub Filak 295a36
+            }
Jakub Filak 295a36
+            else if (signals[signo] != SIGCHLD)
Jakub Filak 295a36
             {
Jakub Filak 295a36
                 process_quit(proc);
Jakub Filak 295a36
                 return FALSE; /* remove this event */
Jakub Filak 295a36
@@ -363,7 +346,7 @@ main(int argc, char **argv)
Jakub Filak 295a36
     close_on_exec_on(g_signal_pipe[1]);
Jakub Filak 295a36
     ndelay_on(g_signal_pipe[0]);
Jakub Filak 295a36
     ndelay_on(g_signal_pipe[1]);
Jakub Filak 295a36
-    signal(SIGUSR1, handle_sigusr);
Jakub Filak 295a36
+    signal(SIGUSR1, handle_signal);
Jakub Filak 295a36
     signal(SIGTERM, handle_signal);
Jakub Filak 295a36
     signal(SIGINT, handle_signal);
Jakub Filak 295a36
     signal(SIGCHLD, handle_signal);
Jakub Filak 295a36
@@ -373,7 +356,6 @@ main(int argc, char **argv)
Jakub Filak 295a36
                 handle_signal_pipe_cb,
Jakub Filak 295a36
                 &proc;;
Jakub Filak 295a36
 
Jakub Filak 295a36
-    int status_callback_source_id = g_idle_add((GSourceFunc)print_stats, &proc;;
Jakub Filak 295a36
     log_info("Starting glib main loop");
Jakub Filak 295a36
 
Jakub Filak 295a36
     g_main_loop_run(proc.main_loop);
Jakub Filak 295a36
@@ -381,7 +363,6 @@ main(int argc, char **argv)
Jakub Filak 295a36
     log_info("Glib main loop finished");
Jakub Filak 295a36
 
Jakub Filak 295a36
     g_source_remove(channel_signal_source_id);
Jakub Filak 295a36
-    g_source_remove(status_callback_source_id);
Jakub Filak 295a36
 
Jakub Filak 295a36
     GError *error = NULL;
Jakub Filak 295a36
     g_io_channel_shutdown(channel_signal, FALSE, &error);
Jakub Filak 295a36
-- 
Jakub Filak 295a36
1.8.3.1
Jakub Filak 295a36