fontservices/textshaperplugin/IcuSource/common/umutex.h
changeset 0 1fb32624e06b
equal deleted inserted replaced
-1:000000000000 0:1fb32624e06b
       
     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