about summary refs log tree commit diff
path: root/REORG.TODO/sysdeps/mach/hurd/getrusage.c
diff options
context:
space:
mode:
Diffstat (limited to 'REORG.TODO/sysdeps/mach/hurd/getrusage.c')
-rw-r--r--REORG.TODO/sysdeps/mach/hurd/getrusage.c91
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)