Patrick Williams | d8c66bc | 2016-06-20 12:57:21 -0500 | [diff] [blame] | 1 | Remove use of DIRECT_RECURSIVE_MUTEX_INITIALIZER its not portable |
| 2 | use portable way to initialize recursive mutex using pthread_once() and direct_recursive_mutex_init() |
| 3 | |
| 4 | Upstream-Status: Pending |
| 5 | Signed-off-by: Khem Raj <raj.khem@gmail.com> |
| 6 | Index: DirectFB-1.7.7/lib/direct/os/linux/glibc/mutex.h |
| 7 | =================================================================== |
| 8 | --- DirectFB-1.7.7.orig/lib/direct/os/linux/glibc/mutex.h |
| 9 | +++ DirectFB-1.7.7/lib/direct/os/linux/glibc/mutex.h |
| 10 | @@ -46,7 +46,6 @@ struct __D_DirectMutex { |
| 11 | /**********************************************************************************************************************/ |
| 12 | |
| 13 | #define DIRECT_MUTEX_INITIALIZER(name) { PTHREAD_MUTEX_INITIALIZER } |
| 14 | -#define DIRECT_RECURSIVE_MUTEX_INITIALIZER(name) { PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP } |
| 15 | |
| 16 | #endif |
| 17 | |
| 18 | Index: DirectFB-1.7.7/lib/direct/trace.c |
| 19 | =================================================================== |
| 20 | --- DirectFB-1.7.7.orig/lib/direct/trace.c |
| 21 | +++ DirectFB-1.7.7/lib/direct/trace.c |
| 22 | @@ -89,8 +89,15 @@ struct __D_DirectTraceBuffer { |
| 23 | /**************************************************************************************************/ |
| 24 | |
| 25 | static DirectLink *buffers; |
| 26 | -static DirectMutex buffers_lock = DIRECT_RECURSIVE_MUTEX_INITIALIZER(buffers_lock); |
| 27 | |
| 28 | +static pthread_once_t buffers_lock_init_once = PTHREAD_ONCE_INIT; |
| 29 | +static DirectMutex buffers_lock; |
| 30 | + |
| 31 | +static void |
| 32 | +buffers_lock_init( void ) |
| 33 | +{ |
| 34 | + direct_recursive_mutex_init(&buffers_lock); |
| 35 | +} |
| 36 | /**************************************************************************************************/ |
| 37 | |
| 38 | __dfb_no_instrument_function__ |
| 39 | @@ -113,6 +120,7 @@ get_trace_buffer( void ) |
| 40 | |
| 41 | D_MAGIC_SET( buffer, DirectTraceBuffer ); |
| 42 | |
| 43 | + pthread_once(&buffers_lock_init_once, buffers_lock_init); |
| 44 | direct_mutex_lock( &buffers_lock ); |
| 45 | direct_list_append( &buffers, &buffer->link ); |
| 46 | direct_mutex_unlock( &buffers_lock ); |
| 47 | @@ -138,8 +146,14 @@ typedef struct { |
| 48 | } SymbolTable; |
| 49 | |
| 50 | static DirectLink *tables = NULL; |
| 51 | -static DirectMutex tables_lock = DIRECT_RECURSIVE_MUTEX_INITIALIZER(tables_lock); |
| 52 | +static pthread_once_t tables_lock_init_once = PTHREAD_ONCE_INIT; |
| 53 | +static DirectMutex tables_lock; |
| 54 | |
| 55 | +static void |
| 56 | +tables_lock_init( void ) |
| 57 | +{ |
| 58 | + direct_recursive_mutex_init(&tabless_lock); |
| 59 | +} |
| 60 | |
| 61 | __dfb_no_instrument_function__ |
| 62 | static void |
| 63 | @@ -370,6 +384,7 @@ direct_trace_lookup_symbol( const char * |
| 64 | Symbol *symbol; |
| 65 | SymbolTable *table; |
| 66 | |
| 67 | + pthread_once(&tables_lock_init_once, tables_lock_init); |
| 68 | direct_mutex_lock( &tables_lock ); |
| 69 | |
| 70 | table = find_table( filename ); |
| 71 | @@ -514,6 +529,7 @@ direct_trace_print_stacks() |
| 72 | DirectTraceBuffer *b; |
| 73 | DirectTraceBuffer *buffer = get_trace_buffer(); |
| 74 | |
| 75 | + pthread_once(&buffers_lock_init_once, buffers_lock_init); |
| 76 | direct_mutex_lock( &buffers_lock ); |
| 77 | |
| 78 | if (buffer && buffer->level) |
| 79 | @@ -611,6 +627,7 @@ direct_trace_free_buffer( DirectTraceBuf |
| 80 | D_MAGIC_ASSERT( buffer, DirectTraceBuffer ); |
| 81 | |
| 82 | if (buffer->thread) { |
| 83 | + pthread_once(&buffers_lock_init_once, buffers_lock_init); |
| 84 | direct_mutex_lock( &buffers_lock ); |
| 85 | direct_list_remove( &buffers, &buffer->link ); |
| 86 | direct_mutex_unlock( &buffers_lock ); |
| 87 | Index: DirectFB-1.7.7/src/directfb.c |
| 88 | =================================================================== |
| 89 | --- DirectFB-1.7.7.orig/src/directfb.c |
| 90 | +++ DirectFB-1.7.7/src/directfb.c |
| 91 | @@ -99,6 +99,15 @@ const unsigned int directfb_micro_versio |
| 92 | const unsigned int directfb_binary_age = DIRECTFB_BINARY_AGE; |
| 93 | const unsigned int directfb_interface_age = DIRECTFB_INTERFACE_AGE; |
| 94 | |
| 95 | +static pthread_once_t lock_init_once = PTHREAD_ONCE_INIT; |
| 96 | +static DirectMutex lock; |
| 97 | + |
| 98 | +static void |
| 99 | +lock_init( void ) |
| 100 | +{ |
| 101 | + direct_recursive_mutex_init(&lock); |
| 102 | +} |
| 103 | + |
| 104 | const char * |
| 105 | DirectFBCheckVersion( unsigned int required_major, |
| 106 | unsigned int required_minor, |
| 107 | @@ -215,8 +224,7 @@ DirectFBCreate( IDirectFB **interface_pt |
| 108 | if (dfb_config->remote.host) |
| 109 | return CreateRemote( dfb_config->remote.host, dfb_config->remote.port, interface_ptr ); |
| 110 | |
| 111 | - static DirectMutex lock = DIRECT_RECURSIVE_MUTEX_INITIALIZER(lock); |
| 112 | - |
| 113 | + pthread_once(&lock_init_once, lock_init); |
| 114 | direct_mutex_lock( &lock ); |
| 115 | |
| 116 | if (!dfb_config->no_singleton && idirectfb_singleton) { |