1ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/* 2ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru********************************************************************** 354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius* Copyright (C) 1997-2012, International Business Machines 4ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru* Corporation and others. All Rights Reserved. 5ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru********************************************************************** 6ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru* 7ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru* File UMUTEX.H 8ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru* 9ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru* Modification History: 10ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru* 11ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru* Date Name Description 12ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru* 04/02/97 aliu Creation. 13ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru* 04/07/99 srl rewrite - C interface, multiple mutices 14ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru* 05/13/99 stephen Changed to umutex (from cmutex) 15ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru****************************************************************************** 16ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru*/ 17ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 18ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#ifndef UMUTEX_H 19ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#define UMUTEX_H 20ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 21ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "unicode/utypes.h" 22b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho#include "unicode/uclean.h" 23103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#include "putilimp.h" 24ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 2554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius/* For _ReadWriteBarrier(). */ 26103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#if defined(_MSC_VER) && _MSC_VER >= 1500 27b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho# include <intrin.h> 28b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho#endif 29b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 3054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius/* For CRITICAL_SECTION */ 3154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius#if U_PLATFORM_HAS_WIN32_API 3254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius#if 0 3354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius/* TODO(andy): Why doesn't windows.h compile in all files? It does in some. 3454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius * The intent was to include windows.h here, and have struct UMutex 3554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius * have an embedded CRITICAL_SECTION when building on Windows. 3654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius * The workaround is to put some char[] storage in UMutex instead, 3754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius * avoiding the need to include windows.h everwhere this header is included. 3854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius */ 3954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius# define WIN32_LEAN_AND_MEAN 4054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius# define VC_EXTRALEAN 4154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius# define NOUSER 4254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius# define NOSERVICE 4354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius# define NOIME 4454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius# define NOMCX 4554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius# include <windows.h> 4654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius#endif /* 0 */ 4754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius#define U_WINDOWS_CRIT_SEC_SIZE 64 4854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius#endif /* win32 */ 4954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 50103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#if U_PLATFORM_IS_DARWIN_BASED 51b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho#if defined(__STRICT_ANSI__) 52b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho#define UPRV_REMAP_INLINE 53b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho#define inline 54b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho#endif 55b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho#include <libkern/OSAtomic.h> 56b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho#define USE_MAC_OS_ATOMIC_INCREMENT 1 57b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho#if defined(UPRV_REMAP_INLINE) 58b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho#undef inline 59b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho#undef UPRV_REMAP_INLINE 60b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho#endif 61b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho#endif 62b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 63b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho/* 64b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * If we do not compile with dynamic_annotations.h then define 65b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * empty annotation macros. 66b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * See http://code.google.com/p/data-race-test/wiki/DynamicAnnotations 67b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho */ 68b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho#ifndef ANNOTATE_HAPPENS_BEFORE 69b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho# define ANNOTATE_HAPPENS_BEFORE(obj) 70b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho# define ANNOTATE_HAPPENS_AFTER(obj) 71b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho# define ANNOTATE_UNPROTECTED_READ(x) (x) 72b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho#endif 73ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 74b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho#ifndef UMTX_FULL_BARRIER 7554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius# if U_HAVE_GCC_ATOMICS 76b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho# define UMTX_FULL_BARRIER __sync_synchronize(); 77103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius# elif defined(_MSC_VER) && _MSC_VER >= 1500 78103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius /* From MSVC intrin.h. Use _ReadWriteBarrier() only on MSVC 9 and higher. */ 79b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho# define UMTX_FULL_BARRIER _ReadWriteBarrier(); 80103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius# elif U_PLATFORM_IS_DARWIN_BASED 81b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho# define UMTX_FULL_BARRIER OSMemoryBarrier(); 82b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho# else 83b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho# define UMTX_FULL_BARRIER \ 84b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { \ 85b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho umtx_lock(NULL); \ 86b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho umtx_unlock(NULL); \ 87b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 88b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho# endif 89b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho#endif 90b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 91b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho#ifndef UMTX_ACQUIRE_BARRIER 92b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho# define UMTX_ACQUIRE_BARRIER UMTX_FULL_BARRIER 93b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho#endif 94b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 95b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho#ifndef UMTX_RELEASE_BARRIER 96b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho# define UMTX_RELEASE_BARRIER UMTX_FULL_BARRIER 97ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#endif 98ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 99ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/** 100ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * \def UMTX_CHECK 101b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * Encapsulates a safe check of an expression 10285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho * for use with double-checked lazy inititialization. 103b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * Either memory barriers or mutexes are required, to prevent both the hardware 104b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * and the compiler from reordering operations across the check. 10585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho * The expression must involve only a _single_ variable, typically 10685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho * a possibly null pointer or a boolean that indicates whether some service 10785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho * is initialized or not. 10885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho * The setting of the variable involved in the test must be the last step of 10985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho * the initialization process. 11085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho * 111ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @internal 112ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */ 113ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#define UMTX_CHECK(pMutex, expression, result) \ 114b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { \ 115b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho (result)=(expression); \ 116b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho UMTX_ACQUIRE_BARRIER; \ 117b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 118b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho/* 119b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * TODO: Replace all uses of UMTX_CHECK and surrounding code 120b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * with SimpleSingleton or TriStateSingleton, and remove UMTX_CHECK. 121b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho */ 122ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 123ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/* 124ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Code within ICU that accesses shared static or global data should 125ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * instantiate a Mutex object while doing so. The unnamed global mutex 126ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * is used throughout ICU, so keep locking short and sweet. 127ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * 128ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * For example: 129ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * 130ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * void Function(int arg1, int arg2) 131ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * { 132ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * static Object* foo; // Shared read-write object 133ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * umtx_lock(NULL); // Lock the ICU global mutex 134ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * foo->Method(); 135ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * umtx_unlock(NULL); 136ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * } 137ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * 138ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * an alternative C++ mutex API is defined in the file common/mutex.h 139ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */ 140ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 14154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius/* 14254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius * UMutex - Mutexes for use by ICU implementation code. 14354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius * Must be declared as static or globals. They cannot appear as members 14454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius * of other objects. 14554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius * UMutex structs must be initialized. 14654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius * Example: 14754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius * static UMutex = U_MUTEX_INITIALIZER; 14854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius * The declaration of struct UMutex is platform dependent. 14954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius */ 15054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 15154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 15254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius#if U_PLATFORM_HAS_WIN32_API 15354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 15454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius/* U_INIT_ONCE mimics the windows API INIT_ONCE, which exists on Windows Vista and newer. 15554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius * When ICU no longer needs to support older Windows platforms (XP) that do not have 15654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius * a native INIT_ONCE, switch this implementation over to wrap the native Windows APIs. 15754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius */ 15854dcd9b6a06071f647dac967e9e267abb9410720Craig Corneliustypedef struct U_INIT_ONCE { 15954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius long fState; 16054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius void *fContext; 16154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius} U_INIT_ONCE; 16254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius#define U_INIT_ONCE_STATIC_INIT {0, NULL} 16354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 16454dcd9b6a06071f647dac967e9e267abb9410720Craig Corneliustypedef struct UMutex { 16554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius U_INIT_ONCE fInitOnce; 16654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius UMTX fUserMutex; 16754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius UBool fInitialized; /* Applies to fUserMutex only. */ 16854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius /* CRITICAL_SECTION fCS; */ /* See note above. Unresolved problems with including 16954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius * Windows.h, which would allow using CRITICAL_SECTION 17054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius * directly here. */ 17154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius char fCS[U_WINDOWS_CRIT_SEC_SIZE]; 17254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius} UMutex; 17354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 17454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius/* Initializer for a static UMUTEX. Deliberately contains no value for the 17554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius * CRITICAL_SECTION. 17654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius */ 17754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius#define U_MUTEX_INITIALIZER {U_INIT_ONCE_STATIC_INIT, NULL, FALSE} 17854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 17954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius#elif U_PLATFORM_IMPLEMENTS_POSIX 18054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius#include <pthread.h> 18154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 18254dcd9b6a06071f647dac967e9e267abb9410720Craig Corneliusstruct UMutex { 18354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius pthread_mutex_t fMutex; 18454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius UMTX fUserMutex; 18554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius UBool fInitialized; 18654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius}; 18754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius#define U_MUTEX_INITIALIZER {PTHREAD_MUTEX_INITIALIZER, NULL, FALSE} 18854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 18954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius#else 19054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius/* Unknow platform type. */ 19154dcd9b6a06071f647dac967e9e267abb9410720Craig Corneliusstruct UMutex { 19254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius void *fMutex; 19354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius}; 19454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius#define U_MUTEX_INITIALIZER {NULL} 19554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius#error Unknown Platform. 19654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 19754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius#endif 19854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 19954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius#if (U_PLATFORM != U_PF_CYGWIN && U_PLATFORM != U_PF_MINGW) || defined(CYGWINMSVC) 20054dcd9b6a06071f647dac967e9e267abb9410720Craig Corneliustypedef struct UMutex UMutex; 20154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius#endif 20254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 203b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho/* Lock a mutex. 204ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @param mutex The given mutex to be locked. Pass NULL to specify 205ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * the global ICU mutex. Recursive locks are an error 206ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * and may cause a deadlock on some platforms. 207ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */ 20854dcd9b6a06071f647dac967e9e267abb9410720Craig CorneliusU_CAPI void U_EXPORT2 umtx_lock(UMutex* mutex); 209ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 21054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius/* Unlock a mutex. 211ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @param mutex The given mutex to be unlocked. Pass NULL to specify 212ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * the global ICU mutex. 213ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */ 21454dcd9b6a06071f647dac967e9e267abb9410720Craig CorneliusU_CAPI void U_EXPORT2 umtx_unlock (UMutex* mutex); 215ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 216ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/* 217ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Atomic Increment and Decrement of an int32_t value. 218ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * 219ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Return Values: 220ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * If the result of the operation is zero, the return zero. 221ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * If the result of the operation is not zero, the sign of returned value 222ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * is the same as the sign of the result, but the returned value itself may 223ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * be different from the result of the operation. 224ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */ 225ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruU_CAPI int32_t U_EXPORT2 umtx_atomic_inc(int32_t *); 226ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruU_CAPI int32_t U_EXPORT2 umtx_atomic_dec(int32_t *); 227ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 228ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#endif /*_CMUTEX*/ 229ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/*eof*/ 230