RegistrarThread class, which is the base class for threads
spawned in the registrar. git-svn-id: file:///srv/svn/repos/haiku/trunk/current@1265 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
parent
36cfa7d4f8
commit
cd7adc0b06
|
@ -0,0 +1,45 @@
|
||||||
|
//----------------------------------------------------------------------
|
||||||
|
// This software is part of the OpenBeOS distribution and is covered
|
||||||
|
// by the OpenBeOS license.
|
||||||
|
//---------------------------------------------------------------------
|
||||||
|
/*!
|
||||||
|
\file RegistrarThread.h
|
||||||
|
RegistrarThread interface declaration
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef REGISTRAR_THREAD_H
|
||||||
|
#define REGISTRAR_THREAD_H
|
||||||
|
|
||||||
|
#include <Messenger.h>
|
||||||
|
#include <OS.h>
|
||||||
|
|
||||||
|
class RegistrarThread {
|
||||||
|
public:
|
||||||
|
RegistrarThread(const char *name, int32 priority, BMessenger managerMessenger);
|
||||||
|
virtual ~RegistrarThread();
|
||||||
|
|
||||||
|
virtual status_t InitCheck();
|
||||||
|
status_t Run();
|
||||||
|
|
||||||
|
thread_id Id() const;
|
||||||
|
const char* Name() const;
|
||||||
|
|
||||||
|
void AskToExit();
|
||||||
|
bool IsFinished() const;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
//! The function executed in the object's thread when Run() is called
|
||||||
|
virtual status_t ThreadFunction() = 0;
|
||||||
|
|
||||||
|
BMessenger fManagerMessenger;
|
||||||
|
bool fShouldExit; // Initially false, may be set to true by AskToExit()
|
||||||
|
bool fIsFinished; // Initially false, set to true by the thread itself upon completion
|
||||||
|
private:
|
||||||
|
static int32 EntryFunction(void *data);
|
||||||
|
|
||||||
|
status_t fStatus;
|
||||||
|
thread_id fId; // Initially -1, to be set prior to thread execution and neverafter changed
|
||||||
|
char fName[B_OS_NAME_LENGTH];
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // REGISTRAR_THREAD_H
|
|
@ -0,0 +1,111 @@
|
||||||
|
#include "RegistrarThread.h"
|
||||||
|
|
||||||
|
/*! \class RegistrarThread
|
||||||
|
\brief Base thread class for threads spawned and managed by the registrar
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
// constructor
|
||||||
|
/*! \brief Creates a new RegistrarThread object, spawning the object's
|
||||||
|
thread.
|
||||||
|
|
||||||
|
Call Run() to actually get the thread running.
|
||||||
|
|
||||||
|
\param name The desired name of the new thread
|
||||||
|
\param priority The desired priority of the new thread
|
||||||
|
\param managerMessenger A BMessenger to the thread manager to which this
|
||||||
|
thread does or will belong.
|
||||||
|
*/
|
||||||
|
RegistrarThread::RegistrarThread(const char *name, int32 priority, BMessenger managerMessenger)
|
||||||
|
: fManagerMessenger(managerMessenger)
|
||||||
|
, fShouldExit(false)
|
||||||
|
, fIsFinished(false)
|
||||||
|
, fStatus(B_NO_INIT)
|
||||||
|
, fId(-1)
|
||||||
|
{
|
||||||
|
fName[0] = 0;
|
||||||
|
status_t err = name && fManagerMessenger.IsValid() ? B_OK : B_BAD_VALUE;
|
||||||
|
if (!err) {
|
||||||
|
fId = spawn_thread(&RegistrarThread::EntryFunction, name,
|
||||||
|
priority, (void*)this);
|
||||||
|
err = fId >= 0 ? B_OK : fId;
|
||||||
|
}
|
||||||
|
if (!err) {
|
||||||
|
strcpy(fName, name);
|
||||||
|
}
|
||||||
|
fStatus = err;
|
||||||
|
}
|
||||||
|
|
||||||
|
// destructor
|
||||||
|
/*! \brief Destroys the RegistrarThread object
|
||||||
|
*/
|
||||||
|
RegistrarThread::~RegistrarThread()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
// InitCheck()
|
||||||
|
/*! \brief Returns the initialization status of the object
|
||||||
|
*/
|
||||||
|
status_t
|
||||||
|
RegistrarThread::InitCheck()
|
||||||
|
{
|
||||||
|
return fStatus;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Run
|
||||||
|
/*! \brief Begins executing the thread's ThreadFunction()
|
||||||
|
*/
|
||||||
|
status_t
|
||||||
|
RegistrarThread::Run()
|
||||||
|
{
|
||||||
|
status_t err = InitCheck();
|
||||||
|
if (!err)
|
||||||
|
err = resume_thread(fId);
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Id
|
||||||
|
//! Returns the thread id
|
||||||
|
thread_id
|
||||||
|
RegistrarThread::Id() const
|
||||||
|
{
|
||||||
|
return fId;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Name
|
||||||
|
//! Returns the name of the thread
|
||||||
|
const char*
|
||||||
|
RegistrarThread::Name() const
|
||||||
|
{
|
||||||
|
return fName;
|
||||||
|
}
|
||||||
|
|
||||||
|
// AskToExit
|
||||||
|
/*! \brief Signals to thread that it needs to quit politely as soon
|
||||||
|
as possible.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
RegistrarThread::AskToExit()
|
||||||
|
{
|
||||||
|
fShouldExit = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// IsFinished
|
||||||
|
/*! \brief Returns \c true if the thread has finished executing
|
||||||
|
*/
|
||||||
|
bool
|
||||||
|
RegistrarThread::IsFinished() const
|
||||||
|
{
|
||||||
|
return fIsFinished;
|
||||||
|
}
|
||||||
|
|
||||||
|
// EntryFunction
|
||||||
|
/*! \brief This is the function supplied to spawn_thread. It simply calls
|
||||||
|
ThreadFunction() on the \a data parameter, which is assumed to be a pointer
|
||||||
|
to a RegistrarThread object.
|
||||||
|
*/
|
||||||
|
int32
|
||||||
|
RegistrarThread::EntryFunction(void *data)
|
||||||
|
{
|
||||||
|
return ((RegistrarThread*)data)->ThreadFunction();
|
||||||
|
}
|
Loading…
Reference in New Issue