This is the mail archive of the glibc-cvs@sourceware.org mailing list for the glibc project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

GNU C Library master sources branch master updated. glibc-2.20-212-gf214ff7


This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "GNU C Library master sources".

The branch, master has been updated
       via  f214ff74f46275f6f1187730ac88b8a2407393f3 (commit)
      from  e37c91d4196f116d826cab129ca2637bd367b35e (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
http://sourceware.org/git/gitweb.cgi?p=glibc.git;a=commitdiff;h=f214ff74f46275f6f1187730ac88b8a2407393f3

commit f214ff74f46275f6f1187730ac88b8a2407393f3
Author: Roland McGrath <roland@hack.frob.com>
Date:   Thu Nov 20 10:56:20 2014 -0800

    NPTL: Refactor scheduler setup in pthread_create.

diff --git a/ChangeLog b/ChangeLog
index 8de1641..23c2244 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+2014-11-20  Roland McGrath  <roland@hack.frob.com>
+
+	* nptl/default-sched.h: New file.
+	* sysdeps/unix/sysv/linux/default-sched.h: New file.
+	* nptl/pthread_create.c: Include it.
+	(__pthread_create_2_1): Use collect_default_sched instead of making
+	Linux syscalls here directly.
+
 2014-11-20  Torvald Riegel  <triegel@redhat.com>
 
 	* nptl/pthread_once.c (clear_once_control, __pthread_once_slow,
diff --git a/nptl/default-sched.h b/nptl/default-sched.h
new file mode 100644
index 0000000..fb33e7c
--- /dev/null
+++ b/nptl/default-sched.h
@@ -0,0 +1,35 @@
+/* Determine calling thread's scheduling parameters.  Stub version.
+   Copyright (C) 2014 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public License as
+   published by the Free Software Foundation; either version 2 of the
+   License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with the GNU C Library; see the file COPYING.LIB.  If
+   not, see <http://www.gnu.org/licenses/>.  */
+
+#include <assert.h>
+
+/* This should fill in PD->schedpolicy if PD->flags does not contain
+   ATTR_FLAG_POLICY_SET, and set it; and PD->schedparam if PD->flags does
+   not contain ATTR_FLAG_SCHED_SET, and set it.  It won't be called at all
+   if both bits are already set.  */
+
+static void
+collect_default_sched (struct pthread *pd)
+{
+  assert ((pd->flags & (ATTR_FLAG_SCHED_SET | ATTR_FLAG_POLICY_SET)) != 0);
+
+  /* The generic/stub version is a no-op rather than just using the
+     __sched_getscheduler and __sched_getparam functions so that there
+     won't be stub warnings for those functions just because pthread_create
+     was called without actually calling those.  */
+}
diff --git a/nptl/pthread_create.c b/nptl/pthread_create.c
index 1dd1b95..3d4b8cd 100644
--- a/nptl/pthread_create.c
+++ b/nptl/pthread_create.c
@@ -30,6 +30,7 @@
 #include <resolv.h>
 #include <kernel-features.h>
 #include <exit-thread.h>
+#include <default-sched.h>
 
 #include <shlib-compat.h>
 
@@ -593,26 +594,16 @@ __pthread_create_2_1 (newthread, attr, start_routine, arg)
   if (__builtin_expect ((iattr->flags & ATTR_FLAG_NOTINHERITSCHED) != 0, 0)
       && (iattr->flags & (ATTR_FLAG_SCHED_SET | ATTR_FLAG_POLICY_SET)) != 0)
     {
-      INTERNAL_SYSCALL_DECL (scerr);
-
       /* Use the scheduling parameters the user provided.  */
       if (iattr->flags & ATTR_FLAG_POLICY_SET)
 	pd->schedpolicy = iattr->schedpolicy;
-      else if ((pd->flags & ATTR_FLAG_POLICY_SET) == 0)
-	{
-	  pd->schedpolicy = INTERNAL_SYSCALL (sched_getscheduler, scerr, 1, 0);
-	  pd->flags |= ATTR_FLAG_POLICY_SET;
-	}
-
       if (iattr->flags & ATTR_FLAG_SCHED_SET)
         /* The values were validated in pthread_attr_setschedparam.  */
-	memcpy (&pd->schedparam, &iattr->schedparam,
-		sizeof (struct sched_param));
-      else if ((pd->flags & ATTR_FLAG_SCHED_SET) == 0)
-	{
-	  INTERNAL_SYSCALL (sched_getparam, scerr, 2, 0, &pd->schedparam);
-	  pd->flags |= ATTR_FLAG_SCHED_SET;
-	}
+        pd->schedparam = iattr->schedparam;
+
+      if ((pd->flags & (ATTR_FLAG_SCHED_SET | ATTR_FLAG_POLICY_SET))
+          != (ATTR_FLAG_SCHED_SET | ATTR_FLAG_POLICY_SET))
+        collect_default_sched (pd);
     }
 
   /* Pass the descriptor to the caller.  */
diff --git a/sysdeps/unix/sysv/linux/default-sched.h b/sysdeps/unix/sysv/linux/default-sched.h
new file mode 100644
index 0000000..c25778f
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/default-sched.h
@@ -0,0 +1,42 @@
+/* Determine calling thread's scheduling parameters.  Linux version.
+   Copyright (C) 2014 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public License as
+   published by the Free Software Foundation; either version 2 of the
+   License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with the GNU C Library; see the file COPYING.LIB.  If
+   not, see <http://www.gnu.org/licenses/>.  */
+
+#include <sysdep.h>
+
+/* This should fill in PD->schedpolicy if PD->flags does not contain
+   ATTR_FLAG_POLICY_SET, and set it; and PD->schedparam if PD->flags does
+   not contain ATTR_FLAG_SCHED_SET, and set it.  It won't be called at all
+   if both bits are already set.  */
+
+static void
+collect_default_sched (struct pthread *pd)
+{
+  INTERNAL_SYSCALL_DECL (scerr);
+
+  if ((pd->flags & ATTR_FLAG_POLICY_SET) == 0)
+    {
+      pd->schedpolicy = INTERNAL_SYSCALL (sched_getscheduler, scerr, 1, 0);
+      pd->flags |= ATTR_FLAG_POLICY_SET;
+    }
+
+  if ((pd->flags & ATTR_FLAG_SCHED_SET) == 0)
+    {
+      INTERNAL_SYSCALL (sched_getparam, scerr, 2, 0, &pd->schedparam);
+      pd->flags |= ATTR_FLAG_SCHED_SET;
+    }
+}

-----------------------------------------------------------------------

Summary of changes:
 ChangeLog                               |    8 ++++++
 nptl/default-sched.h                    |   35 +++++++++++++++++++++++++
 nptl/pthread_create.c                   |   21 ++++-----------
 sysdeps/unix/sysv/linux/default-sched.h |   42 +++++++++++++++++++++++++++++++
 4 files changed, 91 insertions(+), 15 deletions(-)
 create mode 100644 nptl/default-sched.h
 create mode 100644 sysdeps/unix/sysv/linux/default-sched.h


hooks/post-receive
-- 
GNU C Library master sources


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]