Main Page   Packages   Namespace List   Class Hierarchy   Alphabetical List   Compound List   File List   Compound Members   File Members   Search  

Basic_PThread Class Reference

#include <Basic_PThread.hpp>

Inheritance diagram for Basic_PThread::

Consumer DataFactory FileFactory Fred Fred Fred my_timer Producer Reader TFTP_Sender Timer Timer TimerPulse List of all members.

Public Methods

__inline Basic_PThread (bool autostart=false, bool autojoin=false)
virtual __inline ~Basic_PThread ()
__inline pthread_t getPID ()
virtual void run ()=0
__inline void startrel (int p)
void start (int start_prio=10)
__inline void yield ()
__inline void stop ()
__inline void end ()
__inline bool isStarted ()
__inline void join (void **value_ptr=NULL)
__inline void detach ()
__inline Basic_PThread (bool autostart=false, bool autojoin=false)
virtual __inline ~Basic_PThread ()
__inline pthread_t getPID ()
virtual void run ()=0
void start (int start_prio=10)
__inline void yield ()
__inline void stop ()
__inline void end ()
__inline bool isStarted ()
__inline void join (void **value_ptr=NULL)
__inline void detach ()

Static Public Methods

void * Basic_PThread::Wrapper (void *ptrThis)
void * Basic_PThread::Wrapper (void *ptrThis)

Protected Attributes

pthread_t pid
bool isDetached
pthread_attr_t attr
sched_param param
int priority

Private Methods

__inline Basic_PThread (const Basic_PThread &src)
__inline const Basic_PThread & operator= (const Basic_PThread &src)
__inline Basic_PThread (const Basic_PThread &src)
__inline const Basic_PThread & operator= (const Basic_PThread &src)

Constructor & Destructor Documentation

__inline Basic_PThread::Basic_PThread bool    autostart = false,
bool    autojoin = false
 

Definition at line 35 of file Basic_PThread.inl.

Referenced by INVALID_PID().

00036   : pid( INVALID_PID ), isDetached( TRUE )
00037  {
00038    if ( autostart ) start();
00039    if ( autojoin  ) join();
00040  }

__inline Basic_PThread::~Basic_PThread   [virtual]
 

Definition at line 43 of file Basic_PThread.inl.

Referenced by INVALID_PID().

00044  {
00045    stop();
00046    end();
00047  }

__inline Basic_PThread::Basic_PThread const Basic_PThread &    src [private]
 

__inline Basic_PThread::Basic_PThread bool    autostart = false,
bool    autojoin = false
 

virtual __inline Basic_PThread::~Basic_PThread   [virtual]
 

__inline Basic_PThread::Basic_PThread const Basic_PThread &    src [private]
 


Member Function Documentation

void* Basic_PThread::Basic_PThread::Wrapper void *    ptrThis [inline, static]
 

Definition at line 90 of file Basic_PThread.hpp.

00091    {
00092      Basic_PThread* me = (Basic_PThread*)ptrThis;
00093  
00094      // Call the derived classes version, since the function
00095      // run is implemented by it's children
00096      me->run();  
00097 
00098      // run() should contain an Infinite Loop, i.e. for(;;) { ... }
00099      // Exit beautifully, just in case there is no infinite loop.
00100   
00101      me->pid = INVALID_PID; 
00102      pthread_exit( NULL );
00103  
00104      return NULL;
00105    }

void* Basic_PThread::Basic_PThread::Wrapper void *    ptrThis [inline, static]
 

Definition at line 89 of file Basic_PThread.hpp.

00090    {
00091      Basic_PThread* me = (Basic_PThread*)ptrThis;
00092  
00093      // Call the derived classes version, since the function
00094      // run is implemented by it's children
00095      me->run();  
00096 
00097      // run() should contain an Infinite Loop, i.e. for(;;) { ... }
00098      // Exit beautifully, just in case there is no infinite loop.
00099   
00100      me->pid = INVALID_PID; 
00101      pthread_exit( NULL );
00102  
00103      return NULL;
00104    }

__inline void Basic_PThread::detach  
 

__inline void Basic_PThread::detach  
 

Definition at line 75 of file Basic_PThread.inl.

00076  {
00077    if ( pid < 0    ) return;
00078    if ( isDetached ) return;
00079     
00080    int err = pthread_detach( pid );
00081    isDetached = TRUE;
00082     
00083    MC_OnError( err, Error, "An error occured while detaching a PThread." );
00084  }

__inline void Basic_PThread::end  
 

__inline void Basic_PThread::end  
 

Definition at line 56 of file Basic_PThread.inl.

Referenced by ~Basic_PThread().

00056                                 {
00057    pthread_exit( NULL );
00058  }

__inline pthread_t Basic_PThread::getPID  
 

__inline pthread_t Basic_PThread::getPID  
 

Definition at line 60 of file Basic_PThread.inl.

Referenced by INVALID_PID().

00061  {
00062    return pid;
00063  }

__inline bool Basic_PThread::isStarted  
 

__inline bool Basic_PThread::isStarted  
 

Definition at line 65 of file Basic_PThread.inl.

00066  {
00067    return ( pid >= 0 && (signed long)pid != INVALID_PID );
00068  }

