Commit 23829dd2 authored by Anton Mitrofanov's avatar Anton Mitrofanov Committed by Fiona Glaser

Fix pthread_join emulation on win32 and BeOS

Doesn't actually affect x264, but it's more correct.
parent 042fdd3e
......@@ -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>
......
......@@ -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,
......
......@@ -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;
}
......
......@@ -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
......
......@@ -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
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment