mutex.h revision b13da9df870a61b11249bf741347908dbea0edd8
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
27U_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
59class U_COMMON_API Mutex : public UMemory {
60public:
61  inline Mutex(UMTX *mutex = NULL);
62  inline ~Mutex();
63
64private:
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
71inline Mutex::Mutex(UMTX *mutex)
72  : fMutex(mutex)
73{
74  umtx_lock(fMutex);
75}
76
77inline Mutex::~Mutex()
78{
79  umtx_unlock(fMutex);
80}
81
82U_NAMESPACE_END
83
84#endif //_MUTEX_
85//eof
86