4
0
mirror of git://sourceware.org/git/newlib-cygwin.git synced 2025-02-28 12:05:47 +08:00

* 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.
This commit is contained in:
Yaakov Selkowitz 2011-05-03 01:13:37 +00:00
parent 1e92c34ee4
commit 705a187ee9
8 changed files with 122 additions and 6 deletions

View File

@ -1,3 +1,29 @@
2011-05-02 Yaakov Selkowitz <yselkowitz@users.sourceforge.net>
* 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 <me.cygwin2011@cgf.cx> 2011-05-02 Christopher Faylor <me.cygwin2011@cgf.cx>
* Makefile.in: Allow CFLAGS to be overridden from the environment. * Makefile.in: Allow CFLAGS to be overridden from the environment.

View File

@ -1174,6 +1174,8 @@ pthread_attr_getinheritsched SIGFE
pthread_attr_getschedparam SIGFE pthread_attr_getschedparam SIGFE
pthread_attr_getschedpolicy SIGFE pthread_attr_getschedpolicy SIGFE
pthread_attr_getscope SIGFE pthread_attr_getscope SIGFE
pthread_attr_getstack SIGFE
pthread_attr_getstackaddr SIGFE
pthread_attr_getstacksize SIGFE pthread_attr_getstacksize SIGFE
pthread_attr_init SIGFE pthread_attr_init SIGFE
pthread_attr_setdetachstate SIGFE pthread_attr_setdetachstate SIGFE
@ -1200,6 +1202,7 @@ pthread_create SIGFE
pthread_detach SIGFE pthread_detach SIGFE
pthread_equal SIGFE pthread_equal SIGFE
pthread_exit SIGFE pthread_exit SIGFE
pthread_getattr_np SIGFE
pthread_getconcurrency SIGFE pthread_getconcurrency SIGFE
pthread_getschedparam SIGFE pthread_getschedparam SIGFE
pthread_getsequence_np SIGFE pthread_getsequence_np SIGFE

View File

@ -405,12 +405,14 @@ details. */
pthread_spin_trylock, pthread_spin_unlock. pthread_spin_trylock, pthread_spin_unlock.
239: Export pthread_setschedprio. 239: Export pthread_setschedprio.
240: Export ppoll. 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 */ /* Note that we forgot to bump the api for ualarm, strtoll, strtoull */
#define CYGWIN_VERSION_API_MAJOR 0 #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 /* There is also a compatibity version number associated with the
shared memory regions. It is incremented when incompatible shared memory regions. It is incremented when incompatible

View File

