Exemplo n.º 1
0
		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();
		}
Exemplo n.º 2
0
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);
}
Exemplo n.º 3
0
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;
}