summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFlavio Cruz <flaviocruz@gmail.com>2023-04-17 00:46:36 -0400
committerSamuel Thibault <samuel.thibault@ens-lyon.org>2023-04-27 02:34:45 +0200
commitf9a76508ab2e0b54af753fb017838857a059b3c6 (patch)
treeda58667bd732cd99e60820a5d89c0792a7bcd422
parent2be047b97235796b9d4a5a51566d252384afc06e (diff)
Update task_basic_info and thread_basic_info to include time_value64_t data.
RPCs remain compatible with existing clients but if they know about the new size then we will populate the new fields. Message-Id: <ZDzPLCJccKeRB5Pd@mars.tail36e24.ts.net>
-rw-r--r--include/mach/task_info.h8
-rw-r--r--include/mach/thread_info.h6
-rw-r--r--kern/task.c16
-rw-r--r--kern/thread.c16
4 files changed, 37 insertions, 9 deletions
diff --git a/include/mach/task_info.h b/include/mach/task_info.h
index f448ee04..2631b04e 100644
--- a/include/mach/task_info.h
+++ b/include/mach/task_info.h
@@ -56,11 +56,19 @@ struct task_basic_info {
integer_t base_priority; /* base scheduling priority */
rpc_vm_size_t virtual_size; /* number of virtual pages */
rpc_vm_size_t resident_size; /* number of resident pages */
+ /* Deprecated, please use user_time64 */
rpc_time_value_t user_time; /* total user run time for
terminated threads */
+ /* Deprecated, please use system_time64 */
rpc_time_value_t system_time; /* total system run time for
terminated threads */
+ /* Deprecated, please use creation_time64 */
rpc_time_value_t creation_time; /* creation time stamp */
+ time_value64_t user_time64; /* total user run time for
+ terminated threads */
+ time_value64_t system_time64; /* total system run time for
+ terminated threads */
+ time_value64_t creation_time64; /* creation time stamp */
};
typedef struct task_basic_info task_basic_info_data_t;
diff --git a/include/mach/thread_info.h b/include/mach/thread_info.h
index 46c1ceca..4f322e0a 100644
--- a/include/mach/thread_info.h
+++ b/include/mach/thread_info.h
@@ -55,7 +55,9 @@ typedef integer_t thread_info_data_t[THREAD_INFO_MAX];
#define THREAD_BASIC_INFO 1 /* basic information */
struct thread_basic_info {
+ /* Deprecated, please use user_time64 */
rpc_time_value_t user_time; /* user run time */
+ /* Deprecated, please use system_time64 */
rpc_time_value_t system_time; /* system run time */
integer_t cpu_usage; /* scaled cpu usage percentage */
integer_t base_priority; /* base scheduling priority */
@@ -65,7 +67,11 @@ struct thread_basic_info {
integer_t suspend_count; /* suspend count for thread */
integer_t sleep_time; /* number of seconds that thread
has been sleeping */
+ /* Deprecated, please use creation_time64 */
rpc_time_value_t creation_time; /* time stamp of creation */
+ time_value64_t user_time64; /* user run time */
+ time_value64_t system_time64; /* system run time */
+ time_value64_t creation_time64; /* time stamp of creation */
};
typedef struct thread_basic_info thread_basic_info_data_t;
diff --git a/kern/task.c b/kern/task.c
index 65191f5d..9492b448 100644
--- a/kern/task.c
+++ b/kern/task.c
@@ -787,13 +787,13 @@ kern_return_t task_info(
{
task_basic_info_t basic_info;
- /* Allow *task_info_count to be two words smaller than
- the usual amount, because creation_time is a new member
- that some callers might not know about. */
+ /* Allow *task_info_count to be smaller than the provided amount
+ * that does not contain the new time_value64_t fields as some
+ * callers might not know about them yet. */
- if (*task_info_count < TASK_BASIC_INFO_COUNT - 2) {
+ if (*task_info_count <
+ TASK_BASIC_INFO_COUNT - 3 * sizeof(time_value64_t)/sizeof(integer_t))
return KERN_INVALID_ARGUMENT;
- }
basic_info = (task_basic_info_t) task_info_out;
@@ -813,6 +813,12 @@ kern_return_t task_info(
time_value64_t creation_time64;
read_time_stamp(&task->creation_time, &creation_time64);
TIME_VALUE64_TO_TIME_VALUE(&creation_time64, &basic_info->creation_time);
+ if (*task_info_count == TASK_BASIC_INFO_COUNT) {
+ /* Copy new time_value64_t fields */
+ basic_info->user_time64 = task->total_user_time;
+ basic_info->system_time64 = task->total_system_time;
+ basic_info->creation_time64 = creation_time64;
+ }
task_unlock(task);
if (*task_info_count > TASK_BASIC_INFO_COUNT)
diff --git a/kern/thread.c b/kern/thread.c
index 392d38f8..20c11024 100644
--- a/kern/thread.c
+++ b/kern/thread.c
@@ -1501,11 +1501,12 @@ kern_return_t thread_info(
if (flavor == THREAD_BASIC_INFO) {
thread_basic_info_t basic_info;
- /* Allow *thread_info_count to be one smaller than the
- usual amount, because creation_time is a new member
- that some callers might not know about. */
+ /* Allow *thread_info_count to be smaller than the provided amount
+ * that does not contain the new time_value64_t fields as some
+ * callers might not know about them yet. */
- if (*thread_info_count < THREAD_BASIC_INFO_COUNT - 1)
+ if (*thread_info_count <
+ THREAD_BASIC_INFO_COUNT - 3 * sizeof(time_value64_t)/sizeof(natural_t))
return KERN_INVALID_ARGUMENT;
basic_info = (thread_basic_info_t) thread_info_out;
@@ -1533,6 +1534,13 @@ kern_return_t thread_info(
read_time_stamp(&thread->creation_time, &creation_time);
TIME_VALUE64_TO_TIME_VALUE(&creation_time, &basic_info->creation_time);
+ if (*thread_info_count == THREAD_BASIC_INFO_COUNT) {
+ /* Copy new time_value64_t fields */
+ basic_info->user_time64 = user_time;
+ basic_info->system_time64 = user_time;
+ basic_info->creation_time64 = creation_time;
+ }
+
/*
* To calculate cpu_usage, first correct for timer rate,
* then for 5/8 ageing. The correction factor [3/5] is