• Home
  • History
  • Annotate
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright (C) 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 // Code within that accesses shared static or global data should
33 // should instantiate a Mutex object while doing so. You should make your own
34 // private mutex where possible.
35 
36 // For example:
37 //
38 // UMutex myMutex;
39 //
40 // void Function(int arg1, int arg2)
41 // {
42 //    static Object* foo;     // Shared read-write object
43 //    Mutex mutex(&myMutex);  // or no args for the global lock
44 //    foo->Method();
45 //    // When 'mutex' goes out of scope and gets destroyed here, the lock is released
46 // }
47 //
48 // Note:  Do NOT use the form 'Mutex mutex();' as that merely forward-declares a function
49 //        returning a Mutex. This is a common mistake which silently slips through the
50 //        compiler!!
51 //
52 
53 class U_COMMON_API Mutex : public UMemory {
54 public:
55   inline Mutex(UMutex *mutex = NULL);
56   inline ~Mutex();
57 
58 private:
59   UMutex   *fMutex;
60 
61   Mutex(const Mutex &other); // forbid copying of this class
62   Mutex &operator=(const Mutex &other); // forbid copying of this class
63 };
64 
Mutex(UMutex * mutex)65 inline Mutex::Mutex(UMutex *mutex)
66   : fMutex(mutex)
67 {
68   umtx_lock(fMutex);
69 }
70 
~Mutex()71 inline Mutex::~Mutex()
72 {
73   umtx_unlock(fMutex);
74 }
75 
76 U_NAMESPACE_END
77 
78 #endif //_MUTEX_
79 //eof
80