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