Remove use of DIRECT_RECURSIVE_MUTEX_INITIALIZER its not portable use portable way to initialize recursive mutex using pthread_once() and direct_recursive_mutex_init() Upstream-Status: Pending Signed-off-by: Khem Raj Index: DirectFB-1.7.7/lib/direct/os/linux/glibc/mutex.h =================================================================== --- DirectFB-1.7.7.orig/lib/direct/os/linux/glibc/mutex.h +++ DirectFB-1.7.7/lib/direct/os/linux/glibc/mutex.h @@ -46,7 +46,6 @@ struct __D_DirectMutex { /**********************************************************************************************************************/ #define DIRECT_MUTEX_INITIALIZER(name) { PTHREAD_MUTEX_INITIALIZER } -#define DIRECT_RECURSIVE_MUTEX_INITIALIZER(name) { PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP } #endif Index: DirectFB-1.7.7/lib/direct/trace.c =================================================================== --- DirectFB-1.7.7.orig/lib/direct/trace.c +++ DirectFB-1.7.7/lib/direct/trace.c @@ -89,8 +89,15 @@ struct __D_DirectTraceBuffer { /**************************************************************************************************/ static DirectLink *buffers; -static DirectMutex buffers_lock = DIRECT_RECURSIVE_MUTEX_INITIALIZER(buffers_lock); +static pthread_once_t buffers_lock_init_once = PTHREAD_ONCE_INIT; +static DirectMutex buffers_lock; + +static void +buffers_lock_init( void ) +{ + direct_recursive_mutex_init(&buffers_lock); +} /**************************************************************************************************/ __dfb_no_instrument_function__ @@ -113,6 +120,7 @@ get_trace_buffer( void ) D_MAGIC_SET( buffer, DirectTraceBuffer ); + pthread_once(&buffers_lock_init_once, buffers_lock_init); direct_mutex_lock( &buffers_lock ); direct_list_append( &buffers, &buffer->link ); direct_mutex_unlock( &buffers_lock ); @@ -138,8 +146,14 @@ typedef struct { } SymbolTable; static DirectLink *tables = NULL; -static DirectMutex tables_lock = DIRECT_RECURSIVE_MUTEX_INITIALIZER(tables_lock); +static pthread_once_t tables_lock_init_once = PTHREAD_ONCE_INIT; +static DirectMutex tables_lock; +static void +tables_lock_init( void ) +{ + direct_recursive_mutex_init(&tabless_lock); +} __dfb_no_instrument_function__ static void @@ -370,6 +384,7 @@ direct_trace_lookup_symbol( const char * Symbol *symbol; SymbolTable *table; + pthread_once(&tables_lock_init_once, tables_lock_init); direct_mutex_lock( &tables_lock ); table = find_table( filename ); @@ -514,6 +529,7 @@ direct_trace_print_stacks() DirectTraceBuffer *b; DirectTraceBuffer *buffer = get_trace_buffer(); + pthread_once(&buffers_lock_init_once, buffers_lock_init); direct_mutex_lock( &buffers_lock ); if (buffer && buffer->level) @@ -611,6 +627,7 @@ direct_trace_free_buffer( DirectTraceBuf D_MAGIC_ASSERT( buffer, DirectTraceBuffer ); if (buffer->thread) { + pthread_once(&buffers_lock_init_once, buffers_lock_init); direct_mutex_lock( &buffers_lock ); direct_list_remove( &buffers, &buffer->link ); direct_mutex_unlock( &buffers_lock ); Index: DirectFB-1.7.7/src/directfb.c =================================================================== --- DirectFB-1.7.7.orig/src/directfb.c +++ DirectFB-1.7.7/src/directfb.c @@ -99,6 +99,15 @@ const unsigned int directfb_micro_versio const unsigned int directfb_binary_age = DIRECTFB_BINARY_AGE; const unsigned int directfb_interface_age = DIRECTFB_INTERFACE_AGE; +static pthread_once_t lock_init_once = PTHREAD_ONCE_INIT; +static DirectMutex lock; + +static void +lock_init( void ) +{ + direct_recursive_mutex_init(&lock); +} + const char * DirectFBCheckVersion( unsigned int required_major, unsigned int required_minor, @@ -215,8 +224,7 @@ DirectFBCreate( IDirectFB **interface_pt if (dfb_config->remote.host) return CreateRemote( dfb_config->remote.host, dfb_config->remote.port, interface_ptr ); - static DirectMutex lock = DIRECT_RECURSIVE_MUTEX_INITIALIZER(lock); - + pthread_once(&lock_init_once, lock_init); direct_mutex_lock( &lock ); if (!dfb_config->no_singleton && idirectfb_singleton) {