Browse Source

support cputime clocks for processes/threads other than self

apparently these features have been in Linux for a while now, so it
makes sense to support them. the bit twiddling seems utterly illogical
and wasteful, especially the negation, but that's how the kernel folks
chose to encode pids/tids into the clock id.
Rich Felker 11 years ago
parent
commit
ea200e38bd
2 changed files with 7 additions and 3 deletions
  1. 2 1
      src/thread/pthread_getcpuclockid.c
  2. 5 2
      src/time/clock_getcpuclockid.c

+ 2 - 1
src/thread/pthread_getcpuclockid.c

@@ -2,5 +2,6 @@
 
 int pthread_getcpuclockid(pthread_t t, clockid_t *clockid)
 {
-	return ENOSYS;
+	*clockid = (-t->tid-1)*8U + 6;
+	return 0;
 }

+ 5 - 2
src/time/clock_getcpuclockid.c

@@ -5,7 +5,10 @@
 
 int clock_getcpuclockid(pid_t pid, clockid_t *clk)
 {
-	if (pid && pid != getpid()) return EPERM;
-	*clk = CLOCK_PROCESS_CPUTIME_ID;
+	struct timespec ts;
+	clockid_t id = (-pid-1)*8U + 2;
+	int ret = __syscall(SYS_clock_getres, id, &ts);
+	if (ret) return -ret;
+	*clk = id;
 	return 0;
 }