static void *worker(void *_dummy) { worker_cleanup_t wc; pth_msgport_t mp; pth_event_t ev; struct query *q; int i; fprintf(stderr, "worker: start\n"); wc.mp = mp = pth_msgport_create("worker"); wc.ev = ev = pth_event(PTH_EVENT_MSG, mp); pth_cleanup_push(worker_cleanup, &wc); for (;;) { if ((i = pth_wait(ev)) != 1) continue; while ((q = (struct query *)pth_msgport_get(mp)) != NULL) { fprintf(stderr, "worker: recv query <%s>\n", q->string); for (i = 0; q->string[i] != NUL; i++) q->string[i] = toupper(q->string[i]); fprintf(stderr, "worker: send reply <%s>\n", q->string); pth_msgport_reply((pth_message_t *)q); } } return NULL; }
static void *child(void *_arg) { sigset_t sigs; char *name = (char *)_arg; int i; fprintf(stderr, "%s: enter\n", name); /* establish cleanup handler */ pth_cleanup_push(child_cleanup, name); /* block different types of signals */ pth_sigmask(SIG_SETMASK, NULL, &sigs); sigaddset(&sigs, SIGINT); if (strcmp(name, "child1") == 0) { sigaddset(&sigs, SIGUSR1); sigdelset(&sigs, SIGUSR2); } else { sigdelset(&sigs, SIGUSR1); sigaddset(&sigs, SIGUSR2); } pth_sigmask(SIG_SETMASK, &sigs, NULL); /* do a little bit of processing and show signal states */ for (i = 0; i < 10; i++) { pth_sigmask(SIG_SETMASK, NULL, &sigs); fprintf(stderr, "%s: SIGUSR1: %s\n", name, sigismember(&sigs, SIGUSR1) ? "blocked" : "unblocked"); fprintf(stderr, "%s: SIGUSR2: %s\n", name, sigismember(&sigs, SIGUSR2) ? "blocked" : "unblocked"); fprintf(stderr, "%s: leave to scheduler\n", name); pth_sleep(1); fprintf(stderr, "%s: reentered from scheduler\n", name); } fprintf(stderr, "%s: leave\n", name); return NULL; }