- /* fail event, if worker died unexpectedly */
- if (worker->event != NULL) {
- int exitcode;
-
- if (WIFEXITED(status))
- exitcode = WEXITSTATUS(status);
- else if (WIFSIGNALED(status))
- exitcode = WTERMSIG(status) + 128;
- else
- exitcode = 0;
- worker->event->exitcode = exitcode;
- err(udev, "worker [%u] unexpectedly returned with %i\n", pid, exitcode);
- event_queue_delete(worker->event);
+ info(udev, "worker [%u] exit\n", pid);
+ if (!WIFEXITED(status) || WEXITSTATUS(status) != 0) {
+ err(udev, "worker [%u] unexpectedly returned with status 0x%04x\n", pid, status);
+ if (worker->event != NULL) {
+ err(udev, "worker [%u] failed while handling '%s'\n", pid, worker->event->devpath);
+ worker->event->exitcode = -32;
+ event_queue_delete(worker->event);
+ /* drop reference from running event */
+ worker_unref(worker);
+ }