udevd: worker - only allocate the worker struct in the main process
This is not used in the worker, so avoid having to free it there.
This commit is contained in:
parent
f96a5160c4
commit
e03c7cc26e
|
@ -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) {
|
||||
|
|
Loading…
Reference in a new issue