1/*
2 * Copyright 2001-2005, Haiku.
3 * Distributed under the terms of the MIT License.
4 *
5 * Authors:
6 *		Tyler Akidau
7 */
8
9//! Base thread class for threads spawned and managed by the registrar
10
11
12#include "RegistrarThread.h"
13#include <string.h>
14
15
16/*!	\class RegistrarThread
17	\brief Base thread class for threads spawned and managed by the registrar
18*/
19
20// constructor
21/*! \brief Creates a new RegistrarThread object, spawning the object's
22	thread.
23
24	Call Run() to actually get the thread running.
25
26	\param name The desired name of the new thread
27	\param priority The desired priority of the new thread
28	\param managerMessenger A BMessenger to the thread manager to which this
29	                        thread does or will belong.
30*/
31RegistrarThread::RegistrarThread(const char *name, int32 priority,
32	BMessenger managerMessenger)
33	:
34	fManagerMessenger(managerMessenger),
35	fShouldExit(false),
36	fIsFinished(false),
37	fStatus(B_NO_INIT),
38	fId(-1),
39	fPriority(priority)
40{
41	fName[0] = 0;
42	status_t err = name && fManagerMessenger.IsValid() ? B_OK : B_BAD_VALUE;
43	if (err == B_OK)
44		strlcpy(fName, name, sizeof(fName));
45	fStatus = err;
46}
47
48// destructor
49/*! \brief Destroys the RegistrarThread object
50*/
51RegistrarThread::~RegistrarThread()
52{
53}
54
55// InitCheck()
56/*! \brief Returns the initialization status of the object
57*/
58status_t
59RegistrarThread::InitCheck()
60{
61	return fStatus;
62}
63
64// Run
65/*! \brief Begins executing the thread's ThreadFunction()
66*/
67status_t
68RegistrarThread::Run()
69{
70	status_t err = InitCheck();
71	if (err == B_OK) {
72		fId = spawn_thread(&RegistrarThread::EntryFunction, fName,
73			fPriority, (void*)this);
74		err = fId >= 0 ? B_OK : fId;
75		if (err == B_OK)
76			err = resume_thread(fId);
77	}
78	return err;
79}
80
81// Id
82//! Returns the thread id
83thread_id
84RegistrarThread::Id() const
85{
86	return fId;
87}
88
89// Name
90//! Returns the name of the thread
91const char*
92RegistrarThread::Name() const
93{
94	return fName;
95}
96
97// AskToExit
98/*! \brief Signals to thread that it needs to quit politely as soon
99	as possible.
100*/
101void
102RegistrarThread::AskToExit()
103{
104	fShouldExit = true;
105}
106
107// IsFinished
108/*! \brief Returns \c true if the thread has finished executing
109*/
110bool
111RegistrarThread::IsFinished() const
112{
113	return fIsFinished;
114}
115
116// EntryFunction
117/*! \brief This is the function supplied to spawn_thread. It simply calls
118	ThreadFunction() on the \a data parameter, which is assumed to be a pointer
119	to a RegistrarThread object.
120*/
121int32
122RegistrarThread::EntryFunction(void *data)
123{
124	return ((RegistrarThread*)data)->ThreadFunction();
125}
126