aboutsummaryrefslogtreecommitdiff
path: root/linuxthreads/sysdeps/pthread/getcpuclockid.c
diff options
context:
space:
mode:
Diffstat (limited to 'linuxthreads/sysdeps/pthread/getcpuclockid.c')
-rw-r--r--linuxthreads/sysdeps/pthread/getcpuclockid.c21
1 files changed, 15 insertions, 6 deletions
diff --git a/linuxthreads/sysdeps/pthread/getcpuclockid.c b/linuxthreads/sysdeps/pthread/getcpuclockid.c
index fff1cb03ec..032caeb081 100644
--- a/linuxthreads/sysdeps/pthread/getcpuclockid.c
+++ b/linuxthreads/sysdeps/pthread/getcpuclockid.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 2000, 2001 Free Software Foundation, Inc.
+/* Copyright (C) 2000, 2001, 2004 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
@@ -19,18 +19,27 @@
#include <errno.h>
#include <pthread.h>
#include <sys/time.h>
+#include <time.h>
#include <internals.h>
int
pthread_getcpuclockid (pthread_t thread_id, clockid_t *clock_id)
{
- /* We don't allow any process ID but our own. */
- if (thread_handle (thread_id)->h_descr != thread_self ())
- return EPERM;
-
#ifdef CLOCK_THREAD_CPUTIME_ID
+ /* We need to store the thread ID in the CLOCKID variable together
+ with a number identifying the clock. We reserve the low 3 bits
+ for the clock ID and the rest for the thread ID. This is
+ problematic if the thread ID is too large. But 29 bits should be
+ fine.
+
+ If some day more clock IDs are needed the ID part can be
+ enlarged. The IDs are entirely internal. */
+ if (2 * PTHREAD_THREADS_MAX
+ >= 1 << (8 * sizeof (*clock_id) - CLOCK_IDFIELD_SIZE))
+ return ERANGE;
+
/* Store the number. */
- *clock_id = CLOCK_THREAD_CPUTIME_ID;
+ *clock_id = CLOCK_THREAD_CPUTIME_ID | (thread_id << CLOCK_IDFIELD_SIZE);
return 0;
#else