Lines Matching refs:worker

91         struct worker *worker;
118 struct worker {
128 /* passed from worker to main process */
140 if (event->worker)
141 event->worker->event = NULL;
146 static void worker_free(struct worker *worker) {
147 if (!worker)
150 hashmap_remove(workers, UINT_TO_PTR(worker->pid));
151 udev_monitor_unref(worker->monitor);
152 udev_unref(worker->udev);
153 event_free(worker->event);
155 free(worker);
159 struct worker *worker;
162 HASHMAP_FOREACH(worker, workers, i)
163 worker_free(worker);
169 static int worker_new(struct worker **ret, struct udev *udev, struct udev_monitor *worker_monitor, pid_t pid) {
170 _cleanup_free_ struct worker *worker = NULL;
178 worker = new0(struct worker, 1);
179 if (!worker)
182 worker->refcount = 1;
183 worker->udev = udev_ref(udev);
186 worker->monitor = udev_monitor_ref(worker_monitor);
187 worker->pid = pid;
193 r = hashmap_put(workers, UINT_TO_PTR(pid), worker);
197 *ret = worker;
198 worker = NULL;
203 static void worker_attach_event(struct worker *worker, struct event *event) {
204 assert(worker);
206 assert(!event->worker);
207 assert(!worker->event);
209 worker->state = WORKER_RUNNING;
210 worker->event = event;
214 event->worker = worker;
232 /* allow the main daemon netlink address to send devices to the worker */
428 struct worker *worker;
431 r = worker_new(&worker, udev, worker_monitor, pid);
435 worker_attach_event(worker, event);
437 log_debug("seq %llu forked new worker ["PID_FMT"]", udev_device_get_seqnum(event->dev), pid);
444 struct worker *worker;
447 HASHMAP_FOREACH(worker, workers, i) {
450 if (worker->state != WORKER_IDLE)
453 count = udev_monitor_send_device(monitor, worker->monitor, event->dev);
455 log_error_errno(errno, "worker ["PID_FMT"] did not accept message %zi (%m), kill it",
456 worker->pid, count);
457 kill(worker->pid, SIGKILL);
458 worker->state = WORKER_KILLED;
461 worker_attach_event(worker, event);
471 /* start new worker and pass initial device */
503 struct worker *worker;
506 HASHMAP_FOREACH(worker, workers, i) {
507 if (worker->state == WORKER_KILLED)
510 worker->state = WORKER_KILLED;
511 kill(worker->pid, SIGTERM);
629 struct worker *worker;
652 log_warning_errno(EIO, "ignoring worker message with invalid size %zi bytes", size);
664 log_warning_errno(EIO, "ignoring worker message without valid PID");
668 /* lookup worker who sent the signal */
669 worker = hashmap_get(workers, UINT_TO_PTR(ucred->pid));
670 if (!worker) {
671 log_debug("worker ["PID_FMT"] returned, but is no longer tracked", ucred->pid);
675 if (worker->state != WORKER_KILLED)
676 worker->state = WORKER_IDLE;
678 /* worker returned */
679 event_free(worker->event);
933 struct worker *worker;
939 worker = hashmap_get(workers, UINT_TO_PTR(pid));
940 if (!worker) {
941 log_warning("worker ["PID_FMT"] is unknown, ignoring", pid);
947 log_debug("worker ["PID_FMT"] exited", pid);
949 log_warning("worker ["PID_FMT"] exited with return code %i", pid, WEXITSTATUS(status));
951 log_warning("worker ["PID_FMT"] terminated by signal %i (%s)",
954 log_info("worker ["PID_FMT"] stopped", pid);
957 log_info("worker ["PID_FMT"] continued", pid);
960 log_warning("worker ["PID_FMT"] exit with status 0x%04x", pid, status);
964 if (worker->event) {
965 log_error("worker ["PID_FMT"] failed while handling '%s'", pid, worker->event->devpath);
967 udev_device_delete_db(worker->event->dev);
968 udev_device_tag_index(worker->event->dev, NULL, false);
970 udev_monitor_send_device(monitor, NULL, worker->event->dev_kernel);
974 worker_free(worker);
1410 struct worker *worker;
1426 HASHMAP_FOREACH(worker, workers, j) {
1427 struct event *event = worker->event;
1430 if (worker->state != WORKER_RUNNING)
1439 log_error("worker ["PID_FMT"] %s timeout; kill it", worker->pid, event->devpath);
1440 kill(worker->pid, SIGKILL);
1441 worker->state = WORKER_KILLED;
1445 log_warning("worker ["PID_FMT"] %s is taking a long time", worker->pid, event->devpath);