about summary refs log tree commit diff
path: root/nptl/sysdeps/pthread/createthread.c
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@redhat.com>2004-02-27 08:09:35 +0000
committerUlrich Drepper <drepper@redhat.com>2004-02-27 08:09:35 +0000
commit14ffbc8350791ff0f33ccc65af26ebaa1b520132 (patch)
treed1fa245e05ff0de18632a76b51c2570bafd18890 /nptl/sysdeps/pthread/createthread.c
parent261eada2ca65277dcc68565370cb2d321f402c21 (diff)
downloadglibc-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.c20
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))