| /* |
| ******************************************************************************* |
| * |
| * Copyright (C) 1997-2000, International Business Machines |
| * Corporation and others. All Rights Reserved. |
| * |
| ******************************************************************************* |
| * |
| * File CMUTEX.C |
| * |
| * Modification History: |
| * |
| * Date Name Description |
| * 04/02/97 aliu Creation. |
| * 04/07/99 srl updated |
| * 05/13/99 stephen Changed to umutex (from cmutex). |
| * 11/22/99 aliu Make non-global mutex autoinitialize [j151] |
| ******************************************************************************* |
| */ |
| |
| /* Assume POSIX, and modify as necessary below */ |
| #define POSIX |
| |
| #if defined(_WIN32) |
| #undef POSIX |
| #endif |
| #if defined(macintosh) |
| #undef POSIX |
| #endif |
| #if defined(OS2) |
| #undef POSIX |
| #endif |
| |
| |
| /* Check our settings... */ |
| #include "unicode/utypes.h" |
| |
| /* APP_NO_THREADS is an old symbol. We'll honour it if present. */ |
| #ifdef APP_NO_THREADS |
| # define ICU_USE_THREADS 0 |
| #endif |
| |
| /* Default: use threads. */ |
| #ifndef ICU_USE_THREADS |
| # define ICU_USE_THREADS 1 |
| #endif |
| |
| |
| #if defined(POSIX) && (ICU_USE_THREADS==1) |
| /* Usage: uncomment the following, and breakpoint WeAreDeadlocked to |
| find reentrant issues. */ |
| /* # define POSIX_DEBUG_REENTRANCY 1 */ |
| # include <pthread.h> /* must be first, so that we get the multithread versions of things. */ |
| |
| # ifdef POSIX_DEBUG_REENTRANCY |
| pthread_t gLastThread; |
| UBool gInMutex; |
| |
| U_EXPORT void WeAreDeadlocked(); |
| |
| void WeAreDeadlocked() |
| { |
| puts("ARGH!! We're deadlocked.. break on WeAreDeadlocked() next time."); |
| } |
| # endif /* POSIX_DEBUG_REENTRANCY */ |
| #endif /* POSIX && (ICU_USE_THREADS==1) */ |
| |
| #ifdef WIN32 |
| # include <WINDOWS.H> |
| #endif |
| |
| #include "umutex.h" |
| #include "cmemory.h" |
| |
| /* the global mutex. Use it proudly and wash it often. */ |
| UMTX gGlobalMutex = NULL; |
| |
| void umtx_lock( UMTX *mutex ) |
| { |
| #if (ICU_USE_THREADS == 1) |
| if( mutex == NULL ) |
| { |
| mutex = &gGlobalMutex; |
| } |
| |
| if(*mutex == NULL) |
| { |
| umtx_init(mutex); |
| } |
| |
| #if defined(WIN32) |
| |
| EnterCriticalSection((CRITICAL_SECTION*) *mutex); |
| |
| #elif defined(POSIX) |
| |
| # ifdef POSIX_DEBUG_REENTRANCY |
| if(gInMutex == TRUE) /* in the mutex -- possible deadlock*/ |
| if(pthread_equal(gLastThread,pthread_self())) |
| WeAreDeadlocked(); |
| # endif |
| |
| pthread_mutex_lock((pthread_mutex_t*) *mutex); |
| |
| # ifdef POSIX_DEBUG_REENTRANCY |
| gLastThread = pthread_self(); |
| gInMutex = TRUE; |
| # endif |
| #endif |
| #endif /* ICU_USE_THREADS==1 */ |
| } |
| |
| void umtx_unlock( UMTX* mutex ) |
| { |
| #if (ICU_USE_THREADS==1) |
| if( mutex == NULL ) |
| { |
| mutex = &gGlobalMutex; |
| |
| if(*mutex == NULL) |
| { |
| return; /* jitterbug 135, fix for multiprocessor machines */ |
| } |
| } |
| |
| #if defined(WIN32) |
| |
| LeaveCriticalSection((CRITICAL_SECTION*)*mutex); |
| |
| #elif defined(POSIX) |
| pthread_mutex_unlock((pthread_mutex_t*)*mutex); |
| #ifdef POSIX_DEBUG_REENTRANCY |
| gInMutex = FALSE; |
| #endif |
| |
| #endif |
| #endif /* ICU_USE_THREADS == 1 */ |
| } |
| |
| U_CAPI void umtx_init( UMTX *mutex ) |
| { |
| #if (ICU_USE_THREADS == 1) |
| |
| if( mutex == NULL ) /* initialize the global mutex */ |
| { |
| mutex = &gGlobalMutex; |
| } |
| |
| if(*mutex != NULL) /* someone already did it. */ |
| return; |
| |
| #if defined(WIN32) |
| *mutex = uprv_malloc(sizeof(CRITICAL_SECTION)); |
| InitializeCriticalSection((CRITICAL_SECTION*)*mutex); |
| |
| #elif defined( POSIX ) |
| |
| *mutex = uprv_malloc(sizeof(pthread_mutex_t)); |
| |
| #if defined(HPUX_CMA) |
| pthread_mutex_init((pthread_mutex_t*)*mutex, pthread_mutexattr_default); |
| #else |
| pthread_mutex_init((pthread_mutex_t*)*mutex,NULL); |
| #endif |
| |
| |
| # ifdef POSIX_DEBUG_REENTRANCY |
| gInMutex = FALSE; |
| # endif |
| |
| #endif |
| #endif /* ICU_USE_THREADS==1 */ |
| } |
| |
| |
| |
| |
| |
| |
| |