os/textandloc/fontservices/textshaperplugin/IcuSource/common/umutex.h
author sl
Tue, 10 Jun 2014 14:32:02 +0200
changeset 1 260cb5ec6c19
permissions -rw-r--r--
Update contrib.
     1 /*
     2 **********************************************************************
     3 *   Copyright (C) 1997-2005, International Business Machines
     4 *   Corporation and others.  All Rights Reserved.
     5 **********************************************************************
     6 *
     7 * File UMUTEX.H
     8 *
     9 * Modification History:
    10 *
    11 *   Date        Name        Description
    12 *   04/02/97  aliu        Creation.
    13 *   04/07/99  srl         rewrite - C interface, multiple mutices
    14 *   05/13/99  stephen     Changed to umutex (from cmutex)
    15 ******************************************************************************
    16 */
    17 
    18 #ifndef UMUTEX_H
    19 #define UMUTEX_H
    20 
    21 #include "unicode/utypes.h"
    22 #include "unicode/uclean.h"  
    23 
    24 
    25 /* APP_NO_THREADS is an old symbol. We'll honour it if present. */
    26 #ifdef APP_NO_THREADS
    27 # define ICU_USE_THREADS 0
    28 #endif
    29 
    30 /* ICU_USE_THREADS
    31  *
    32  *   Allows thread support (use of mutexes) to be compiled out of ICU.
    33  *   Default: use threads.
    34  *   Even with thread support compiled out, applications may override the
    35  *   (empty) mutex implementation with the u_setMutexFunctions() functions.
    36  */ 
    37 #ifndef ICU_USE_THREADS
    38 # define ICU_USE_THREADS 1
    39 #endif
    40 
    41 /**
    42  * By default assume that we are on a machine with a weak memory model,
    43  * and the double check lock won't work reliably.
    44  */
    45 #if !defined(UMTX_STRONG_MEMORY_MODEL)
    46 #define UMTX_STRONG_MEMORY_MODEL 0
    47 #endif
    48 
    49 /**
    50  * \def UMTX_CHECK
    51  * Encapsulates a safe check for an expression (usually a condition)
    52  * for lazy variable inititialization.
    53  * On CPUs with weak memory models, this must use memory fence instructions
    54  * or mutexes.
    55  * @internal
    56  */
    57 #if UMTX_STRONG_MEMORY_MODEL
    58 
    59 #define UMTX_CHECK(pMutex, expression, result) \
    60     (result)=(expression);
    61 
    62 #else
    63 
    64 #define UMTX_CHECK(pMutex, expression, result) \
    65     umtx_lock(pMutex); \
    66     (result)=(expression); \
    67     umtx_unlock(pMutex);
    68 
    69 #endif
    70 
    71 /*
    72  * Code within ICU that accesses shared static or global data should
    73  * instantiate a Mutex object while doing so.  The unnamed global mutex
    74  * is used throughout ICU, so keep locking short and sweet.
    75  *
    76  * For example:
    77  *
    78  * void Function(int arg1, int arg2)
    79  * {
    80  *   static Object* foo;     // Shared read-write object
    81  *   umtx_lock(NULL);        // Lock the ICU global mutex
    82  *   foo->Method();
    83  *   umtx_unlock(NULL);
    84  * }
    85  *
    86  * an alternative C++ mutex API is defined in the file common/mutex.h
    87  */
    88 
    89 /* Lock a mutex. 
    90  * @param mutex The given mutex to be locked.  Pass NULL to specify
    91  *              the global ICU mutex.  Recursive locks are an error
    92  *              and may cause a deadlock on some platforms.
    93  */
    94 U_CAPI void U_EXPORT2 umtx_lock   ( UMTX* mutex ); 
    95 
    96 /* Unlock a mutex. Pass in NULL if you want the single global
    97    mutex. 
    98  * @param mutex The given mutex to be unlocked.  Pass NULL to specify
    99  *              the global ICU mutex.
   100  */
   101 U_CAPI void U_EXPORT2 umtx_unlock ( UMTX* mutex );
   102 
   103 /* Initialize a mutex. Use it this way:
   104    umtx_init( &aMutex ); 
   105  * ICU Mutexes do not need explicit initialization before use.  Use of this
   106  *   function is not necessary.
   107  * Initialization of an already initialized mutex has no effect, and is safe to do.
   108  * Initialization of mutexes is thread safe.  Two threads can concurrently 
   109  *   initialize the same mutex without causing problems.
   110  * @param mutex The given mutex to be initialized
   111  */
   112 U_CAPI void U_EXPORT2 umtx_init   ( UMTX* mutex );
   113 
   114 /* Destroy a mutex. This will free the resources of a mutex.
   115  * Use it this way:
   116  *   umtx_destroy( &aMutex ); 
   117  * Destroying an already destroyed mutex has no effect, and causes no problems.
   118  * This function is not thread safe.  Two threads must not attempt to concurrently
   119  *   destroy the same mutex.
   120  * @param mutex The given mutex to be destroyed.
   121  */
   122 U_CAPI void U_EXPORT2 umtx_destroy( UMTX *mutex );
   123 
   124 
   125 
   126 /*
   127  * Atomic Increment and Decrement of an int32_t value.
   128  *
   129  * Return Values:
   130  *   If the result of the operation is zero, the return zero.
   131  *   If the result of the operation is not zero, the sign of returned value
   132  *      is the same as the sign of the result, but the returned value itself may
   133  *      be different from the result of the operation.
   134  */
   135 U_CAPI int32_t U_EXPORT2 umtx_atomic_inc(int32_t *);
   136 U_CAPI int32_t U_EXPORT2 umtx_atomic_dec(int32_t *);
   137 
   138 
   139 #endif /*_CMUTEX*/
   140 /*eof*/
   141 
   142 
   143