aboutsummaryrefslogtreecommitdiffstats
path: root/meta/recipes-graphics/directfb/directfb/use-PTHREAD_MUTEX_RECURSIVE.patch
blob: ac48f68db72dd15cc8f9cd6f5094a379afb2713a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
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 <raj.khem@gmail.com>
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) {