Home | History | Annotate | Download | only in common
      1 /*
      2 ******************************************************************************
      3 *
      4 *   Copyright (C) 1997-2003, International Business Machines
      5 *   Corporation and others.  All Rights Reserved.
      6 *
      7 ******************************************************************************
      8 */
      9 //----------------------------------------------------------------------------
     10 // File:     mutex.h
     11 //
     12 // Lightweight C++ wrapper for umtx_ C mutex functions
     13 //
     14 // Author:   Alan Liu  1/31/97
     15 // History:
     16 // 06/04/97   helena         Updated setImplementation as per feedback from 5/21 drop.
     17 // 04/07/1999  srl               refocused as a thin wrapper
     18 //
     19 //----------------------------------------------------------------------------
     20 #ifndef MUTEX_H
     21 #define MUTEX_H
     22 
     23 #include "unicode/utypes.h"
     24 #include "unicode/uobject.h"
     25 #include "umutex.h"
     26 
     27 U_NAMESPACE_BEGIN
     28 
     29 //----------------------------------------------------------------------------
     30 // Code within that accesses shared static or global data should
     31 // should instantiate a Mutex object while doing so. You should make your own
     32 // private mutex where possible.
     33 
     34 // For example:
     35 //
     36 // UMTX myMutex;
     37 //
     38 // int InitializeMyMutex()
     39 // {
     40 //    umtx_init( &myMutex );
     41 //    return 0;
     42 // }
     43 //
     44 // static int initializeMyMutex = InitializeMyMutex();
     45 //
     46 // void Function(int arg1, int arg2)
     47 // {
     48 //    static Object* foo;     // Shared read-write object
     49 //    Mutex mutex(&myMutex);  // or no args for the global lock
     50 //    foo->Method();
     51 //    // When 'mutex' goes out of scope and gets destroyed here, the lock is released
     52 // }
     53 //
     54 // Note:  Do NOT use the form 'Mutex mutex();' as that merely forward-declares a function
     55 //        returning a Mutex. This is a common mistake which silently slips through the
     56 //        compiler!!
     57 //
     58 
     59 class U_COMMON_API Mutex : public UMemory {
     60 public:
     61   inline Mutex(UMTX *mutex = NULL);
     62   inline ~Mutex();
     63 
     64 private:
     65   UMTX   *fMutex;
     66 
     67   Mutex(const Mutex &other); // forbid copying of this class
     68   Mutex &operator=(const Mutex &other); // forbid copying of this class
     69 };
     70 
     71 inline Mutex::Mutex(UMTX *mutex)
     72   : fMutex(mutex)
     73 {
     74   umtx_lock(fMutex);
     75 }
     76 
     77 inline Mutex::~Mutex()
     78 {
     79   umtx_unlock(fMutex);
     80 }
     81 
     82 U_NAMESPACE_END
     83 
     84 #endif //_MUTEX_
     85 //eof
     86