aboutsummaryrefslogtreecommitdiff
path: root/nptl/pthreadP.h
diff options
context:
space:
mode:
authorSiddhesh Poyarekar <siddhesh@redhat.com>2013-04-22 10:28:31 +0530
committerSiddhesh Poyarekar <siddhesh@redhat.com>2013-04-22 10:28:31 +0530
commitda1304bcc8d718f40e58d92726c0fbc7b0d0794d (patch)
tree872f3f44330b1ec4faa83e22bf356ad31ef14b73 /nptl/pthreadP.h
parent2169712d9c140d1b011470393c64258b2db3a4cd (diff)
downloadglibc-da1304bcc8d718f40e58d92726c0fbc7b0d0794d.zip
glibc-da1304bcc8d718f40e58d92726c0fbc7b0d0794d.tar.gz
glibc-da1304bcc8d718f40e58d92726c0fbc7b0d0794d.tar.bz2
Consolidate pthread_attr value validation
Define inline functions that wrap around validation for each of the pthread attributes to reduce duplication in code.
Diffstat (limited to 'nptl/pthreadP.h')
-rw-r--r--nptl/pthreadP.h64
1 files changed, 63 insertions, 1 deletions
diff --git a/nptl/pthreadP.h b/nptl/pthreadP.h
index 954b54a..fd52b07 100644
--- a/nptl/pthreadP.h
+++ b/nptl/pthreadP.h
@@ -31,7 +31,7 @@
#include <pthread-functions.h>
#include <atomic.h>
#include <kernel-features.h>
-
+#include <errno.h>
/* Atomic operations on TLS memory. */
#ifndef THREAD_ATOMIC_CMPXCHG_VAL
@@ -589,4 +589,66 @@ extern void __wait_lookup_done (void) attribute_hidden;
# define USE_REQUEUE_PI(mut) 0
#endif
+/* Returns 0 if POL is a valid scheduling policy. */
+static inline int
+check_sched_policy_attr (int pol)
+{
+ if (pol == SCHED_OTHER || pol == SCHED_FIFO || pol == SCHED_RR)
+ return 0;
+
+ return EINVAL;
+}
+
+/* Returns 0 if PR is within the accepted range of priority values for
+ the scheduling policy POL or EINVAL otherwise. */
+static inline int
+check_sched_priority_attr (int pr, int pol)
+{
+ int min = __sched_get_priority_min (pol);
+ int max = __sched_get_priority_max (pol);
+
+ if (min >= 0 && max >= 0 && pr >= min && pr <= max)
+ return 0;
+
+ return EINVAL;
+}
+
+/* Returns 0 if ST is a valid stack size for a thread stack and EINVAL
+ otherwise. */
+static inline int
+check_stacksize_attr (size_t st)
+{
+ if (st >= PTHREAD_STACK_MIN)
+ return 0;
+
+ return EINVAL;
+}
+
+/* Defined in pthread_setaffinity.c. */
+extern size_t __kernel_cpumask_size attribute_hidden;
+extern int __determine_cpumask_size (pid_t tid);
+
+/* Returns 0 if CS and SZ are valid values for the cpuset and cpuset size
+ respectively. Otherwise it returns an error number. */
+static inline int
+check_cpuset_attr (const cpu_set_t *cs, const size_t sz)
+{
+ if (__kernel_cpumask_size == 0)
+ {
+ int res = __determine_cpumask_size (THREAD_SELF->tid);
+ if (res)
+ return res;
+ }
+
+ /* Check whether the new bitmask has any bit set beyond the
+ last one the kernel accepts. */
+ for (size_t cnt = __kernel_cpumask_size; cnt < sz; ++cnt)
+ if (((char *) cs)[cnt] != '\0')
+ /* Found a nonzero byte. This means the user request cannot be
+ fulfilled. */
+ return EINVAL;
+
+ return 0;
+}
+
#endif /* pthreadP.h */