]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
udevd: worker - only allocate the worker struct in the main process
authorTom Gundersen <teg@jklm.no>
Mon, 27 Apr 2015 09:11:58 +0000 (11:11 +0200)
committerTom Gundersen <teg@jklm.no>
Wed, 6 May 2015 16:35:55 +0000 (18:35 +0200)
This is not used in the worker, so avoid having to free it there.

src/udev/udevd.c

index 1eb7b779eba2789cc0339e81820b52c321b76c99..4ab3216ab7ab836ac8d9b7a2ff3ad6777a0f70a7 100644 (file)
@@ -168,7 +168,6 @@ static void worker_list_cleanup(struct udev *udev) {
 
 static void worker_spawn(struct event *event) {
         struct udev *udev = event->udev;
-        struct worker *worker;
         struct udev_monitor *worker_monitor;
         pid_t pid;
 
@@ -180,15 +179,6 @@ static void worker_spawn(struct event *event) {
         udev_monitor_allow_unicast_sender(worker_monitor, monitor);
         udev_monitor_enable_receiving(worker_monitor);
 
-        worker = new0(struct worker, 1);
-        if (worker == NULL) {
-                udev_monitor_unref(worker_monitor);
-                return;
-        }
-        /* worker + event reference */
-        worker->refcount = 2;
-        worker->udev = udev;
-
         pid = fork();
         switch (pid) {
         case 0: {
@@ -203,7 +193,6 @@ static void worker_spawn(struct event *event) {
                 dev = event->dev;
                 event->dev = NULL;
 
-                free(worker);
                 worker_list_cleanup(udev);
                 event_queue_cleanup(udev, EVENT_UNDEF);
                 udev_monitor_unref(monitor);
@@ -392,10 +381,21 @@ out:
         case -1:
                 udev_monitor_unref(worker_monitor);
                 event->state = EVENT_QUEUED;
-                free(worker);
                 log_error_errno(errno, "fork of child failed: %m");
                 break;
         default:
+        {
+                struct worker *worker;
+
+                worker = new0(struct worker, 1);
+                if (!worker) {
+                        udev_monitor_unref(worker_monitor);
+                        return;
+                }
+
+                /* worker + event reference */
+                worker->refcount = 2;
+                worker->udev = udev;
                 /* close monitor, but keep address around */
                 udev_monitor_disconnect(worker_monitor);
                 worker->monitor = worker_monitor;
@@ -410,6 +410,7 @@ out:
                 log_debug("seq %llu forked new worker ["PID_FMT"]", udev_device_get_seqnum(event->dev), pid);
                 break;
         }
+        }
 }
 
 static void event_run(struct event *event) {