static int aio_io(struct aiocb *iocb, int (*sysfunc)(struct aiocb *iocb)) { struct sigev_node *sn; struct sigevent saved_ev; int ret, err; if (iocb->aio_sigevent.sigev_notify != SIGEV_THREAD) { ret = sysfunc(iocb); return (ret); } ret = aio_sigev_alloc(iocb, &sn, &saved_ev); if (ret) return (ret); ret = sysfunc(iocb); iocb->aio_sigevent = saved_ev; if (ret != 0) { err = errno; __sigev_list_lock(); __sigev_delete_node(sn); __sigev_list_unlock(); errno = err; } return (ret); }
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); }
int __mq_close(mqd_t mqd) { int h; if (mqd->node != NULL) { __sigev_list_lock(); __sigev_delete_node(mqd->node); __sigev_list_unlock(); } h = mqd->oshandle; free(mqd); return (__sys_close(h)); }
int __timer_delete(timer_t timerid) { int ret, err; if (timerid->node != NULL) { __sigev_list_lock(); __sigev_delete_node(timerid->node); __sigev_list_unlock(); } ret = __sys_ktimer_delete(timerid->oshandle); err = errno; free(timerid); errno = err; return (ret); }
int __aio_fsync(int op, struct aiocb *iocb) { struct sigev_node *sn; struct sigevent saved_ev; int ret, err; if (iocb->aio_sigevent.sigev_notify != SIGEV_THREAD) return __sys_aio_fsync(op, iocb); ret = aio_sigev_alloc(iocb, &sn, &saved_ev); if (ret) return (ret); ret = __sys_aio_fsync(op, iocb); iocb->aio_sigevent = saved_ev; if (ret != 0) { err = errno; __sigev_list_lock(); __sigev_delete_node(sn); __sigev_list_unlock(); errno = err; } return (ret); }