scuffed-code/icu4c/source/common/mutex.h

103 lines
2.5 KiB
C
Raw Normal View History

1999-08-16 21:50:52 +00:00
/*
******************************************************************************
*
* Copyright (C) 1997-2001, International Business Machines
* Corporation and others. All Rights Reserved.
*
******************************************************************************
1999-08-16 21:50:52 +00:00
*/
//----------------------------------------------------------------------------
1999-08-16 21:50:52 +00:00
// File: mutex.h
//
// Lightweight C++ wrapper for umtx_ C mutex functions
//
// Author: Alan Liu 1/31/97
// History:
// 06/04/97 helena Updated setImplementation as per feedback from 5/21 drop.
// 04/07/1999 srl refocused as a thin wrapper
//
//----------------------------------------------------------------------------
1999-08-16 21:50:52 +00:00
#ifndef MUTEX_H
#define MUTEX_H
#include "unicode/utypes.h"
#include "unicode/uobject.h"
1999-08-16 21:50:52 +00:00
#include "umutex.h"
U_NAMESPACE_BEGIN
//----------------------------------------------------------------------------
1999-08-16 21:50:52 +00:00
// Code within this library which accesses protected data
// should instantiate a Mutex object while doing so. You should make your own
// private mutex where possible.
// For example:
//
// UMTX myMutex;
//
// int InitializeMyMutex()
// {
// umtx_init( &myMutex );
// return 0;
// }
//
// static int initializeMyMutex = InitializeMyMutex();
//
// void Function(int arg1, int arg2)
// {
// static Object* foo; // Shared read-write object
// Mutex mutex(&myMutex); // or no args for the global lock
// foo->Method();
// // When 'mutex' goes out of scope and gets destroyed here, the lock is released
// }
//
// Note: Do NOT use the form 'Mutex mutex();' as that merely forward-declares a function
// returning a Mutex. This is a common mistake which silently slips through the
// compiler!!
//
class U_COMMON_API Mutex : public UObject {
1999-08-16 21:50:52 +00:00
public:
inline Mutex(UMTX *mutex = NULL);
inline ~Mutex();
/**
* ICU "poor man's RTTI", returns a UClassID for the actual class.
*
* @draft ICU 2.2
*/
virtual inline UClassID getDynamicClassID() const { return getStaticClassID(); }
/**
* ICU "poor man's RTTI", returns a UClassID for this class.
*
* @draft ICU 2.2
*/
static inline UClassID getStaticClassID() { return (UClassID)&fgClassID; }
1999-08-16 21:50:52 +00:00
private:
UMTX *fMutex;
/**
* The address of this static class variable serves as this class's ID
* for ICU "poor man's RTTI".
*/
static const char fgClassID;
1999-08-16 21:50:52 +00:00
};
inline Mutex::Mutex(UMTX *mutex)
: fMutex(mutex)
{
umtx_lock(fMutex);
}
inline Mutex::~Mutex()
{
umtx_unlock(fMutex);
}
U_NAMESPACE_END
1999-08-16 21:50:52 +00:00
#endif //_MUTEX_
//eof