static NTSTATUS InitEventThread( PEPOLL_POOL pPool, PLW_THREAD_POOL_ATTRIBUTES pAttrs, PEPOLL_THREAD pThread, ULONG ulCpu ) { NTSTATUS status = STATUS_SUCCESS; struct epoll_event event; pthread_attr_t threadAttr; BOOLEAN bThreadAttrInit = FALSE; status = LwErrnoToNtStatus(pthread_attr_init(&threadAttr)); GOTO_ERROR_ON_STATUS(status); bThreadAttrInit = TRUE; pThread->pPool = pPool; status = LwErrnoToNtStatus(pthread_mutex_init(&pThread->Lock, NULL)); GOTO_ERROR_ON_STATUS(status); status = LwErrnoToNtStatus(pthread_cond_init(&pThread->Event, NULL)); GOTO_ERROR_ON_STATUS(status); if (pipe(pThread->SignalFds) < 0) { status = LwErrnoToNtStatus(errno); GOTO_ERROR_ON_STATUS(status); } SetCloseOnExec(pThread->SignalFds[0]); SetCloseOnExec(pThread->SignalFds[1]); if ((pThread->EpollFd = epoll_create(MAX_EVENTS)) < 0) { status = LwErrnoToNtStatus(errno); GOTO_ERROR_ON_STATUS(status); } SetCloseOnExec(pThread->EpollFd); memset(&event, 0, sizeof(event)); /* Add signal fd to epoll set */ event.events = EPOLLIN; event.data.ptr = NULL; if (epoll_ctl(pThread->EpollFd, EPOLL_CTL_ADD, pThread->SignalFds[0], &event) < 0) { ABORT_ON_FATAL_ERRNO(errno); status = LwErrnoToNtStatus(errno); GOTO_ERROR_ON_STATUS(status); } RingInit(&pThread->Tasks); status = LwRtlSetAffinityThreadAttribute(&threadAttr, ulCpu); GOTO_ERROR_ON_STATUS(status); if (pAttrs && pAttrs->ulTaskThreadStackSize) { status = LwErrnoToNtStatus( pthread_attr_setstacksize(&threadAttr, pAttrs->ulTaskThreadStackSize)); GOTO_ERROR_ON_STATUS(status); } status = LwErrnoToNtStatus( pthread_create( &pThread->Thread, &threadAttr, EventThread, pThread)); GOTO_ERROR_ON_STATUS(status); error: if (bThreadAttrInit) { pthread_attr_destroy(&threadAttr); } return status; }
static NTSTATUS InitEventThread( PKQUEUE_POOL pPool, PLW_THREAD_POOL_ATTRIBUTES pAttrs, PKQUEUE_THREAD pThread, ULONG ulCpu ) { NTSTATUS status = STATUS_SUCCESS; struct kevent event; pthread_attr_t threadAttr; BOOLEAN bThreadAttrInit = FALSE; status = LwErrnoToNtStatus(pthread_attr_init(&threadAttr)); GOTO_ERROR_ON_STATUS(status); bThreadAttrInit = TRUE; pThread->pPool = pPool; status = LwErrnoToNtStatus(pthread_mutex_init(&pThread->Lock, NULL)); GOTO_ERROR_ON_STATUS(status); status = LwErrnoToNtStatus(pthread_cond_init(&pThread->Event, NULL)); GOTO_ERROR_ON_STATUS(status); if (pipe(pThread->SignalFds) < 0) { status = LwErrnoToNtStatus(errno); GOTO_ERROR_ON_STATUS(status); } SetCloseOnExec(pThread->SignalFds[0]); SetCloseOnExec(pThread->SignalFds[1]); if ((pThread->KqueueFd = kqueue()) < 0) { status = LwErrnoToNtStatus(errno); GOTO_ERROR_ON_STATUS(status); } SetCloseOnExec(pThread->KqueueFd); /* Add signal fd to kqueue set */ EV_SET(&event, pThread->SignalFds[0], EVFILT_READ, EV_ADD, 0, 0, NULL); if (kevent(pThread->KqueueFd, &event, 1, NULL, 0, NULL) < 0) { status = LwErrnoToNtStatus(errno); GOTO_ERROR_ON_STATUS(status); } RingInit(&pThread->Tasks); status = LwRtlSetAffinityThreadAttribute(&threadAttr, ulCpu); GOTO_ERROR_ON_STATUS(status); if (pAttrs && pAttrs->ulTaskThreadStackSize) { status = LwErrnoToNtStatus( pthread_attr_setstacksize(&threadAttr, pAttrs->ulTaskThreadStackSize)); GOTO_ERROR_ON_STATUS(status); } status = LwErrnoToNtStatus( pthread_create( &pThread->Thread, &threadAttr, EventThread, pThread)); GOTO_ERROR_ON_STATUS(status); error: if (bThreadAttrInit) { pthread_attr_destroy(&threadAttr); } return status; }