00001 #ifndef Basic_PThread_INL
00002 #define Basic_PThread_INL
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016 #include <j2k/nto/Basic_PThread.hpp>
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035 inline Basic_PThread::Basic_PThread( BOOL autostart, BOOL autojoin )
00036 : pid( INVALID_PID ), isDetached( TRUE )
00037 {
00038 if ( autostart ) start();
00039 if ( autojoin ) join();
00040 }
00041
00042
00043 inline Basic_PThread::~Basic_PThread()
00044 {
00045 stop();
00046 end();
00047 }
00048
00049 inline void Basic_PThread::stop() {
00050 if ( pid < 0 ) return;
00051
00052 pthread_cancel( pid );
00053 pid = INVALID_PID;
00054 }
00055
00056 inline void Basic_PThread::end() {
00057 pthread_exit( NULL );
00058 }
00059
00060 inline pid_t Basic_PThread::getPID()
00061 {
00062 return pid;
00063 }
00064
00065 inline BOOL Basic_PThread::isStarted()
00066 {
00067 return ( pid >= 0 && (signed long)pid != INVALID_PID );
00068 }
00069
00070 inline void Basic_PThread::yield()
00071 {
00072 sched_yield();
00073 }
00074
00075 inline void Basic_PThread::detach()
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 }
00085
00086
00087 inline void Basic_PThread::join( void** value_ptr )
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 }
00097
00098 #endif