void Thread::RunInThread( void * aArg ) { Thread* pThread = (Thread*) aArg; pThread->Lock(); pThread->m_bRunning = true; pThread->Unlock(); pThread->Run(); pThread->Lock(); pThread->m_bRunning = false; pThread->Unlock(); }
int32 _user_create_timer(clockid_t clockID, thread_id threadID, uint32 flags, const struct sigevent* userEvent, const thread_creation_attributes* userThreadAttributes) { // copy the sigevent structure from userland struct sigevent event; if (userEvent != NULL) { if (!IS_USER_ADDRESS(userEvent) || user_memcpy(&event, userEvent, sizeof(event)) != B_OK) { return B_BAD_ADDRESS; } } else { // none given -- use defaults event.sigev_notify = SIGEV_SIGNAL; event.sigev_signo = SIGALRM; } // copy thread creation attributes from userland, if specified char nameBuffer[B_OS_NAME_LENGTH]; ThreadCreationAttributes threadAttributes; if (event.sigev_notify == SIGEV_THREAD) { status_t error = threadAttributes.InitFromUserAttributes( userThreadAttributes, nameBuffer); if (error != B_OK) return error; } // get team and thread Team* team = thread_get_current_thread()->team; Thread* thread = NULL; if (threadID >= 0) { thread = Thread::GetAndLock(threadID); if (thread == NULL) return B_BAD_THREAD_ID; thread->Unlock(); } BReference<Thread> threadReference(thread, true); // create the timer return create_timer(clockID, -1, team, thread, flags, event, userThreadAttributes != NULL ? &threadAttributes : NULL, userEvent == NULL); }
bool Thread::EnterBlockingOperation(void) { Trace trace(__PRETTY_FUNCTION__); trace.EnterFunc(); ThreadRegistry *reg = SingletonObject<ThreadRegistry>::Instance(); // When a thread could block, it must release the lock. // Thread *thread = ThreadRegistry::RunningThread(); if(thread == NULL) trace.ErrorQuit(0, 1, "null running thread"); if(!thread->BlockingAllowed()) return false; if(reg->LockedThread == thread) thread->Unlock(); thread->blocked_ = true; return true; }