UEventTime::UEventTime(long sec, long usec) : UTimeVal(sec, usec) { U_TRACE_REGISTER_OBJECT(0, UEventTime, "%ld,%ld", sec, usec) reset(); #ifdef USE_LIBEVENT if (u_ev_base == 0) u_ev_base = (struct event_base*) U_SYSCALL_NO_PARAM(event_init); U_INTERNAL_ASSERT_POINTER(u_ev_base) pevent = U_NEW(UTimerEv<UEventTime>(*this)); (void) UDispatcher::add(*pevent, *(UTimeVal*)this); #endif }
UEventTime::UEventTime(long sec, long micro_sec) : UTimeVal(sec, micro_sec) { U_TRACE_REGISTER_OBJECT(0, UEventTime, "%ld,%ld", sec, micro_sec) setTolerance(); xtime.tv_sec = xtime.tv_usec = 0L; #ifdef USE_LIBEVENT if (u_ev_base == 0) u_ev_base = (struct event_base*) U_SYSCALL_NO_PARAM(event_base_new); U_INTERNAL_ASSERT_POINTER(u_ev_base) U_NEW(UTimerEv<UEventTime>, pevent, UTimerEv<UEventTime>(*this)); (void) UDispatcher::add(*pevent, *(UTimeVal*)this); #endif }
void UThread::yield() { U_TRACE_NO_PARAM(1, "UThread::yield()") // Yields the current thread's CPU time slice to allow another thread to begin immediate execution U_INTERNAL_DUMP("cancel = %d", cancel) #ifdef HAVE_PTHREAD_CANCEL U_SYSCALL_VOID_NO_PARAM(pthread_testcancel); #elif !defined(_MSWINDOWS_) && !defined(__UNIKERNEL__) sigset_t old = 0; if (cancel != cancelInitial && cancel != cancelDisabled) { sigset_t scancel; # ifdef sigemptyset sigemptyset(&scancel); # else (void) U_SYSCALL(sigemptyset, "%p", &scancel); # endif # ifdef sigaddset sigaddset(&scancel, U_SIG_THREAD_CANCEL); # else (void) U_SYSCALL(sigaddset, "%p,%d", &scancel, U_SIG_THREAD_CANCEL); # endif (void) U_SYSCALL(pthread_sigmask, "%d,%p,%p", SIG_UNBLOCK, &scancel, &old); } #endif #ifdef HAVE_PTHREAD_YIELD (void) U_SYSCALL_NO_PARAM(pthread_yield); #endif #if !defined(HAVE_PTHREAD_CANCEL) && !defined(_MSWINDOWS_) && !defined(__UNIKERNEL__) if (old) (void) U_SYSCALL(pthread_sigmask, "%d,%p,%p", SIG_SETMASK, &old, 0); #endif }
void UThread::close() { U_TRACE_NO_PARAM(0, "UThread::close()") #ifdef _MSWINDOWS_ DWORD _tid = tid; #else pthread_t _tid = tid; #endif tid = 0; U_INTERNAL_DUMP("tid = %p first = %p next = %p", _tid, first, next) U_INTERNAL_ASSERT_POINTER(first) UThread* obj; UThread** ptr = &first; while ((obj = *ptr)) { U_INTERNAL_ASSERT_POINTER(obj) # ifdef _MSWINDOWS_ if (tid == obj->tid) # else if (pthread_equal(tid, obj->tid)) # endif { U_INTERNAL_ASSERT_EQUALS(this, obj) U_INTERNAL_ASSERT_EQUALS(next, obj->next) *ptr = next; next = 0; break; } ptr = &(*ptr)->next; } if (_tid) { # ifdef _MSWINDOWS_ // wait for real w32 thread to cleanup switch (cancel) { case cancelImmediate: TerminateThread((HANDLE)_tid, 0); break; default: SetEvent(cancellation); } (void) WaitForSingleObject((HANDLE)_tid, INFINITE); (void) U_SYSCALL(CloseHandle, "%p", cancellation); (void) U_SYSCALL(CloseHandle, "%p", (HANDLE)_tid); _endthreadex(0); # else # ifdef HAVE_PTHREAD_CANCEL (void) U_SYSCALL(pthread_cancel, "%p", _tid); # endif if (detachstate == PTHREAD_CREATE_JOINABLE) (void) U_SYSCALL(pthread_join, "%p,%p", _tid, 0); # ifdef HAVE_PTHREAD_YIELD else { (void) U_SYSCALL_NO_PARAM(pthread_yield); } # endif # endif } }