From 294761ca8d05ec2a16cc0b5a19c5c7fd9ebd6473 Mon Sep 17 00:00:00 2001 From: Sebastian Huber Date: Fri, 3 Jan 2025 04:36:15 +0100 Subject: [PATCH] posix: Improve clock_gettime() Return CPU usage values for CLOCK_PROCESS_CPUTIME_ID and CLOCK_THREAD_CPUTIME_ID. --- .../cpuuse => include/rtems}/cpuuseimpl.h | 0 cpukit/libmisc/cpuuse/cpuusagedata.c | 2 +- cpukit/libmisc/cpuuse/cpuusagereport.c | 3 +- cpukit/libmisc/cpuuse/cpuusagereset.c | 3 +- cpukit/libmisc/cpuuse/cpuusagetop.c | 3 +- cpukit/posix/src/clockgettime.c | 29 +++++++++++++++---- testsuites/psxtests/psxclock/init.c | 22 ++++++++------ 7 files changed, 40 insertions(+), 22 deletions(-) rename cpukit/{libmisc/cpuuse => include/rtems}/cpuuseimpl.h (100%) diff --git a/cpukit/libmisc/cpuuse/cpuuseimpl.h b/cpukit/include/rtems/cpuuseimpl.h similarity index 100% rename from cpukit/libmisc/cpuuse/cpuuseimpl.h rename to cpukit/include/rtems/cpuuseimpl.h diff --git a/cpukit/libmisc/cpuuse/cpuusagedata.c b/cpukit/libmisc/cpuuse/cpuusagedata.c index fa39a6d754..8b9eb1a9ae 100644 --- a/cpukit/libmisc/cpuuse/cpuusagedata.c +++ b/cpukit/libmisc/cpuuse/cpuusagedata.c @@ -39,6 +39,6 @@ #include "config.h" #endif -#include "cpuuseimpl.h" +#include Timestamp_Control CPU_usage_Uptime_at_last_reset; diff --git a/cpukit/libmisc/cpuuse/cpuusagereport.c b/cpukit/libmisc/cpuuse/cpuusagereport.c index bdeee375e3..256c539fa9 100644 --- a/cpukit/libmisc/cpuuse/cpuusagereport.c +++ b/cpukit/libmisc/cpuuse/cpuusagereport.c @@ -46,12 +46,11 @@ #include #include +#include #include #include #include -#include "cpuuseimpl.h" - typedef struct { const rtems_printer *printer; Timestamp_Control total; diff --git a/cpukit/libmisc/cpuuse/cpuusagereset.c b/cpukit/libmisc/cpuuse/cpuusagereset.c index e56ab3cded..c8331a054e 100644 --- a/cpukit/libmisc/cpuuse/cpuusagereset.c +++ b/cpukit/libmisc/cpuuse/cpuusagereset.c @@ -40,14 +40,13 @@ #endif #include +#include #include #include #include #include #include -#include "cpuuseimpl.h" - static bool CPU_usage_Per_thread_handler( Thread_Control *the_thread, void *arg diff --git a/cpukit/libmisc/cpuuse/cpuusagetop.c b/cpukit/libmisc/cpuuse/cpuusagetop.c index eed89ad211..943fc39037 100644 --- a/cpukit/libmisc/cpuuse/cpuusagetop.c +++ b/cpukit/libmisc/cpuuse/cpuusagetop.c @@ -53,6 +53,7 @@ #include #include +#include #include #include #include @@ -64,8 +65,6 @@ #include #include -#include "cpuuseimpl.h" - /* * Use a struct for all data to allow more than one top and to support the * thread iterator. diff --git a/cpukit/posix/src/clockgettime.c b/cpukit/posix/src/clockgettime.c index b3d7d8e788..75fcda5790 100644 --- a/cpukit/posix/src/clockgettime.c +++ b/cpukit/posix/src/clockgettime.c @@ -5,10 +5,12 @@ * * @ingroup POSIXAPI * - * @brief Retrieves the Specified Clock Time + * @brief This source file contains the implementation of clock_gettime(). */ /* + * Copyright (C) 2024 embedded brains GmbH & Co. KG + * * COPYRIGHT (c) 1989-2007. * On-Line Applications Research Corporation (OAR). * @@ -41,6 +43,9 @@ #include #include +#include +#include +#include #include #include @@ -70,17 +75,29 @@ int clock_gettime( #ifdef _POSIX_CPUTIME if ( clock_id == CLOCK_PROCESS_CPUTIME_ID ) { - _Timecounter_Nanouptime( tp ); + Timestamp_Control uptime; + Timestamp_Control last_reset; + Timestamp_Control process_time; + + last_reset = CPU_usage_Uptime_at_last_reset; + _TOD_Get_uptime( &uptime ); + _Timestamp_Subtract( &last_reset, &uptime, &process_time ); + _Timestamp_To_timespec( &process_time, tp ); return 0; } #endif #ifdef _POSIX_THREAD_CPUTIME - if ( clock_id == CLOCK_THREAD_CPUTIME_ID ) - rtems_set_errno_and_return_minus_one( ENOSYS ); + if ( clock_id == CLOCK_THREAD_CPUTIME_ID ) { + Timestamp_Control used; + + used = _Thread_Get_CPU_time_used_after_last_reset( + _Thread_Get_executing() + ); + _Timestamp_To_timespec( &used, tp ); + return 0; + } #endif rtems_set_errno_and_return_minus_one( EINVAL ); - - return 0; } diff --git a/testsuites/psxtests/psxclock/init.c b/testsuites/psxtests/psxclock/init.c index eb2f1d130c..781a7ed74a 100644 --- a/testsuites/psxtests/psxclock/init.c +++ b/testsuites/psxtests/psxclock/init.c @@ -386,7 +386,19 @@ static rtems_task Init( /* print new times to make sure it has changed and we can get the realtime */ sc = clock_gettime( CLOCK_PROCESS_CPUTIME_ID, &tv ); rtems_test_assert( !sc ); - printf("Time since boot: (%" PRIdtime_t ", %ld)\n", tv.tv_sec,tv.tv_nsec ); + printf( + "Time since last CPU usage reset: (%" PRIdtime_t ", %ld)\n", + tv.tv_sec, + tv.tv_nsec + ); + + sc = clock_gettime( CLOCK_THREAD_CPUTIME_ID, &tv ); + rtems_test_assert( !sc ); + printf( + "CPU time used since last CPU usage reset: (%" PRIdtime_t ", %ld)\n", + tv.tv_sec, + tv.tv_nsec + ); sc = clock_gettime( CLOCK_REALTIME, &tv ); rtems_test_assert( !sc ); @@ -499,14 +511,6 @@ static rtems_task Init( printf( ctime( &tv.tv_sec ) ); empty_line(); - puts( "clock_gettime - CLOCK_THREAD_CPUTIME_ID -- ENOSYS" ); - #if defined(_POSIX_THREAD_CPUTIME) - { - struct timespec tp; - sc = clock_gettime( CLOCK_THREAD_CPUTIME_ID, &tp ); - check_enosys( sc ); - } - #endif puts( "clock_settime - CLOCK_PROCESS_CPUTIME_ID -- ENOSYS" ); #if defined(_POSIX_CPUTIME)