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