mutex.h revision b13da9df870a61b11249bf741347908dbea0edd8
1b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* 2b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru****************************************************************************** 3b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* 4b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* Copyright (C) 1997-2003, 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// 36b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// UMTX myMutex; 37b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// 38b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// int InitializeMyMutex() 39b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// { 40b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// umtx_init( &myMutex ); 41b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// return 0; 42b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// } 43b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// 44b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// static int initializeMyMutex = InitializeMyMutex(); 45b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// 46b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// void Function(int arg1, int arg2) 47b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// { 48b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// static Object* foo; // Shared read-write object 49b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// Mutex mutex(&myMutex); // or no args for the global lock 50b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// foo->Method(); 51b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// // When 'mutex' goes out of scope and gets destroyed here, the lock is released 52b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// } 53b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// 54b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// Note: Do NOT use the form 'Mutex mutex();' as that merely forward-declares a function 55b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// returning a Mutex. This is a common mistake which silently slips through the 56b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// compiler!! 57b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// 58b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 59b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruclass U_COMMON_API Mutex : public UMemory { 60b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querupublic: 61b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru inline Mutex(UMTX *mutex = NULL); 62b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru inline ~Mutex(); 63b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 64b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruprivate: 65b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UMTX *fMutex; 66b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 67b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Mutex(const Mutex &other); // forbid copying of this class 68b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Mutex &operator=(const Mutex &other); // forbid copying of this class 69b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}; 70b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 71b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruinline Mutex::Mutex(UMTX *mutex) 72b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru : fMutex(mutex) 73b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 74b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru umtx_lock(fMutex); 75b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 76b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 77b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruinline Mutex::~Mutex() 78b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 79b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru umtx_unlock(fMutex); 80b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 81b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 82b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_NAMESPACE_END 83b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 84b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif //_MUTEX_ 85b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//eof 86