udevd: worker - introduce worker_attach_event()
authorTom Gundersen <teg@jklm.no>
Mon, 27 Apr 2015 09:33:41 +0000 (11:33 +0200)
committerTom Gundersen <teg@jklm.no>
Wed, 6 May 2015 16:35:55 +0000 (18:35 +0200)
src/udev/udevd.c

index f8dbe26..fafe397 100644 (file)
@@ -179,8 +179,7 @@ static int worker_new(struct worker **ret, struct udev *udev, struct udev_monito
         if (!worker)
                 return -ENOMEM;
 
-        /* worker + event reference */
-        worker->refcount = 2;
+        worker->refcount = 1;
         worker->udev = udev_ref(udev);
         /* close monitor, but keep address around */
         udev_monitor_disconnect(worker_monitor);
@@ -194,6 +193,15 @@ static int worker_new(struct worker **ret, struct udev *udev, struct udev_monito
         return 0;
 }
 
+static void worker_attach_event(struct worker *worker, struct event *event) {
+        worker->state = WORKER_RUNNING;
+        worker->event_start_usec = now(CLOCK_MONOTONIC);
+        worker->event_warned = false;
+        worker->event = event;
+        event->state = EVENT_RUNNING;
+        worker_ref(worker);
+}
+
 static void worker_spawn(struct event *event) {
         struct udev *udev = event->udev;
         _cleanup_udev_monitor_unref_ struct udev_monitor *worker_monitor = NULL;
@@ -418,11 +426,8 @@ out:
                 if (r < 0)
                         return;
 
-                worker->state = WORKER_RUNNING;
-                worker->event_start_usec = now(CLOCK_MONOTONIC);
-                worker->event_warned = false;
-                worker->event = event;
-                event->state = EVENT_RUNNING;
+                worker_attach_event(worker, event);
+
                 log_debug("seq %llu forked new worker ["PID_FMT"]", udev_device_get_seqnum(event->dev), pid);
                 break;
         }
@@ -447,12 +452,7 @@ static void event_run(struct event *event) {
                         worker->state = WORKER_KILLED;
                         continue;
                 }
-                worker_ref(worker);
-                worker->event = event;
-                worker->state = WORKER_RUNNING;
-                worker->event_start_usec = now(CLOCK_MONOTONIC);
-                worker->event_warned = false;
-                event->state = EVENT_RUNNING;
+                worker_attach_event(worker, event);
                 return;
         }