From 705a187ee9133ead7a3bd2e50559ee52ad3b58ed Mon Sep 17 00:00:00 2001 From: Yaakov Selkowitz Date: Tue, 3 May 2011 01:13:37 +0000 Subject: [PATCH] * cygwin.din (pthread_attr_getstack): Export. (pthread_attr_getstackaddr): Export. (pthread_getattr_np): Export. * ntdll.h (enum _THREAD_INFORMATION_CLASS): Add ThreadBasicInformation. (struct _THREAD_BASIC_INFORMATION): Define. (NtQueryInformationThread): Declare. * posix.sgml (std-susv4): Add pthread_attr_getstack. (std-gnu): Add pthread_getattr_np. (std-deprec): Add pthread_attr_getstackaddr. (std-notimpl): Remove pthread_attr_[gs]etstackaddr, as they were removed from SUSv4. * thread.cc (pthread_attr::pthread_attr): Initialize stackaddr. (pthread_attr_getstack): New function. (pthread_attr_getstackaddr): New function. (pthread_attr_setstacksize): Return EINVAL if passed size less than PTHREAD_STACK_MIN, as required by POSIX. (pthread_getattr_np): New function. * thread.h (class pthread_attr): Add stackaddr member. * include/pthread.h (pthread_attr_getstack): Declare. (pthread_attr_getstackaddr): Declare unconditionally. (pthread_attr_setstack): Declare inside false conditional for reference. (pthread_getattr_np): Declare. * include/cygwin/version.h (CYGWIN_VERSION_API_MINOR): Bump. --- winsup/cygwin/ChangeLog | 26 ++++++++++ winsup/cygwin/cygwin.din | 3 ++ winsup/cygwin/include/cygwin/version.h | 4 +- winsup/cygwin/include/pthread.h | 5 +- winsup/cygwin/ntdll.h | 12 +++++ winsup/cygwin/posix.sgml | 6 +-- winsup/cygwin/thread.cc | 71 +++++++++++++++++++++++++- winsup/cygwin/thread.h | 1 + 8 files changed, 122 insertions(+), 6 deletions(-) diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog index 547c5e5c4..379e694c4 100644 --- a/winsup/cygwin/ChangeLog +++ b/winsup/cygwin/ChangeLog @@ -1,3 +1,29 @@ +2011-05-02 Yaakov Selkowitz + + * cygwin.din (pthread_attr_getstack): Export. + (pthread_attr_getstackaddr): Export. + (pthread_getattr_np): Export. + * ntdll.h (enum _THREAD_INFORMATION_CLASS): Add ThreadBasicInformation. + (struct _THREAD_BASIC_INFORMATION): Define. + (NtQueryInformationThread): Declare. + * posix.sgml (std-susv4): Add pthread_attr_getstack. + (std-gnu): Add pthread_getattr_np. + (std-deprec): Add pthread_attr_getstackaddr. + (std-notimpl): Remove pthread_attr_[gs]etstackaddr, as they were + removed from SUSv4. + * thread.cc (pthread_attr::pthread_attr): Initialize stackaddr. + (pthread_attr_getstack): New function. + (pthread_attr_getstackaddr): New function. + (pthread_attr_setstacksize): Return EINVAL if passed size less than + PTHREAD_STACK_MIN, as required by POSIX. + (pthread_getattr_np): New function. + * thread.h (class pthread_attr): Add stackaddr member. + * include/pthread.h (pthread_attr_getstack): Declare. + (pthread_attr_getstackaddr): Declare unconditionally. + (pthread_attr_setstack): Declare inside false conditional for reference. + (pthread_getattr_np): Declare. + * include/cygwin/version.h (CYGWIN_VERSION_API_MINOR): Bump. + 2011-05-02 Christopher Faylor * Makefile.in: Allow CFLAGS to be overridden from the environment. diff --git a/winsup/cygwin/cygwin.din b/winsup/cygwin/cygwin.din index 823776d60..31f0004fa 100644 --- a/winsup/cygwin/cygwin.din +++ b/winsup/cygwin/cygwin.din @@ -1174,6 +1174,8 @@ pthread_attr_getinheritsched SIGFE pthread_attr_getschedparam SIGFE pthread_attr_getschedpolicy SIGFE pthread_attr_getscope SIGFE +pthread_attr_getstack SIGFE +pthread_attr_getstackaddr SIGFE pthread_attr_getstacksize SIGFE pthread_attr_init SIGFE pthread_attr_setdetachstate SIGFE @@ -1200,6 +1202,7 @@ pthread_create SIGFE pthread_detach SIGFE pthread_equal SIGFE pthread_exit SIGFE +pthread_getattr_np SIGFE pthread_getconcurrency SIGFE pthread_getschedparam SIGFE pthread_getsequence_np SIGFE diff --git a/winsup/cygwin/include/cygwin/version.h b/winsup/cygwin/include/cygwin/version.h index 95e5876da..8279e3a81 100644 --- a/winsup/cygwin/include/cygwin/version.h +++ b/winsup/cygwin/include/cygwin/version.h @@ -405,12 +405,14 @@ details. */ pthread_spin_trylock, pthread_spin_unlock. 239: Export pthread_setschedprio. 240: Export ppoll. + 241: Export pthread_attr_getstack, pthread_attr_getstackaddr, + pthread_getattr_np. */ /* Note that we forgot to bump the api for ualarm, strtoll, strtoull */ #define CYGWIN_VERSION_API_MAJOR 0 -#define CYGWIN_VERSION_API_MINOR 240 +#define CYGWIN_VERSION_API_MINOR 241 /* There is also a compatibity version number associated with the shared memory regions. It is incremented when incompatible diff --git a/winsup/cygwin/include/pthread.h b/winsup/cygwin/include/pthread.h index 221d242d3..c76cd670b 100644 --- a/winsup/cygwin/include/pthread.h +++ b/winsup/cygwin/include/pthread.h @@ -76,6 +76,8 @@ int pthread_attr_getinheritsched (const pthread_attr_t *, int *); int pthread_attr_getschedparam (const pthread_attr_t *, struct sched_param *); int pthread_attr_getschedpolicy (const pthread_attr_t *, int *); int pthread_attr_getscope (const pthread_attr_t *, int *); +int pthread_attr_getstack (const pthread_attr_t *, void **, size_t *); +int pthread_attr_getstackaddr (const pthread_attr_t *, void **); int pthread_attr_init (pthread_attr_t *); int pthread_attr_setdetachstate (pthread_attr_t *, int); int pthread_attr_setinheritsched (pthread_attr_t *, int); @@ -88,7 +90,7 @@ int pthread_attr_setscope (pthread_attr_t *, int); * Not supported or implemented. The prototypes are here so if someone greps the * source they will see these comments */ -int pthread_attr_getstackaddr (const pthread_attr_t *, void **); +int pthread_attr_setstack (pthread_attr_t *, void *, size_t); int pthread_attr_setstackaddr (pthread_attr_t *, void *); #endif @@ -200,6 +202,7 @@ void pthread_testcancel (void); /* Non posix calls */ +int pthread_getattr_np (pthread_t, pthread_attr_t *); int pthread_suspend (pthread_t); int pthread_continue (pthread_t); int pthread_yield (void); diff --git a/winsup/cygwin/ntdll.h b/winsup/cygwin/ntdll.h index b420f02d5..75ba1a5e8 100644 --- a/winsup/cygwin/ntdll.h +++ b/winsup/cygwin/ntdll.h @@ -898,9 +898,19 @@ typedef enum _EVENT_INFORMATION_CLASS typedef enum _THREAD_INFORMATION_CLASS { + ThreadBasicInformation = 0, ThreadImpersonationToken = 5 } THREAD_INFORMATION_CLASS, *PTHREAD_INFORMATION_CLASS; +typedef struct _THREAD_BASIC_INFORMATION { + NTSTATUS ExitStatus; + PNT_TIB TebBaseAddress; + CLIENT_ID ClientId; + KAFFINITY AffinityMask; + KPRIORITY Priority; + KPRIORITY BasePriority; +} THREAD_BASIC_INFORMATION, *PTHREAD_BASIC_INFORMATION; + #define RTL_QUERY_REGISTRY_SUBKEY 0x01 #define RTL_QUERY_REGISTRY_TOPKEY 0x02 #define RTL_QUERY_REGISTRY_REQUIRED 0x04 @@ -1058,6 +1068,8 @@ extern "C" ULONG, FILE_INFORMATION_CLASS); NTSTATUS NTAPI NtQueryInformationProcess (HANDLE, PROCESSINFOCLASS, PVOID, ULONG, PULONG); + NTSTATUS NTAPI NtQueryInformationThread (HANDLE, THREAD_INFORMATION_CLASS, + PVOID, ULONG, PULONG); NTSTATUS NTAPI NtQueryInformationToken (HANDLE, TOKEN_INFORMATION_CLASS, PVOID, ULONG, PULONG); NTSTATUS NTAPI NtQueryObject (HANDLE, OBJECT_INFORMATION_CLASS, VOID *, diff --git a/winsup/cygwin/posix.sgml b/winsup/cygwin/posix.sgml index 47cbcab6f..67d958b97 100644 --- a/winsup/cygwin/posix.sgml +++ b/winsup/cygwin/posix.sgml @@ -534,6 +534,7 @@ also IEEE Std 1003.1-2008 (POSIX.1-2008). pthread_attr_getschedparam pthread_attr_getschedpolicy pthread_attr_getscope + pthread_attr_getstack pthread_attr_getstacksize pthread_attr_init pthread_attr_setdetachstate @@ -1117,6 +1118,7 @@ also IEEE Std 1003.1-2008 (POSIX.1-2008). pow10 pow10f ppoll + pthread_getattr_np removexattr setxattr strchrnul @@ -1230,6 +1232,7 @@ also IEEE Std 1003.1-2008 (POSIX.1-2008). mallopt (SVID) mktemp (SUSv3) on_exit (SunOS) + pthread_attr_getstackaddr (SUSv3) pthread_continue (XPG2) pthread_getsequence_np (Tru64) pthread_suspend (XPG2) @@ -1375,11 +1378,8 @@ also IEEE Std 1003.1-2008 (POSIX.1-2008). psiginfo psignal pthread_attr_getguardsize - pthread_attr_getstack - pthread_attr_getstackaddr pthread_attr_setguardsize pthread_attr_setstack - pthread_attr_setstackaddr pthread_barrier[...] pthread_condattr_getclock pthread_condattr_setclock diff --git a/winsup/cygwin/thread.cc b/winsup/cygwin/thread.cc index 0ac810117..0085320ad 100644 --- a/winsup/cygwin/thread.cc +++ b/winsup/cygwin/thread.cc @@ -1085,7 +1085,7 @@ pthread::resume () pthread_attr::pthread_attr ():verifyable_object (PTHREAD_ATTR_MAGIC), joinable (PTHREAD_CREATE_JOINABLE), contentionscope (PTHREAD_SCOPE_PROCESS), -inheritsched (PTHREAD_INHERIT_SCHED), stacksize (0) +inheritsched (PTHREAD_INHERIT_SCHED), stackaddr (NULL), stacksize (0) { schedparam.sched_priority = 0; } @@ -2237,11 +2237,35 @@ pthread_attr_setscope (pthread_attr_t *attr, int contentionscope) return 0; } +extern "C" int +pthread_attr_getstack (const pthread_attr_t *attr, void **addr, size_t *size) +{ + if (!pthread_attr::is_good_object (attr)) + return EINVAL; + /* uses lowest address of stack on all platforms */ + *addr = (void *)((int)(*attr)->stackaddr - (*attr)->stacksize); + *size = (*attr)->stacksize; + return 0; +} + +extern "C" int +pthread_attr_getstackaddr (const pthread_attr_t *attr, void **addr) +{ + if (!pthread_attr::is_good_object (attr)) + return EINVAL; + /* uses stack address, which is the higher address on platforms + where the stack grows downwards, such as x86 */ + *addr = (*attr)->stackaddr; + return 0; +} + extern "C" int pthread_attr_setstacksize (pthread_attr_t *attr, size_t size) { if (!pthread_attr::is_good_object (attr)) return EINVAL; + if (size < PTHREAD_STACK_MIN) + return EINVAL; (*attr)->stacksize = size; return 0; } @@ -2381,6 +2405,51 @@ pthread::resume (pthread_t *thread) return 0; } +extern "C" int +pthread_getattr_np (pthread_t thread, pthread_attr_t *attr) +{ + const size_t sizeof_tbi = sizeof (THREAD_BASIC_INFORMATION); + PTHREAD_BASIC_INFORMATION tbi; + NTSTATUS ret; + + if (!pthread::is_good_object (&thread)) + return ESRCH; + + /* attr may not be pre-initialized */ + if (!pthread_attr::is_good_object (attr)) + { + int rv = pthread_attr_init (attr); + if (rv != 0) + return rv; + } + + (*attr)->joinable = thread->attr.joinable; + (*attr)->contentionscope = thread->attr.contentionscope; + (*attr)->inheritsched = thread->attr.inheritsched; + (*attr)->schedparam = thread->attr.schedparam; + + tbi = (PTHREAD_BASIC_INFORMATION) malloc (sizeof_tbi); + ret = NtQueryInformationThread (thread->win32_obj_id, ThreadBasicInformation, + tbi, sizeof_tbi, NULL); + + if (NT_SUCCESS (ret)) + { + PNT_TIB tib = tbi->TebBaseAddress; + (*attr)->stackaddr = tib->StackBase; + /* stack grows downwards on x86 systems */ + (*attr)->stacksize = (int)tib->StackBase - (int)tib->StackLimit; + } + else + { + debug_printf ("NtQueryInformationThread(ThreadBasicInformation), " + "status %p", ret); + (*attr)->stackaddr = thread->attr.stackaddr; + (*attr)->stacksize = thread->attr.stacksize; + } + + return 0; +} + /* provided for source level compatability. See http://www.opengroup.org/onlinepubs/007908799/xsh/pthread_getconcurrency.html */ diff --git a/winsup/cygwin/thread.h b/winsup/cygwin/thread.h index 4ffbc4c01..37296e5e5 100644 --- a/winsup/cygwin/thread.h +++ b/winsup/cygwin/thread.h @@ -250,6 +250,7 @@ public: int contentionscope; int inheritsched; struct sched_param schedparam; + void *stackaddr; size_t stacksize; pthread_attr (); -- 2.43.5