diff options
author | Ulrich Drepper <drepper@redhat.com> | 2004-02-27 08:09:35 +0000 |
---|---|---|
committer | Ulrich Drepper <drepper@redhat.com> | 2004-02-27 08:09:35 +0000 |
commit | 14ffbc8350791ff0f33ccc65af26ebaa1b520132 (patch) | |
tree | d1fa245e05ff0de18632a76b51c2570bafd18890 /nptl/sysdeps/pthread/createthread.c | |
parent | 261eada2ca65277dcc68565370cb2d321f402c21 (diff) | |
download | glibc-14ffbc8350791ff0f33ccc65af26ebaa1b520132.tar.gz glibc-14ffbc8350791ff0f33ccc65af26ebaa1b520132.tar.xz glibc-14ffbc8350791ff0f33ccc65af26ebaa1b520132.zip |
Update.
* pthread_attr_setschedparam.c: Don't test priority against limits here. Set ATTR_FLAG_SCHED_SET flag. * pthread_attr_setschedpolicy.c: Set ATTR_FLAG_POLICY_SET flag. * pthread_create.c (__pthread_create_2_1): Copy scheduling attributes from parent thread to child. If attribute is used and scheduling parameters are not inherited, copy parameters from attribute or compute them. Check priority value. * pthread_getschedparam.c: If the parameters aren't known yet get them from the kernel. * pthread_setschedparam.c: Set ATTR_FLAG_SCHED_SET and ATTR_FLAG_POLICY_SET flag for thread. * sysdeps/unix/sysv/linux/internaltypes.h: Define ATTR_FLAG_SCHED_SET and ATTR_FLAG_POLICY_SET. * sysdeps/pthread/createthread.c: Use tgkill if possible.
Diffstat (limited to 'nptl/sysdeps/pthread/createthread.c')
-rw-r--r-- | nptl/sysdeps/pthread/createthread.c | 20 |
1 files changed, 19 insertions, 1 deletions
diff --git a/nptl/sysdeps/pthread/createthread.c b/nptl/sysdeps/pthread/createthread.c index c4695fced3..58a7b637a1 100644 --- a/nptl/sysdeps/pthread/createthread.c +++ b/nptl/sysdeps/pthread/createthread.c @@ -93,11 +93,24 @@ do_clone (struct pthread *pd, const struct pthread_attr *attr, send it the cancellation signal. */ INTERNAL_SYSCALL_DECL (err2); err_out: +#if __ASSUME_TGKILL + (void) INTERNAL_SYSCALL (tgkill, err2, 3, + THREAD_GETMEM (THREAD_SELF, pid), + pd->tid, SIGCANCEL); + +# ifdef __ASSUME_CLONE_STOPPED + /* Then wake it up so that the signal can be processed. */ + (void) INTERNAL_SYSCALL (tgkill, err2, 3, + THREAD_GETMEM (THREAD_SELF, pid), + pd->tid, SIGCONT); +# endif +#else (void) INTERNAL_SYSCALL (tkill, err2, 2, pd->tid, SIGCANCEL); -#ifdef __ASSUME_CLONE_STOPPED +# ifdef __ASSUME_CLONE_STOPPED /* Then wake it up so that the signal can be processed. */ (void) INTERNAL_SYSCALL (tkill, err2, 2, pd->tid, SIGCONT); +# endif #endif return INTERNAL_SYSCALL_ERRNO (res, err); @@ -116,7 +129,12 @@ do_clone (struct pthread *pd, const struct pthread_attr *attr, #ifdef __ASSUME_CLONE_STOPPED /* Now start the thread for real. */ +# if __ASSUME_TGKILL + res = INTERNAL_SYSCALL (tgkill, err, 3, THREAD_GETMEM (THREAD_SELF, pid), + pd->tid, SIGCONT); +# else res = INTERNAL_SYSCALL (tkill, err, 2, pd->tid, SIGCONT); +# endif /* If something went wrong, kill the thread. */ if (__builtin_expect (INTERNAL_SYSCALL_ERROR_P (res, err), 0)) |