From 23829dd2b2c909855481f46cc884b3c25d92c2d7 Mon Sep 17 00:00:00 2001 From: Anton Mitrofanov Date: Fri, 23 Nov 2012 18:26:53 +0400 Subject: [PATCH] Fix pthread_join emulation on win32 and BeOS Doesn't actually affect x264, but it's more correct. --- common/osdep.h | 2 +- common/threadpool.c | 3 ++- common/win32thread.c | 6 ++++-- common/win32thread.h | 1 + encoder/lookahead.c | 3 ++- 5 files changed, 10 insertions(+), 5 deletions(-) diff --git a/common/osdep.h b/common/osdep.h index 4d588ec3..d13d68a3 100644 --- a/common/osdep.h +++ b/common/osdep.h @@ -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 diff --git a/common/threadpool.c b/common/threadpool.c index a11bf9d2..9be6c414 100644 --- a/common/threadpool.c +++ b/common/threadpool.c @@ -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, diff --git a/common/win32thread.c b/common/win32thread.c index a81cd6cf..405c5b65 100644 --- a/common/win32thread.c +++ b/common/win32thread.c @@ -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; } diff --git a/common/win32thread.h b/common/win32thread.h index d6370a77..c8f44762 100644 --- a/common/win32thread.h +++ b/common/win32thread.h @@ -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 diff --git a/encoder/lookahead.c b/encoder/lookahead.c index fda59ab0..c4169d3a 100644 --- a/encoder/lookahead.c +++ b/encoder/lookahead.c @@ -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 -- 2.40.0