00001 #if   !defined(__SEMAPHORE_HPP)
00002 #define  __SEMAPHORE_HPP
00003 
00004 00005 00006 00007 00008 00009 00010 00011 00012 00013 00014 00015 00016 00017 00018 00019 00020 00021 00022 
00023 
00024 #if !defined(__COMMON_HPP)
00025 #include <Common.hpp>
00026 #endif
00027 
00028 #if   !defined(__ABSTRACTSEMAPHORE_HPP)
00029 #include <AbstractSemaphore.hpp>
00030 #endif
00031 
00032 #if   !defined(__SEMAPHOREEXCEPTION_HPP)
00033 #include <SemaphoreException.hpp>
00034 #endif
00035 
00036 namespace   corelinux
00037 {
00038 
00039    DECLARE_CLASS( Semaphore );
00040 
00061    class Semaphore : public AbstractSemaphore
00062    {
00063 
00064    public:
00065 
00066 
00067       
00068       
00069       
00070 
00082                            Semaphore
00083                               ( 
00084                                  SemaphoreGroupPtr,
00085                                  SemaphoreIdentifierRef,
00086                                  bool Recursive=false,
00087                                  bool Balking=false
00088                               ) throw ( NullPointerException );
00089 
00091 
00092       virtual              ~Semaphore( void );
00093 
00094       
00095       
00096       
00097 
00099 
00100                bool     operator==( SemaphoreCref aRef ) const;
00101 
00102       
00103       
00104       
00105 
00107 
00108       virtual  bool  isBalkingEnabled( void ) const;
00109 
00111 
00112       virtual  bool  isRecursionEnabled( void ) const;
00113 
00115 
00116       virtual  ThreadIdentifierCref getOwningThreadIdentifier( void ) const;
00117 
00119 
00120       virtual  CounterCref    getRecursionQueueLength( void ) const;
00121 
00122 
00123    protected:
00124 
00125       
00126       
00127       
00128 
00130 
00131                            Semaphore( void ) 
00132                               throw(Assertion);
00133 
00135 
00136                            Semaphore( SemaphoreCref ) 
00137                               throw(Assertion);
00138 
00139       
00140       
00141       00143 
00144                SemaphoreRef operator=( SemaphoreCref ) 
00145                               throw(Assertion);
00146 
00148 
00149                CounterCref operator++( void );
00150 
00152 
00153                CounterCref operator--( void );
00154 
00155       
00156       
00157       
00158 
00160 
00161       virtual  ThreadIdentifierRef  getOwnerId( void );
00162 
00163       
00164       
00165       
00166 
00168 
00169       virtual  void  setOwnerId( void );
00170 
00172 
00173       virtual  void  setRecursionQueueLength( Counter );
00174 
00176 
00177       virtual  void  resetOwnerId( void );
00178 
00179 
00180    private:
00181 
00183 
00184                ThreadIdentifier           theOwningThread;
00185 
00187 
00188                Counter  theRecursionQueueLength;
00189          
00191 
00192                bool     theRecursiveMode;
00193 
00195 
00196                bool     theBalkingMode;
00197 
00198    };
00199 }
00200 
00201 #endif // if !defined(__SEMAPHORE_HPP)
00202 
00203 00204 00205 00206 00207 00208 00209 
00210