| Index: icu46/source/common/umutex.h
|
| ===================================================================
|
| --- icu46/source/common/umutex.h (revision 0)
|
| +++ icu46/source/common/umutex.h (revision 0)
|
| @@ -0,0 +1,150 @@
|
| +/*
|
| +**********************************************************************
|
| +* Copyright (C) 1997-2008, International Business Machines
|
| +* Corporation and others. All Rights Reserved.
|
| +**********************************************************************
|
| +*
|
| +* File UMUTEX.H
|
| +*
|
| +* Modification History:
|
| +*
|
| +* Date Name Description
|
| +* 04/02/97 aliu Creation.
|
| +* 04/07/99 srl rewrite - C interface, multiple mutices
|
| +* 05/13/99 stephen Changed to umutex (from cmutex)
|
| +******************************************************************************
|
| +*/
|
| +
|
| +#ifndef UMUTEX_H
|
| +#define UMUTEX_H
|
| +
|
| +#include "unicode/utypes.h"
|
| +#include "unicode/uclean.h"
|
| +
|
| +
|
| +/* APP_NO_THREADS is an old symbol. We'll honour it if present. */
|
| +#ifdef APP_NO_THREADS
|
| +# define ICU_USE_THREADS 0
|
| +#endif
|
| +
|
| +/* ICU_USE_THREADS
|
| + *
|
| + * Allows thread support (use of mutexes) to be compiled out of ICU.
|
| + * Default: use threads.
|
| + * Even with thread support compiled out, applications may override the
|
| + * (empty) mutex implementation with the u_setMutexFunctions() functions.
|
| + */
|
| +#ifndef ICU_USE_THREADS
|
| +# define ICU_USE_THREADS 1
|
| +#endif
|
| +
|
| +/**
|
| + * By default assume that we are on a machine with a weak memory model,
|
| + * and the double check lock won't work reliably.
|
| + */
|
| +#if !defined(UMTX_STRONG_MEMORY_MODEL)
|
| +#define UMTX_STRONG_MEMORY_MODEL 0
|
| +#endif
|
| +
|
| +/**
|
| + * \def UMTX_CHECK
|
| + * Encapsulates a safe check of an expression
|
| + * for use with double-checked lazy inititialization.
|
| + * On CPUs with weak memory models, this must use memory fence instructions
|
| + * or mutexes.
|
| + * The expression must involve only a _single_ variable, typically
|
| + * a possibly null pointer or a boolean that indicates whether some service
|
| + * is initialized or not.
|
| + * The setting of the variable involved in the test must be the last step of
|
| + * the initialization process.
|
| + *
|
| + *
|
| + * @internal
|
| + */
|
| +#if UMTX_STRONG_MEMORY_MODEL
|
| +
|
| +#define UMTX_CHECK(pMutex, expression, result) \
|
| + (result)=(expression)
|
| +
|
| +#else
|
| +
|
| +#define UMTX_CHECK(pMutex, expression, result) \
|
| + umtx_lock(pMutex); \
|
| + (result)=(expression); \
|
| + umtx_unlock(pMutex)
|
| +
|
| +#endif
|
| +
|
| +/*
|
| + * Code within ICU that accesses shared static or global data should
|
| + * instantiate a Mutex object while doing so. The unnamed global mutex
|
| + * is used throughout ICU, so keep locking short and sweet.
|
| + *
|
| + * For example:
|
| + *
|
| + * void Function(int arg1, int arg2)
|
| + * {
|
| + * static Object* foo; // Shared read-write object
|
| + * umtx_lock(NULL); // Lock the ICU global mutex
|
| + * foo->Method();
|
| + * umtx_unlock(NULL);
|
| + * }
|
| + *
|
| + * an alternative C++ mutex API is defined in the file common/mutex.h
|
| + */
|
| +
|
| +/* Lock a mutex.
|
| + * @param mutex The given mutex to be locked. Pass NULL to specify
|
| + * the global ICU mutex. Recursive locks are an error
|
| + * and may cause a deadlock on some platforms.
|
| + */
|
| +U_CAPI void U_EXPORT2 umtx_lock ( UMTX* mutex );
|
| +
|
| +/* Unlock a mutex. Pass in NULL if you want the single global
|
| + mutex.
|
| + * @param mutex The given mutex to be unlocked. Pass NULL to specify
|
| + * the global ICU mutex.
|
| + */
|
| +U_CAPI void U_EXPORT2 umtx_unlock ( UMTX* mutex );
|
| +
|
| +/* Initialize a mutex. Use it this way:
|
| + umtx_init( &aMutex );
|
| + * ICU Mutexes do not need explicit initialization before use. Use of this
|
| + * function is not necessary.
|
| + * Initialization of an already initialized mutex has no effect, and is safe to do.
|
| + * Initialization of mutexes is thread safe. Two threads can concurrently
|
| + * initialize the same mutex without causing problems.
|
| + * @param mutex The given mutex to be initialized
|
| + */
|
| +U_CAPI void U_EXPORT2 umtx_init ( UMTX* mutex );
|
| +
|
| +/* Destroy a mutex. This will free the resources of a mutex.
|
| + * Use it this way:
|
| + * umtx_destroy( &aMutex );
|
| + * Destroying an already destroyed mutex has no effect, and causes no problems.
|
| + * This function is not thread safe. Two threads must not attempt to concurrently
|
| + * destroy the same mutex.
|
| + * @param mutex The given mutex to be destroyed.
|
| + */
|
| +U_CAPI void U_EXPORT2 umtx_destroy( UMTX *mutex );
|
| +
|
| +
|
| +
|
| +/*
|
| + * Atomic Increment and Decrement of an int32_t value.
|
| + *
|
| + * Return Values:
|
| + * If the result of the operation is zero, the return zero.
|
| + * If the result of the operation is not zero, the sign of returned value
|
| + * is the same as the sign of the result, but the returned value itself may
|
| + * be different from the result of the operation.
|
| + */
|
| +U_CAPI int32_t U_EXPORT2 umtx_atomic_inc(int32_t *);
|
| +U_CAPI int32_t U_EXPORT2 umtx_atomic_dec(int32_t *);
|
| +
|
| +
|
| +#endif /*_CMUTEX*/
|
| +/*eof*/
|
| +
|
| +
|
| +
|
|
|
| Property changes on: icu46/source/common/umutex.h
|
| ___________________________________________________________________
|
| Added: svn:eol-style
|
| + LF
|
|
|
|
|