__inline void Basic_PThread::join void **    value_ptr = NULL
 

__inline void Basic_PThread::join void **    value_ptr = NULL
 

Definition at line 87 of file Basic_PThread.inl.

Referenced by Basic_PThread(), and main().

00088  {
00089    int err = 0;
00090    if ( pid < 0 ) return;
00091    if ( !isDetached )
00092      err = pthread_join( pid, value_ptr );
00093    
00094     isDetached = FALSE;
00095     MC_OnError( err, Error, "An error occured while joining a PThread." );
00096   }

__inline const Basic_PThread& Basic_PThread::operator= const Basic_PThread &    src [private]
 

__inline const Basic_PThread& Basic_PThread::operator= const Basic_PThread &    src [private]
 

Referenced by INVALID_PID().

virtual void Basic_PThread::run   [pure virtual]
 

Reimplemented in Timer, Fred, Producer, Consumer, Fred, Reader, my_timer, TimerPulse, DataFactory, FileFactory, TFTP_Sender, Timer, and Fred.

virtual void Basic_PThread::run   [pure virtual]
 

Reimplemented in Timer, Fred, Producer, Consumer, Fred, Reader, my_timer, TimerPulse, DataFactory, FileFactory, TFTP_Sender, Timer, and Fred.

Referenced by Basic_PThread::Wrapper(), and INVALID_PID().

void Basic_PThread::start int    start_prio = 10
 

void Basic_PThread::start int    start_prio = 10
 

Definition at line 33 of file Basic_PThread.cpp.

Referenced by Basic_PThread(), main(), TimerPulseTest::start(), and startrel().

00034  {
00035    if ( pid >= 0 && (signed long)pid != INVALID_PID ) return;
00036 
00037    memset( &attr,  0, sizeof( attr  ) );
00038    memset( &param, 0, sizeof( param ) );
00039 
00040    register int rc = EOK;
00041 
00042    rc = pthread_attr_init(            &attr );
00043    MC_OnError( rc, Error, "while initializing a basic pthread attribute." )
00044 
00045    rc = pthread_attr_setdetachstate(  &attr, PTHREAD_CREATE_DETACHED );
00046    MC_OnError( rc, Error, "while setting a basic pthread attribute to detached." )
00047 
00048    rc = pthread_attr_setscope(        &attr, PTHREAD_SCOPE_SYSTEM );
00049    MC_OnError( rc, Error, "while setting a basic pthread attribute to system scope." )
00050 
00051    rc = pthread_attr_setinheritsched( &attr, PTHREAD_EXPLICIT_SCHED );   
00052    MC_OnError( rc, Error, "while setting a basic pthread attribute to explicit scheduling." )
00053 
00054    priority = start_prio;
00055    attr.param.sched_priority = start_prio;
00056 
00057    rc = pthread_attr_setschedpolicy( &attr, SCHED_RR );
00058    MC_OnError( rc, Error, "while setting a this pthread parameter to Round-Robin." )
00059 
00060    // Call the static Wrapper() which will call the dynamic run()
00061    rc = pthread_create( &pid, &attr, Wrapper, (void*)this );
00062 
00063    if ( rc == -1 ) {
00064      printf( "Forgot to include libraries:" 
00065              "g++ -lpthread -lrt -lsocket -lnsl -g Basic_PThread.cpp" );
00066    }
00067 
00068    MC_OnError( rc, Error, "while starting a basic pthread." )
00069 
00070    pthread_detach( pid );
00071 
00072    // pthread_exit( NULL );
00073  }

__inline void Basic_PThread::startrel int    p [inline]
 

Definition at line 107 of file Basic_PThread.hpp.

00107                                  {
00108      start( getprio( 0 ) + p );
00109    }

__inline void Basic_PThread::stop  
 

Reimplemented in TimerPulse.

__inline void Basic_PThread::stop  
 

Reimplemented in TimerPulse.

Definition at line 49 of file Basic_PThread.inl.

Referenced by ~Basic_PThread().

00049                                  {
00050    if ( pid < 0 ) return;
00051  
00052    pthread_cancel( pid );
00053    pid = INVALID_PID;
00054  }

__inline void Basic_PThread::yield  
 

__inline void Basic_PThread::yield  
 

Definition at line 70 of file Basic_PThread.inl.

00071  {
00072    sched_yield();
00073  }


Member Data Documentation

pthread_attr_t Basic_PThread::attr [protected]
 

Definition at line 137 of file Basic_PThread.hpp.

bool Basic_PThread::isDetached [protected]
 

Definition at line 136 of file Basic_PThread.hpp.

sched_param Basic_PThread::param [protected]
 

Definition at line 138 of file Basic_PThread.hpp.

pthread_t Basic_PThread::pid [protected]
 

Definition at line 135 of file Basic_PThread.hpp.

Referenced by Basic_PThread::Wrapper().

int Basic_PThread::priority [protected]
 

Definition at line 139 of file Basic_PThread.hpp.


The documentation for this class was generated from the following files:
Generated on Sun Oct 14 18:48:25 2001 for Standard J2K Library by doxygen1.2.11.1 written by Dimitri van Heesch, © 1997-2001