@ -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_getschedparam (const pthread_attr_t *, struct sched_param *);
int pthread_attr_getschedpolicy (const pthread_attr_t *, int *); int pthread_attr_getschedpolicy (const pthread_attr_t *, int *);
int pthread_attr_getscope (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_init (pthread_attr_t *);
int pthread_attr_setdetachstate (pthread_attr_t *, int); int pthread_attr_setdetachstate (pthread_attr_t *, int);
int pthread_attr_setinheritsched (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 * Not supported or implemented. The prototypes are here so if someone greps the
* source they will see these comments * 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 *); int pthread_attr_setstackaddr (pthread_attr_t *, void *);
#endif #endif
@ -200,6 +202,7 @@ void pthread_testcancel (void);
/* Non posix calls */ /* Non posix calls */
int pthread_getattr_np (pthread_t, pthread_attr_t *);
int pthread_suspend (pthread_t); int pthread_suspend (pthread_t);
int pthread_continue (pthread_t); int pthread_continue (pthread_t);
int pthread_yield (void); int pthread_yield (void);

View File

@ -898,9 +898,19 @@ typedef enum _EVENT_INFORMATION_CLASS
typedef enum _THREAD_INFORMATION_CLASS typedef enum _THREAD_INFORMATION_CLASS
{ {
ThreadBasicInformation = 0,
ThreadImpersonationToken = 5 ThreadImpersonationToken = 5
} THREAD_INFORMATION_CLASS, *PTHREAD_INFORMATION_CLASS; } 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_SUBKEY 0x01
#define RTL_QUERY_REGISTRY_TOPKEY 0x02 #define RTL_QUERY_REGISTRY_TOPKEY 0x02
#define RTL_QUERY_REGISTRY_REQUIRED 0x04 #define RTL_QUERY_REGISTRY_REQUIRED 0x04
@ -1058,6 +1068,8 @@ extern "C"
ULONG, FILE_INFORMATION_CLASS); ULONG, FILE_INFORMATION_CLASS);
NTSTATUS NTAPI NtQueryInformationProcess (HANDLE, PROCESSINFOCLASS, NTSTATUS NTAPI NtQueryInformationProcess (HANDLE, PROCESSINFOCLASS,
PVOID, ULONG, PULONG); PVOID, ULONG, PULONG);
NTSTATUS NTAPI NtQueryInformationThread (HANDLE, THREAD_INFORMATION_CLASS,
PVOID, ULONG, PULONG);
NTSTATUS NTAPI NtQueryInformationToken (HANDLE, TOKEN_INFORMATION_CLASS, NTSTATUS NTAPI NtQueryInformationToken (HANDLE, TOKEN_INFORMATION_CLASS,
PVOID, ULONG, PULONG); PVOID, ULONG, PULONG);
NTSTATUS NTAPI NtQueryObject (HANDLE, OBJECT_INFORMATION_CLASS, VOID *, NTSTATUS NTAPI NtQueryObject (HANDLE, OBJECT_INFORMATION_CLASS, VOID *,

View File

@ -534,6 +534,7 @@ also IEEE Std 1003.1-2008 (POSIX.1-2008).</para>
pthread_attr_getschedparam pthread_attr_getschedparam
pthread_attr_getschedpolicy pthread_attr_getschedpolicy
pthread_attr_getscope pthread_attr_getscope
pthread_attr_getstack
pthread_attr_getstacksize pthread_attr_getstacksize
pthread_attr_init pthread_attr_init
pthread_attr_setdetachstate pthread_attr_setdetachstate
@ -1117,6 +1118,7 @@ also IEEE Std 1003.1-2008 (POSIX.1-2008).</para>
pow10 pow10
pow10f pow10f
ppoll ppoll
pthread_getattr_np
removexattr removexattr
setxattr setxattr
strchrnul strchrnul
@ -1230,6 +1232,7 @@ also IEEE Std 1003.1-2008 (POSIX.1-2008).</para>
mallopt (SVID) mallopt (SVID)
mktemp (SUSv3) mktemp (SUSv3)
on_exit (SunOS) on_exit (SunOS)
pthread_attr_getstackaddr (SUSv3)
pthread_continue (XPG2) pthread_continue (XPG2)
pthread_getsequence_np (Tru64) pthread_getsequence_np (Tru64)
pthread_suspend (XPG2) pthread_suspend (XPG2)
@ -1375,11 +1378,8 @@ also IEEE Std 1003.1-2008 (POSIX.1-2008).</para>
psiginfo psiginfo
psignal psignal
pthread_attr_getguardsize pthread_attr_getguardsize
pthread_attr_getstack
pthread_attr_getstackaddr
pthread_attr_setguardsize pthread_attr_setguardsize
pthread_attr_setstack pthread_attr_setstack
pthread_attr_setstackaddr
pthread_barrier[...] pthread_barrier[...]
pthread_condattr_getclock pthread_condattr_getclock
pthread_condattr_setclock pthread_condattr_setclock

View File

@ -1085,7 +1085,7 @@ pthread::resume ()
pthread_attr::pthread_attr ():verifyable_object (PTHREAD_ATTR_MAGIC), pthread_attr::pthread_attr ():verifyable_object (PTHREAD_ATTR_MAGIC),
joinable (PTHREAD_CREATE_JOINABLE), contentionscope (PTHREAD_SCOPE_PROCESS), 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; schedparam.sched_priority = 0;
} }
@ -2237,11 +2237,35 @@ pthread_attr_setscope (pthread_attr_t *attr, int contentionscope)
return 0; 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 extern "C" int
pthread_attr_setstacksize (pthread_attr_t *attr, size_t size) pthread_attr_setstacksize (pthread_attr_t *attr, size_t size)
{ {
if (!pthread_attr::is_good_object (attr)) if (!pthread_attr::is_good_object (attr))
return EINVAL; return EINVAL;
if (size < PTHREAD_STACK_MIN)
return EINVAL;
(*attr)->stacksize = size; (*attr)->stacksize = size;
return 0; return 0;
} }
@ -2381,6 +2405,51 @@ pthread::resume (pthread_t *thread)
return 0; 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. /* provided for source level compatability.
See http://www.opengroup.org/onlinepubs/007908799/xsh/pthread_getconcurrency.html See http://www.opengroup.org/onlinepubs/007908799/xsh/pthread_getconcurrency.html
*/ */

View File

@ -250,6 +250,7 @@ public:
int contentionscope; int contentionscope;
int inheritsched; int inheritsched;
struct sched_param schedparam; struct sched_param schedparam;
void *stackaddr;
size_t stacksize; size_t stacksize;
pthread_attr (); pthread_attr ();