From dc0879876465581722083e8f2058028e2d98fd71 Mon Sep 17 00:00:00 2001 From: guoshichao Date: Thu, 22 Jun 2023 17:31:01 +0800 Subject: [PATCH] libs/libc/pthread: add the implementation of pthread_getcpuclockid 1. the implementation can pass the ltp/open_posix_testsuite/pthread_getcpuclockid testcases 2. the modification are referred to https://pubs.opengroup.org/onlinepubs/9699919799/functions/pthread_getcpuclockid.html Signed-off-by: guoshichao --- include/pthread.h | 2 + libs/libc/pthread/Make.defs | 2 +- libs/libc/pthread/pthread_getcpuclockid.c | 63 +++++++++++++++++++++++ 3 files changed, 66 insertions(+), 1 deletion(-) create mode 100644 libs/libc/pthread/pthread_getcpuclockid.c diff --git a/include/pthread.h b/include/pthread.h index 2895736f58..a6eb1e69e7 100644 --- a/include/pthread.h +++ b/include/pthread.h @@ -721,6 +721,8 @@ int pthread_spin_trylock(FAR pthread_spinlock_t *lock); int pthread_spin_unlock(FAR pthread_spinlock_t *lock); #endif +int pthread_getcpuclockid(pthread_t thread_id, FAR clockid_t *clock_id); + int pthread_atfork(CODE void (*prepare)(void), CODE void (*parent)(void), CODE void (*child)(void)); diff --git a/libs/libc/pthread/Make.defs b/libs/libc/pthread/Make.defs index 99bdb79ab2..8676f00c07 100644 --- a/libs/libc/pthread/Make.defs +++ b/libs/libc/pthread/Make.defs @@ -56,7 +56,7 @@ CSRCS += pthread_rwlockattr_init.c pthread_rwlockattr_destroy.c CSRCS += pthread_rwlockattr_getpshared.c pthread_rwlockattr_setpshared.c CSRCS += pthread_rwlock.c pthread_rwlock_rdlock.c pthread_rwlock_wrlock.c CSRCS += pthread_setcancelstate.c pthread_setcanceltype.c -CSRCS += pthread_testcancel.c +CSRCS += pthread_testcancel.c pthread_getcpuclockid.c ifeq ($(CONFIG_SMP),y) CSRCS += pthread_attr_getaffinity.c pthread_attr_setaffinity.c diff --git a/libs/libc/pthread/pthread_getcpuclockid.c b/libs/libc/pthread/pthread_getcpuclockid.c new file mode 100644 index 0000000000..a3fa78acff --- /dev/null +++ b/libs/libc/pthread/pthread_getcpuclockid.c @@ -0,0 +1,63 @@ +/**************************************************************************** + * libs/libc/pthread/pthread_getcpuclockid.c + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include +#include +#include +#include + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: pthread_getcpuclockid + * + * Description: + * The pthread_getcpuclockid() function using to access a thread CPU-time + * clock + * + * Input Parameters: + * thread_id - The id of the thread to fetch the running time + * clockid - The clockid with type CLOCK_THREAD_CPUTIME_ID that required + * + * Returned Value: + * Return 0 on success, return error number on error + * + ****************************************************************************/ + +int pthread_getcpuclockid(pthread_t thread_id, FAR clockid_t *clockid) +{ + if (pthread_kill(thread_id, 0) != 0) + { + return ESRCH; + } + + /* for pthread_getcpuclockid, the clock type are + * CLOCK_THREAD_CPUTIME_ID + */ + + *clockid = (thread_id << CLOCK_SHIFT) | CLOCK_THREAD_CPUTIME_ID; + return OK; +}