chiark / gitweb /
util, manager: and mempset() and use it
[elogind.git] / src / core / manager.c
index 91d773c2f6c9f1589e4adbcfd4c8b14bc4643e4d..8e66732cd7bf8c68347f6a307b10f37e1aea2246 100644 (file)
@@ -148,6 +148,9 @@ static int manager_setup_notify(Manager *m) {
 static int manager_jobs_in_progress_mod_timer(Manager *m) {
         struct itimerspec its;
 
+        if (m->jobs_in_progress_watch.type != WATCH_JOBS_IN_PROGRESS)
+                return 0;
+
         zero(its);
 
         its.it_value.tv_sec = JOBS_IN_PROGRESS_WAIT_SEC;
@@ -223,36 +226,26 @@ static void draw_cylon(char buffer[], size_t buflen, unsigned width, unsigned po
         assert(pos <= width+1); /* 0 or width+1 mean that the center light is behind the corner */
 
         if (pos > 1) {
-                if (pos > 2) {
-                        memset(p, ' ', pos-2);
-                        p += pos-2;
-                }
-                memcpy(p, ANSI_RED_ON, strlen(ANSI_RED_ON));
-                p += strlen(ANSI_RED_ON);
+                if (pos > 2)
+                        p = mempset(p, ' ', pos-2);
+                p = stpcpy(p, ANSI_RED_ON);
                 *p++ = '*';
         }
 
         if (pos > 0 && pos <= width) {
-                memcpy(p, ANSI_HIGHLIGHT_RED_ON, strlen(ANSI_HIGHLIGHT_RED_ON));
-                p += strlen(ANSI_HIGHLIGHT_RED_ON);
+                p = stpcpy(p, ANSI_HIGHLIGHT_RED_ON);
                 *p++ = '*';
         }
 
-        memcpy(p, ANSI_HIGHLIGHT_OFF, strlen(ANSI_HIGHLIGHT_OFF));
-        p += strlen(ANSI_HIGHLIGHT_OFF);
+        p = stpcpy(p, ANSI_HIGHLIGHT_OFF);
 
         if (pos < width) {
-                memcpy(p, ANSI_RED_ON, strlen(ANSI_RED_ON));
-                p += strlen(ANSI_RED_ON);
+                p = stpcpy(p, ANSI_RED_ON);
                 *p++ = '*';
-                if (pos < width-1) {
-                        memset(p, ' ', width-1-pos);
-                        p += width-1-pos;
-                }
-                memcpy(p, ANSI_HIGHLIGHT_OFF, strlen(ANSI_HIGHLIGHT_OFF));
-                p += strlen(ANSI_HIGHLIGHT_OFF);
+                if (pos < width-1)
+                        p = mempset(p, ' ', width-1-pos);
+                p = stpcpy(p, ANSI_HIGHLIGHT_OFF);
         }
-        *p = 0;
 }
 
 static void manager_print_jobs_in_progress(Manager *m) {
@@ -1144,7 +1137,7 @@ unsigned manager_dispatch_run_queue(Manager *m) {
 
         m->dispatching_run_queue = false;
 
-        if (hashmap_size(m->jobs) > 0)
+        if (m->n_running_jobs > 0)
                 manager_watch_jobs_in_progress(m);
 
         return n;
@@ -1674,6 +1667,8 @@ static int process_event(Manager *m, struct epoll_event *ev) {
                            NULL);
 
                 /* Restart the watch */
+                epoll_ctl(m->epoll_fd, EPOLL_CTL_DEL, m->time_change_watch.fd,
+                          NULL);
                 close_nointr_nofail(m->time_change_watch.fd);
                 watch_init(&m->time_change_watch);
                 manager_setup_time_change(m);
@@ -2368,6 +2363,9 @@ void manager_check_finished(Manager *m) {
 
         assert(m);
 
+        if (m->n_running_jobs == 0)
+                manager_unwatch_jobs_in_progress(m);
+
         if (hashmap_size(m->jobs) > 0) {
                 manager_jobs_in_progress_mod_timer(m);
                 return;
@@ -2379,8 +2377,6 @@ void manager_check_finished(Manager *m) {
         /* Turn off confirm spawn now */
         m->confirm_spawn = false;
 
-        manager_unwatch_jobs_in_progress(m);
-
         if (dual_timestamp_is_set(&m->finish_timestamp))
                 return;