diff options
Diffstat (limited to 'REORG.TODO/sysdeps/mach/hurd/getrusage.c')
-rw-r--r-- | REORG.TODO/sysdeps/mach/hurd/getrusage.c | 91 |
1 files changed, 91 insertions, 0 deletions
diff --git a/REORG.TODO/sysdeps/mach/hurd/getrusage.c b/REORG.TODO/sysdeps/mach/hurd/getrusage.c new file mode 100644 index 0000000000..7849518f39 --- /dev/null +++ b/REORG.TODO/sysdeps/mach/hurd/getrusage.c @@ -0,0 +1,91 @@ +/* getrusage -- Get resource usage information about processes. Hurd version. + Copyright (C) 1999-2017 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 + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +#include <errno.h> +#include <string.h> +#include <sys/resource.h> +#include <mach.h> +#include <mach/task_info.h> +#include <hurd.h> + +/* Return resource usage information on process indicated by WHO + and put it in *USAGE. Returns 0 for success, -1 for failure. */ +int +__getrusage (enum __rusage_who who, struct rusage *usage) +{ + struct task_basic_info bi; + struct task_events_info ei; + struct task_thread_times_info tti; + mach_msg_type_number_t count; + error_t err; + + switch (who) + { + case RUSAGE_SELF: + count = TASK_BASIC_INFO_COUNT; + err = __task_info (__mach_task_self (), TASK_BASIC_INFO, + (task_info_t) &bi, &count); + if (err) + return __hurd_fail (err); + + count = TASK_EVENTS_INFO_COUNT; + err = __task_info (__mach_task_self (), TASK_EVENTS_INFO, + (task_info_t) &ei, &count); + if (err == KERN_INVALID_ARGUMENT) /* microkernel doesn't implement it */ + memset (&ei, 0, sizeof ei); + else if (err) + return __hurd_fail (err); + + count = TASK_THREAD_TIMES_INFO_COUNT; + err = __task_info (__mach_task_self (), TASK_THREAD_TIMES_INFO, + (task_info_t) &tti, &count); + if (err) + return __hurd_fail (err); + + time_value_add (&bi.user_time, &tti.user_time); + time_value_add (&bi.system_time, &tti.system_time); + + memset (usage, 0, sizeof (struct rusage)); + + usage->ru_utime.tv_sec = bi.user_time.seconds; + usage->ru_utime.tv_usec = bi.user_time.microseconds; + usage->ru_stime.tv_sec = bi.system_time.seconds; + usage->ru_stime.tv_usec = bi.system_time.microseconds; + + /* These statistics map only approximately. */ + usage->ru_majflt = ei.pageins; + usage->ru_minflt = ei.faults - ei.pageins; + usage->ru_msgsnd = ei.messages_sent; /* Mach IPC, not SysV IPC */ + usage->ru_msgrcv = ei.messages_received; /* Mach IPC, not SysV IPC */ + break; + + case RUSAGE_CHILDREN: + /* XXX Not implemented yet. However, zero out USAGE to be + consistent with the wait3 and wait4 functions. */ + memset (usage, 0, sizeof (struct rusage)); + + break; + + default: + return EINVAL; + } + + return 0; +} + +weak_alias (__getrusage, getrusage) |