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:
parent
1e92c34ee4
commit
705a187ee9
@ -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.
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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);
|
||||||
|
@ -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 *,
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
*/
|
*/
|
||||||
|
@ -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 ();
|
||||||
|
Loading…
x
Reference in New Issue
Block a user