| 1 | // © 2016 and later: Unicode, Inc. and others. | 
|---|
| 2 | // License & terms of use: http://www.unicode.org/copyright.html | 
|---|
| 3 | /* | 
|---|
| 4 | ****************************************************************************** | 
|---|
| 5 | * | 
|---|
| 6 | *   Copyright (C) 1997-2013, International Business Machines | 
|---|
| 7 | *   Corporation and others.  All Rights Reserved. | 
|---|
| 8 | * | 
|---|
| 9 | ****************************************************************************** | 
|---|
| 10 | */ | 
|---|
| 11 | //---------------------------------------------------------------------------- | 
|---|
| 12 | // File:     mutex.h | 
|---|
| 13 | // | 
|---|
| 14 | // Lightweight C++ wrapper for umtx_ C mutex functions | 
|---|
| 15 | // | 
|---|
| 16 | // Author:   Alan Liu  1/31/97 | 
|---|
| 17 | // History: | 
|---|
| 18 | // 06/04/97   helena         Updated setImplementation as per feedback from 5/21 drop. | 
|---|
| 19 | // 04/07/1999  srl               refocused as a thin wrapper | 
|---|
| 20 | // | 
|---|
| 21 | //---------------------------------------------------------------------------- | 
|---|
| 22 | #ifndef MUTEX_H | 
|---|
| 23 | #define MUTEX_H | 
|---|
| 24 |  | 
|---|
| 25 | #include "unicode/utypes.h" | 
|---|
| 26 | #include "unicode/uobject.h" | 
|---|
| 27 | #include "umutex.h" | 
|---|
| 28 |  | 
|---|
| 29 | U_NAMESPACE_BEGIN | 
|---|
| 30 |  | 
|---|
| 31 | /** | 
|---|
| 32 | * Mutex is a helper class for convenient locking and unlocking of a UMutex. | 
|---|
| 33 | * | 
|---|
| 34 | * Creating a local scope Mutex will lock a UMutex, holding the lock until the Mutex | 
|---|
| 35 | * goes out of scope. | 
|---|
| 36 | * | 
|---|
| 37 | *  If no UMutex is specified, the ICU global mutex is implied. | 
|---|
| 38 | * | 
|---|
| 39 | *  For example: | 
|---|
| 40 | * | 
|---|
| 41 | *  static UMutex myMutex; | 
|---|
| 42 | * | 
|---|
| 43 | *  void Function(int arg1, int arg2) | 
|---|
| 44 | *  { | 
|---|
| 45 | *     static Object* foo;      // Shared read-write object | 
|---|
| 46 | *     Mutex mutex(&myMutex);   // or no args for the global lock | 
|---|
| 47 | *     foo->Method(); | 
|---|
| 48 | *     // When 'mutex' goes out of scope and gets destroyed here, the lock is released | 
|---|
| 49 | *  } | 
|---|
| 50 | * | 
|---|
| 51 | *  Note:  Do NOT use the form 'Mutex mutex();' as that merely forward-declares a function | 
|---|
| 52 | *         returning a Mutex. This is a common mistake which silently slips through the | 
|---|
| 53 | *         compiler!! | 
|---|
| 54 | */ | 
|---|
| 55 |  | 
|---|
| 56 | class U_COMMON_API Mutex : public UMemory { | 
|---|
| 57 | public: | 
|---|
| 58 | Mutex(UMutex *mutex = nullptr) : fMutex(mutex) { | 
|---|
| 59 | umtx_lock(fMutex); | 
|---|
| 60 | } | 
|---|
| 61 | ~Mutex() { | 
|---|
| 62 | umtx_unlock(fMutex); | 
|---|
| 63 | } | 
|---|
| 64 |  | 
|---|
| 65 | Mutex(const Mutex &other) = delete; // forbid assigning of this class | 
|---|
| 66 | Mutex &operator=(const Mutex &other) = delete; // forbid copying of this class | 
|---|
| 67 | void *operator new(size_t s) = delete;  // forbid heap allocation. Locals only. | 
|---|
| 68 |  | 
|---|
| 69 | private: | 
|---|
| 70 | UMutex   *fMutex; | 
|---|
| 71 | }; | 
|---|
| 72 |  | 
|---|
| 73 |  | 
|---|
| 74 | U_NAMESPACE_END | 
|---|
| 75 |  | 
|---|
| 76 | #endif //_MUTEX_ | 
|---|
| 77 | //eof | 
|---|
| 78 |  | 
|---|