about summary refs log tree commit diff
path: root/sysdeps/mach/hurd/getrusage.c
diff options
context:
space:
mode:
Diffstat (limited to 'sysdeps/mach/hurd/getrusage.c')
-rw-r--r--sysdeps/mach/hurd/getrusage.c16
1 files changed, 15 insertions, 1 deletions
diff --git a/sysdeps/mach/hurd/getrusage.c b/sysdeps/mach/hurd/getrusage.c
index 970e1169c6..373486ffc2 100644
--- a/sysdeps/mach/hurd/getrusage.c
+++ b/sysdeps/mach/hurd/getrusage.c
@@ -1,5 +1,5 @@
 /* getrusage -- Get resource usage information about processes.  Hurd version.
-   Copyright (C) 1999 Free Software Foundation, Inc.
+   Copyright (C) 1999,2001 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
@@ -32,6 +32,7 @@ __getrusage (who, usage)
      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;
@@ -45,6 +46,14 @@ __getrusage (who, usage)
       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);
@@ -61,6 +70,11 @@ __getrusage (who, usage)
       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: