static int aio_sigev_alloc(struct aiocb *iocb, struct sigev_node **sn, struct sigevent *saved_ev) { if (__sigev_check_init()) { /* This might be that thread library is not enabled. */ errno = EINVAL; return (-1); } *sn = __sigev_alloc(SI_ASYNCIO, &iocb->aio_sigevent, NULL, 1); if (*sn == NULL) { errno = EAGAIN; return (-1); } *saved_ev = iocb->aio_sigevent; (*sn)->sn_id = (sigev_id_t)iocb; __sigev_get_sigevent(*sn, &iocb->aio_sigevent, (*sn)->sn_id); (*sn)->sn_dispatch = aio_dispatch; __sigev_list_lock(); __sigev_register(*sn); __sigev_list_unlock(); return (0); }
int __timer_create(clockid_t clockid, struct sigevent *evp, timer_t *timerid) { struct __timer *timer; struct sigevent ev; struct sigev_node *sn; int ret, err; timer = malloc(sizeof(struct __timer)); if (timer == NULL) return (-1); if (evp == NULL || evp->sigev_notify != SIGEV_THREAD) { ret = __sys_ktimer_create(clockid, evp, &timer->oshandle); if (ret == -1) { err = errno; free(timer); errno = err; return (ret); } timer->node = NULL; *timerid = timer; return (0); } if (__sigev_check_init()) { free(timer); errno = EINVAL; return (-1); } sn = __sigev_alloc(SI_TIMER, evp, NULL, 0); if (sn == NULL) { free(timer); errno = EAGAIN; return (-1); } __sigev_get_sigevent(sn, &ev, sn->sn_gen); ret = __sys_ktimer_create(clockid, &ev, &timer->oshandle); if (ret != 0) { err = errno; __sigev_free(sn); free(timer); errno = err; return (-1); } sn->sn_flags |= SNF_SYNC; sn->sn_dispatch = timer_dispatch; sn->sn_id = timer->oshandle; timer->node = sn; __sigev_list_lock(); __sigev_register(sn); __sigev_list_unlock(); *timerid = timer; return (0); }
int __mq_notify(mqd_t mqd, const struct sigevent *evp) { struct sigevent ev; struct sigev_node *sn; int ret; if (evp == NULL || evp->sigev_notify != SIGEV_THREAD) { if (mqd->node != NULL) { __sigev_list_lock(); __sigev_delete_node(mqd->node); mqd->node = NULL; __sigev_list_unlock(); } return __sys_kmq_notify(mqd->oshandle, evp); } if (__sigev_check_init()) { /* * Thread library is not enabled. */ errno = EINVAL; return (-1); } sn = __sigev_alloc(SI_MESGQ, evp, mqd->node, 1); if (sn == NULL) { errno = EAGAIN; return (-1); } sn->sn_id = mqd->oshandle; sn->sn_dispatch = mq_dispatch; __sigev_get_sigevent(sn, &ev, sn->sn_gen); __sigev_list_lock(); if (mqd->node != NULL) __sigev_delete_node(mqd->node); mqd->node = sn; __sigev_register(sn); ret = __sys_kmq_notify(mqd->oshandle, &ev); __sigev_list_unlock(); return (ret); }