framexmit/fxmitmutex.hh

00001 /* -*- mode: c++; c-basic-offset: 3; -*- */
00002 #ifndef _FXMIT_MUTEXOBJ_H
00003 #define _FXMIT_MUTEXOBJ_H
00004 /*----------------------------------------------------------------------*/
00005 /*                                                                      */
00006 /* Module Name: fxmitmutex.h                                            */
00007 /*                                                                      */
00008 /* Module Description: mutex objects                                    */
00009 /*                                                                      */
00010 /* Module Arguments: none                                               */
00011 /*                                                                      */
00012 /* Revision History:                                                    */
00013 /* Rel   Date     Programmer    Comments                                */
00014 /* 1.0   21Nov98  D. Sigg       First release                           */
00015 /*                                                                      */
00016 /* Documentation References:                                            */
00017 /*      Man Pages: fxmitmutex.html                                      */
00018 /*      References: none                                                */
00019 /*                                                                      */
00020 /* Author Information:                                                  */
00021 /* Name          Telephone       Fax             e-mail                 */
00022 /* Daniel Sigg   (509) 372-8132  (509) 372-8137  sigg_d@ligo.mit.edu    */
00023 /*                                                                      */
00024 /* Code Compilation and Runtime Specifications:                         */
00025 /*      Code Compiled on: Ultra-Enterprise, Solaris 5.6                 */
00026 /*      Compiler Used: sun workshop C 4.2                               */
00027 /*      Runtime environment: sparc/solaris                              */
00028 /*                                                                      */
00029 /* Code Standards Conformance:                                          */
00030 /*      Code Conforms to: LIGO standards.       OK                      */
00031 /*                        Lint.                 TBD                     */
00032 /*                        ANSI                  OK                      */
00033 /*                        POSIX                 OK (for UNIX)           */
00034 /*                                                                      */
00035 /* Known Bugs, Limitations, Caveats:                                    */
00036 /*                                                                      */
00037 /*                                                                      */
00038 /*                                                                      */
00039 /*                      -------------------                             */
00040 /*                                                                      */
00041 /*                             LIGO                                     */
00042 /*                                                                      */
00043 /*        THE LASER INTERFEROMETER GRAVITATIONAL WAVE OBSERVATORY.      */
00044 /*                                                                      */
00045 /*                     (C) The LIGO Project, 1996.                      */
00046 /*                                                                      */
00047 /*                                                                      */
00048 /* California Institute of Technology                                   */
00049 /* LIGO Project MS 51-33                                                */
00050 /* Pasadena CA 91125                                                    */
00051 /*                                                                      */
00052 /* Massachusetts Institute of Technology                                */
00053 /* LIGO Project MS 20B-145                                              */
00054 /* Cambridge MA 01239                                                   */
00055 /*                                                                      */
00056 /* LIGO Hanford Observatory                                             */
00057 /* P.O. Box 1970 S9-02                                                  */
00058 /* Richland WA 99352                                                    */
00059 /*                                                                      */
00060 /* LIGO Livingston Observatory                                          */
00061 /* 19100 LIGO Lane Rd.                                                  */
00062 /* Livingston, LA 70754                                                 */
00063 /*                                                                      */
00064 /*----------------------------------------------------------------------*/
00065 /* Header File List: */
00066 #include <memory>
00067 #include "framexmit/fxmittask.h"
00068 
00069 namespace framexmit {
00070 
00087 
00095    class abstractsemaphore { 
00096    public:
00098       typedef enum locktype {
00100       rdlock = 0,
00102       wrlock = 1
00103       };
00104      //typedef enum locktype locktype; // Not necessary jgz 20080303
00105    
00106    
00111       abstractsemaphore () {
00112       }
00113    
00118       virtual ~abstractsemaphore ();
00119    
00124       virtual void lock () = 0;
00125    
00131       virtual void readlock () = 0;
00132    
00138       virtual void writelock () = 0;
00139    
00144       virtual void unlock () = 0;
00145    
00153       virtual bool trylock (locktype lck = rdlock) = 0;
00154    };
00155 
00156 
00172    class mutex : public abstractsemaphore {
00173    public:
00174    
00179       mutex () : abstractsemaphore () {
00180          MUTEX_CREATE (mux);
00181       };
00182    
00187       virtual ~mutex ();
00188    
00194       mutex (const mutex&) : abstractsemaphore () {
00195          MUTEX_CREATE (mux);
00196       }
00197    
00203       mutex& operator= (const mutex& mux) {
00204          return *this;
00205       }
00206    
00212       virtual void lock () {
00213          MUTEX_GET (mux);
00214       }
00215    
00220       virtual void readlock () {
00221          lock();
00222       }
00223    
00228       virtual void writelock () {
00229          lock ();
00230       }
00231    
00236       virtual void unlock () {
00237          MUTEX_RELEASE (mux);
00238       }
00239    
00247       virtual bool trylock (locktype lt = rdlock) {
00248          return (MUTEX_TRY (mux) == 0);
00249       }
00250    
00251    protected:
00253       mutexID_t         mux;
00254    };
00255 
00256 
00274    class recursivemutex : public mutex {
00275    public:
00276    
00281       recursivemutex () : refcount (0) {
00282       };
00283    
00290       recursivemutex (const recursivemutex& rmux) 
00291       : mutex (rmux), refcount (0) {
00292       };
00293    
00299       recursivemutex& operator= (const recursivemutex& rm) {
00300          return *this;
00301       }
00302    
00310       virtual void lock ();
00311    
00316       virtual void unlock ();
00317    
00327       virtual bool trylock (locktype lck = rdlock);
00328    
00329    protected:
00331       taskID_t          threadID;
00333       int               refcount;
00334    };
00335 
00336 
00353    class readwritelock : public abstractsemaphore {
00354    public:
00362       explicit readwritelock (int Maxuse = -1)
00363       : maxuse (Maxuse), inuse (0), wrwait (0) {
00364          MUTEX_CREATE (mux);
00365          pthread_cond_init (&cond, 0);
00366       }
00367    
00372       virtual ~readwritelock ();
00373    
00379       readwritelock (const readwritelock& rw) 
00380       : abstractsemaphore(), maxuse (rw.maxuse), inuse (0), wrwait (0) {
00381          MUTEX_CREATE (mux);
00382          pthread_cond_init (&cond, 0);
00383       }
00384 
00390       readwritelock& operator= (const readwritelock& rw) {
00391          return *this;
00392       }
00393    
00403       virtual void readlock ();
00404    
00414       virtual void writelock ();
00415    
00420       virtual void lock () {
00421          readlock ();
00422       }
00423    
00428       virtual void unlock ();
00429    
00439       bool trylock (locktype lck = rdlock);
00440    
00441    private:
00442       mutexID_t         mux;
00443       pthread_cond_t    cond;
00444       int               maxuse;
00445       int               inuse;
00446       int               wrwait;
00447    };
00448 
00449 
00476    class semlock {
00477    public:
00479       typedef enum locktype {
00481       rdlock = 0,
00483       wrlock = 1
00484       };
00485       // typedef enum locktype locktype; // Not necessary? jgz20080303
00486 
00492       explicit semlock (abstractsemaphore& sem) 
00493       : _sem (&sem) {
00494          _sem->lock();
00495          // cout << "mutex locked" << endl;
00496       }
00497    
00506       semlock (abstractsemaphore& sem, locktype lck) 
00507       : _sem (&sem) {
00508          if (lck == wrlock) {
00509             _sem->writelock();
00510          }
00511          else {
00512             _sem->readlock();
00513          }
00514          // cout << "mutex locked" << endl;
00515       }
00516    
00521       virtual ~semlock ();
00522    
00523    private:
00524       abstractsemaphore*        _sem;
00525       semlock();
00526       semlock (const semlock&);
00527       semlock& operator= (const semlock&);
00528    };
00529 
00531 }
00532 
00533 #endif /* _FXMIT_MUTEXOBJ_H */

Generated on Sun Mar 8 19:20:47 2009 for dmt by  doxygen 1.5.4