]> git.sesse.net Git - x264/commitdiff
Fix pthread_join emulation on win32 and BeOS
authorAnton Mitrofanov <BugMaster@narod.ru>
Fri, 23 Nov 2012 14:26:53 +0000 (18:26 +0400)
committerFiona Glaser <fiona@x264.com>
Wed, 12 Dec 2012 20:16:26 +0000 (12:16 -0800)
Doesn't actually affect x264, but it's more correct.

common/osdep.h
common/threadpool.c
common/win32thread.c
common/win32thread.h
encoder/lookahead.c

index 4d588ec301b478454b8ced4f4f354e120b07edea..d13d68a33b6e7a57b7b0025f23c0ee7312c5c7b4 100644 (file)
@@ -149,7 +149,7 @@ static inline int x264_pthread_create( x264_pthread_t *t, void *a, void *(*f)(vo
      return 0;
 }
 #define x264_pthread_join(t,s)       { long tmp; \
-                                       wait_for_thread(t,(s)?(long*)(*(s)):&tmp); }
+                                       wait_for_thread(t,(s)?(long*)(s):&tmp); }
 
 #elif HAVE_POSIXTHREAD
 #include <pthread.h>
index a11bf9d259659f02e5589b39ab705b5d9883f327..9be6c414a9d253e045efadaeba1b0d07b3cc2800 100644 (file)
@@ -47,7 +47,7 @@ struct x264_threadpool_t
     x264_sync_frame_list_t done;   /* list of jobs that have finished processing */
 };
 
-static void x264_threadpool_thread( x264_threadpool_t *pool )
+static void *x264_threadpool_thread( x264_threadpool_t *pool )
 {
     if( pool->init_func )
         pool->init_func( pool->init_arg );
@@ -69,6 +69,7 @@ static void x264_threadpool_thread( x264_threadpool_t *pool )
         job->ret = (void*)x264_stack_align( job->func, job->arg ); /* execute the function */
         x264_sync_frame_list_push( &pool->done, (void*)job );
     }
+    return NULL;
 }
 
 int x264_threadpool_init( x264_threadpool_t **p_pool, int threads,
index a81cd6cf1d99ecc7ea41c3400fa96c7b82c2928f..405c5b6566c07d5b91b1dacc75b98da3ab351acf 100644 (file)
@@ -62,7 +62,7 @@ static x264_win32thread_control_t thread_control;
 static unsigned __stdcall x264_win32thread_worker( void *arg )
 {
     x264_pthread_t *h = arg;
-    h->ret = h->func( h->arg );
+    *h->p_ret = h->func( h->arg );
     return 0;
 }
 
@@ -71,6 +71,8 @@ int x264_pthread_create( x264_pthread_t *thread, const x264_pthread_attr_t *attr
 {
     thread->func   = start_routine;
     thread->arg    = arg;
+    thread->p_ret  = &thread->ret;
+    thread->ret    = NULL;
     thread->handle = (void*)_beginthreadex( NULL, 0, x264_win32thread_worker, thread, 0, NULL );
     return !thread->handle;
 }
@@ -81,7 +83,7 @@ int x264_pthread_join( x264_pthread_t thread, void **value_ptr )
     if( ret != WAIT_OBJECT_0 )
         return -1;
     if( value_ptr )
-        *value_ptr = thread.ret;
+        *value_ptr = *thread.p_ret;
     CloseHandle( thread.handle );
     return 0;
 }
index d6370a77fe8dee1152be977f383d1ce4dfd94816..c8f447626860b2f1c81a252f33eda781e1e949e3 100644 (file)
@@ -36,6 +36,7 @@ typedef struct
     void *handle;
     void *(*func)( void* arg );
     void *arg;
+    void **p_ret;
     void *ret;
 } x264_pthread_t;
 #define x264_pthread_attr_t int
index fda59ab004eeca0efdce53df4e7708b2961b401d..c4169d3af3cf0e0379e1a484bc57399148195dec 100644 (file)
@@ -86,7 +86,7 @@ static void x264_lookahead_slicetype_decide( x264_t *h )
     x264_pthread_mutex_unlock( &h->lookahead->ofbuf.mutex );
 }
 
-static void x264_lookahead_thread( x264_t *h )
+static void *x264_lookahead_thread( x264_t *h )
 {
     int shift;
 #if HAVE_MMX
@@ -123,6 +123,7 @@ static void x264_lookahead_thread( x264_t *h )
     h->lookahead->b_thread_active = 0;
     x264_pthread_cond_broadcast( &h->lookahead->ofbuf.cv_fill );
     x264_pthread_mutex_unlock( &h->lookahead->ofbuf.mutex );
+    return NULL;
 }
 #endif