From 5c731e2ea669bbc732e51dc95c1ec68cc41050e6 Mon Sep 17 00:00:00 2001 From: Diogo Franco Date: Sun, 27 Mar 2011 12:38:01 -0300 Subject: [PATCH] configure, Windows: support static pthreads on Windows Windows pthreads requires certain functions to be called to initialize itself. It can do that through DllMain but no such luck when linked statically; mplayer needs to call the initialization explicitly. --- configure | 13 ++++++++++++- mplayer.c | 13 +++++++++++++ 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/configure b/configure index 21360b36e0..4a0f88712e 100755 --- a/configure +++ b/configure @@ -3186,7 +3186,14 @@ if test "$_pthreads" = auto ; then cat > $TMPC << EOF #include static void *func(void *arg) { return arg; } -int main(void) { pthread_t tid; return pthread_create(&tid, 0, func, 0) == 0 ? 0 : 1; } +int main(void) { + pthread_t tid; +#ifdef PTW32_STATIC_LIB + pthread_win32_process_attach_np(); + pthread_win32_thread_attach_np(); +#endif + return pthread_create (&tid, 0, func, 0) != 0; +} EOF _pthreads=no if ! hpux ; then @@ -3194,6 +3201,10 @@ if ! hpux ; then # for crosscompilation, we cannot execute the program, be happy if we can link statically cc_check $THREAD_CFLAGS $_ld_tmp && (tmp_run || test "$_ld_static") && _ld_pthread="$_ld_tmp" && _pthreads=yes && break done + if test "$_pthreads" = no && mingw32 ; then + _ld_tmp="-lpthreadGC2 -lws2_32" + cc_check $_ld_tmp -DPTW32_STATIC_LIB && (tmp_run || test "$_ld_static") && _ld_pthread="$_ld_tmp" && _pthreads=yes && CFLAGS="$CFLAGS -DPTW32_STATIC_LIB" + fi fi fi if test "$_pthreads" = yes ; then diff --git a/mplayer.c b/mplayer.c index b9c7dcdac4..542bae7309 100644 --- a/mplayer.c +++ b/mplayer.c @@ -3889,10 +3889,23 @@ if (HAVE_CMOV) #endif /* ARCH_X86 */ } +#ifdef PTW32_STATIC_LIB +static void detach_ptw32(void) +{ + pthread_win32_thread_detach_np(); + pthread_win32_process_detach_np(); +} +#endif + /* This preprocessor directive is a hack to generate a mplayer-nomain.o object * file for some tools to link against. */ #ifndef DISABLE_MAIN int main(int argc,char* argv[]){ +#ifdef PTW32_STATIC_LIB + pthread_win32_process_attach_np(); + pthread_win32_thread_attach_np(); + atexit(detach_ptw32); +#endif if (argc > 1 && !strcmp(argv[1], "-leak-report")) talloc_enable_leak_report(); -- 2.11.4.GIT