Lines Matching defs:worker

116         struct worker *worker;
143 struct worker {
153 /* passed from worker to main process */
170 if (event->worker)
171 event->worker->event = NULL;
187 static void worker_free(struct worker *worker) {
188 if (!worker)
191 assert(worker->manager);
193 hashmap_remove(worker->manager->workers, PID_TO_PTR(worker->pid));
194 udev_monitor_unref(worker->monitor);
195 event_free(worker->event);
197 free(worker);
201 struct worker *worker;
206 HASHMAP_FOREACH(worker, manager->workers, i)
207 worker_free(worker);
212 static int worker_new(struct worker **ret, Manager *manager, struct udev_monitor *worker_monitor, pid_t pid) {
213 _cleanup_free_ struct worker *worker = NULL;
221 worker = new0(struct worker, 1);
222 if (!worker)
225 worker->refcount = 1;
226 worker->manager = manager;
229 worker->monitor = udev_monitor_ref(worker_monitor);
230 worker->pid = pid;
236 r = hashmap_put(manager->workers, PID_TO_PTR(pid), worker);
240 *ret = worker;
241 worker = NULL;
250 assert(event->worker);
252 kill_and_sigcont(event->worker->pid, SIGKILL);
253 event->worker->state = WORKER_KILLED;
270 static void worker_attach_event(struct worker *worker, struct event *event) {
274 assert(worker);
275 assert(worker->manager);
277 assert(!event->worker);
278 assert(!worker->event);
280 worker->state = WORKER_RUNNING;
281 worker->event = event;
283 event->worker = worker;
285 e = worker->manager->event;
342 /* allow the main daemon netlink address to send devices to the worker */
346 log_error_errno(r, "worker: could not enable receiving of device: %m");
538 struct worker *worker;
540 r = worker_new(&worker, manager, worker_monitor, pid);
544 worker_attach_event(worker, event);
546 log_debug("seq %llu forked new worker ["PID_FMT"]", udev_device_get_seqnum(event->dev), pid);
553 struct worker *worker;
559 HASHMAP_FOREACH(worker, manager->workers, i) {
562 if (worker->state != WORKER_IDLE)
565 count = udev_monitor_send_device(manager->monitor, worker->monitor, event->dev);
567 log_error_errno(errno, "worker ["PID_FMT"] did not accept message %zi (%m), kill it",
568 worker->pid, count);
569 kill(worker->pid, SIGKILL);
570 worker->state = WORKER_KILLED;
573 worker_attach_event(worker, event);
583 /* start new worker and pass initial device */
634 struct worker *worker;
639 HASHMAP_FOREACH(worker, manager->workers, i) {
640 if (worker->state == WORKER_KILLED)
643 worker->state = WORKER_KILLED;
644 kill(worker->pid, SIGTERM);
864 struct worker *worker;
876 log_warning_errno(EIO, "ignoring worker message with invalid size %zi bytes", size);
888 log_warning_errno(EIO, "ignoring worker message without valid PID");
892 /* lookup worker who sent the signal */
893 worker = hashmap_get(manager->workers, PID_TO_PTR(ucred->pid));
894 if (!worker) {
895 log_debug("worker ["PID_FMT"] returned, but is no longer tracked", ucred->pid);
899 if (worker->state != WORKER_KILLED)
900 worker->state = WORKER_IDLE;
902 /* worker returned */
903 event_free(worker->event);
1191 struct worker *worker;
1197 worker = hashmap_get(manager->workers, PID_TO_PTR(pid));
1198 if (!worker) {
1199 log_warning("worker ["PID_FMT"] is unknown, ignoring", pid);
1205 log_debug("worker ["PID_FMT"] exited", pid);
1207 log_warning("worker ["PID_FMT"] exited with return code %i", pid, WEXITSTATUS(status));
1209 log_warning("worker ["PID_FMT"] terminated by signal %i (%s)", pid, WTERMSIG(status), strsignal(WTERMSIG(status)));
1211 log_info("worker ["PID_FMT"] stopped", pid);
1214 log_info("worker ["PID_FMT"] continued", pid);
1217 log_warning("worker ["PID_FMT"] exit with status 0x%04x", pid, status);
1220 if (worker->event) {
1221 log_error("worker ["PID_FMT"] failed while handling '%s'", pid, worker->event->devpath);
1223 udev_device_delete_db(worker->event->dev);
1224 udev_device_tag_index(worker->event->dev, NULL, false);
1226 udev_monitor_send_device(manager->monitor, NULL, worker->event->dev_kernel);
1230 worker_free(worker);
1604 return log_error_errno(r, "error creating worker event source: %m");