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