diff --git a/configure b/configure index e2fcaaf8837..2032548b0bf 100755 --- a/configure +++ b/configure @@ -9871,6 +9871,94 @@ _ACEOF fi +ac_save_LIBS="$LIBS" +LIBS="$LIBS $LIBPTHREAD" + +for ac_func in pthread_getattr_np +do +as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` +echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 +if eval "test \"\${$as_ac_var+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $ac_func (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ +#ifdef __STDC__ +# include +#else +# include +#endif +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +{ +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char $ac_func (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +choke me +#else +char (*f) () = $ac_func; +#endif +#ifdef __cplusplus +} +#endif + +int +main () +{ +return f != $ac_func; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + eval "$as_ac_var=yes" +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +eval "$as_ac_var=no" +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 +echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +if test `eval echo '${'$as_ac_var'}'` = yes; then + cat >>confdefs.h <<_ACEOF +#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + +fi +done + +LIBS="$ac_save_LIBS" + diff --git a/configure.ac b/configure.ac index 5d37e8e4504..3be5d362ddf 100644 --- a/configure.ac +++ b/configure.ac @@ -535,6 +535,12 @@ dnl **** Check for pthread_rwlock_t **** AC_CHECK_TYPES([pthread_rwlock_t, pthread_rwlockattr_t],,,[#define _GNU_SOURCE #include ]) +dnl **** Check for pthread_getattr_np **** +ac_save_LIBS="$LIBS" +LIBS="$LIBS $LIBPTHREAD" +AC_CHECK_FUNCS(pthread_getattr_np) +LIBS="$ac_save_LIBS" + dnl **** Check for Open Sound System **** AC_CHECK_HEADERS(sys/soundcard.h machine/soundcard.h soundcard.h, break) diff --git a/include/config.h.in b/include/config.h.in index b2e24c4ba48..343466c50f9 100644 --- a/include/config.h.in +++ b/include/config.h.in @@ -410,6 +410,9 @@ /* Define to 1 if you have the header file. */ #undef HAVE_PROCESS_H +/* Define to 1 if you have the `pthread_getattr_np' function. */ +#undef HAVE_PTHREAD_GETATTR_NP + /* Define to 1 if you have the header file. */ #undef HAVE_PTHREAD_H diff --git a/loader/pthread.c b/loader/pthread.c index 94cc089a0fe..835786d2c51 100644 --- a/loader/pthread.c +++ b/loader/pthread.c @@ -79,9 +79,17 @@ void wine_pthread_init_thread( struct wine_pthread_thread_info *info ) /* retrieve the stack info (except for main thread) */ if (funcs.ptr_set_thread_data) { +#ifdef HAVE_PTHREAD_GETATTR_NP pthread_attr_t attr; pthread_getattr_np( pthread_self(), &attr ); pthread_attr_getstack( &attr, &info->stack_base, &info->stack_size ); +#else + /* assume that the stack allocation is page aligned */ + char dummy; + size_t page_mask = getpagesize() - 1; + char *stack_top = (char *)((unsigned long)(&dummy + page_mask) & ~page_mask); + info->stack_base = stack_top - info->stack_size; +#endif } /* set pid and tid */