From 9939a13667567dd4b0c3496953d99b87a6995208 Mon Sep 17 00:00:00 2001 From: David Xu Date: Sat, 22 Mar 2008 09:59:20 +0000 Subject: [PATCH] Add POSIX pthread API pthread_getcpuclockid() to get a thread's cpu time clock id. --- include/pthread.h | 1 + include/time.h | 1 + lib/libthr/pthread.map | 2 ++ lib/libthr/thread/Makefile.inc | 1 + lib/libthr/thread/thr_getcpuclockid.c | 47 +++++++++++++++++++++++++++ 5 files changed, 52 insertions(+) create mode 100644 lib/libthr/thread/thr_getcpuclockid.c diff --git a/include/pthread.h b/include/pthread.h index 361b45ce91e0..215b88258fec 100644 --- a/include/pthread.h +++ b/include/pthread.h @@ -185,6 +185,7 @@ int pthread_detach(pthread_t); int pthread_equal(pthread_t, pthread_t); void pthread_exit(void *) __dead2; void *pthread_getspecific(pthread_key_t); +int pthread_getcpuclockid(pthread_t, clockid_t *); int pthread_join(pthread_t, void **); int pthread_key_create(pthread_key_t *, void (*) (void *)); diff --git a/include/time.h b/include/time.h index 69a41c2451ee..d28d9b48b905 100644 --- a/include/time.h +++ b/include/time.h @@ -108,6 +108,7 @@ typedef __timer_t timer_t; #define CLOCK_MONOTONIC_PRECISE 11 /* FreeBSD-specific. */ #define CLOCK_MONOTONIC_FAST 12 /* FreeBSD-specific. */ #define CLOCK_SECOND 13 /* FreeBSD-specific. */ +#define CLOCK_THREAD_CPUTIME_ID 14 #endif /* !defined(CLOCK_REALTIME) && __POSIX_VISIBLE >= 200112 */ #if !defined(TIMER_ABSTIME) && __POSIX_VISIBLE >= 200112 diff --git a/lib/libthr/pthread.map b/lib/libthr/pthread.map index 3cc3927aa4bf..21a013590845 100644 --- a/lib/libthr/pthread.map +++ b/lib/libthr/pthread.map @@ -271,6 +271,7 @@ FBSDprivate_1.0 { _pthread_exit; _pthread_getaffinity_np; _pthread_getconcurrency; + _pthread_getcpuclockid; _pthread_getprio; _pthread_getschedparam; _pthread_getspecific; @@ -395,6 +396,7 @@ FBSD_1.1 { pthread_attr_getaffinity_np; pthread_attr_setaffinity_np; pthread_getaffinity_np; + pthread_getcpuclockid; pthread_setaffinity_np; pthread_mutex_getspinloops_np; pthread_mutex_getyieldloops_np; diff --git a/lib/libthr/thread/Makefile.inc b/lib/libthr/thread/Makefile.inc index 6a5105ff0c97..4ce90b55dcae 100644 --- a/lib/libthr/thread/Makefile.inc +++ b/lib/libthr/thread/Makefile.inc @@ -20,6 +20,7 @@ SRCS+= \ thr_exit.c \ thr_fork.c \ thr_getprio.c \ + thr_getcpuclockid.c \ thr_getschedparam.c \ thr_info.c \ thr_init.c \ diff --git a/lib/libthr/thread/thr_getcpuclockid.c b/lib/libthr/thread/thr_getcpuclockid.c new file mode 100644 index 000000000000..68f88d52a7e0 --- /dev/null +++ b/lib/libthr/thread/thr_getcpuclockid.c @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2008 David Xu + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY JOHN BIRRELL AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $FreeBSD$ + */ + +#include "namespace.h" +#include +#include +#include +#include "un-namespace.h" + +#include "thr_private.h" + +__weak_reference(_pthread_getcpuclockid, pthread_getcpuclockid); + +int +_pthread_getcpuclockid(pthread_t pthread, clockid_t *clock_id) +{ + if (pthread == NULL) + return (EINVAL); + + *clock_id = CLOCK_THREAD_CPUTIME_ID; + return (0); +}