ffmpeg | branch: master | KO Myung-Hun <kom...@gmail.com> | Mon Feb 15 00:20:34 2016 +0900| [6bf5e7d3e7d8a7a3746f76e0f1fffb9bb63c02ae] | committer: Michael Niedermayer
compat/os2threads: support the return value of joined thread Signed-off-by: Michael Niedermayer <mich...@niedermayer.cc> > http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=6bf5e7d3e7d8a7a3746f76e0f1fffb9bb63c02ae --- compat/os2threads.h | 39 ++++++++++++++++++--------------------- 1 file changed, 18 insertions(+), 21 deletions(-) diff --git a/compat/os2threads.h b/compat/os2threads.h index 12cb7b0..3b289df 100644 --- a/compat/os2threads.h +++ b/compat/os2threads.h @@ -35,9 +35,15 @@ #include <sys/builtin.h> #include <sys/fmutex.h> -#include "libavutil/mem.h" +#include "libavutil/attributes.h" + +typedef struct { + TID tid; + void *(*start_routine)(void *); + void *arg; + void *result; +} pthread_t; -typedef TID pthread_t; typedef void pthread_attr_t; typedef HMTX pthread_mutex_t; @@ -58,39 +64,30 @@ typedef struct { #define PTHREAD_ONCE_INIT {0, _FMUTEX_INITIALIZER} -struct thread_arg { - void *(*start_routine)(void *); - void *arg; -}; - static void thread_entry(void *arg) { - struct thread_arg *thread_arg = arg; - - thread_arg->start_routine(thread_arg->arg); + pthread_t *thread = arg; - av_free(thread_arg); + thread->result = thread->start_routine(thread->arg); } static av_always_inline int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine)(void*), void *arg) { - struct thread_arg *thread_arg; - - thread_arg = av_mallocz(sizeof(struct thread_arg)); - if (!thread_arg) - return ENOMEM; + thread->start_routine = start_routine; + thread->arg = arg; + thread->result = NULL; - thread_arg->start_routine = start_routine; - thread_arg->arg = arg; - - *thread = _beginthread(thread_entry, NULL, 256 * 1024, thread_arg); + thread->tid = _beginthread(thread_entry, NULL, 1024 * 1024, thread); return 0; } static av_always_inline int pthread_join(pthread_t thread, void **value_ptr) { - DosWaitThread((PTID)&thread, DCWW_WAIT); + DosWaitThread(&thread.tid, DCWW_WAIT); + + if (value_ptr) + *value_ptr = thread.result; return 0; } _______________________________________________ ffmpeg-cvslog mailing list ffmpeg-cvslog@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-cvslog