This is the mail archive of the libc-hacker@sources.redhat.com mailing list for the glibc project.

Note that libc-hacker is a closed list. You may look at the archives of this list, but subscription and posting are not open.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]

CPU clock work


>From the ChangeLogs you might have seen that I've been working on the
CPU clocks today.  Initially I wanted to add only IA-64 support but
this was just too ugly.  Over last last months/years I simply added
x86 asm code wherever needed which led to many repetitions and extra
files.

So I cleaned this up now with the result that all one has to do to add
CPU clock support is to write an appropriate pair of hp-timing.{c,h}
files.  The rest should fall in place automatically.

I've tested it now on x86 and IA-64 (both have hp-timing.[ch] files
now).  I'll start building on Alpha now as a platform without these
files.


Somebody (Jakub, Dave) might want to test SPARC which now suddenly
should also have the functionality.  I append a little test program
which should print something like this:

0: t1 thread = 0.000236432
0: t process = 0.004160493
0: t2 thread = 0.000005296
0: t2process = 0.004218780
1: t1 thread = 0.000004708
1: t process = 0.004530499
1: t2 thread = 0.000001179
1: t2process = 0.004562147
2: t1 thread = 0.000004583


I don't know which other platform will have this support.  I can
imagine that some PPC incarnations have such a counter.  Alpha will
present a challenge which I gladly leave to somebody else.  Any of the
small processors (SH, Arm, Cris?) or S390, MIPS?  Anyway, whoever
knows the processor will have to do the job.


~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#include <pthread.h>
#include <stdio.h>
#include <time.h>

static void *
f (void *arg)
{
  clockid_t id;
  struct timespec t;
  pthread_getcpuclockid (pthread_self (), &id);
  clock_gettime (id, &t);
  printf ("%d: t1 thread = %ld.%09ld\n", (int) (long) arg, t.tv_sec, t.tv_nsec);
  clock_getcpuclockid (0, &id);
  clock_gettime (id, &t);
  printf ("%d: t process = %ld.%09ld\n", (int)(long)  arg, t.tv_sec, t.tv_nsec);
  t.tv_sec = t.tv_nsec = 0;
  pthread_getcpuclockid (pthread_self (), &id);
  clock_settime (id, &t);
  clock_gettime (id, &t);
  printf ("%d: t2 thread = %ld.%09ld\n", (int) (long) arg, t.tv_sec, t.tv_nsec);
  clock_getcpuclockid (0, &id);
  clock_gettime (id, &t);
  printf ("%d: t2process = %ld.%09ld\n", (int) (long) arg, t.tv_sec, t.tv_nsec);
  return NULL;
}

int
main ()
{
  int i;

  for (i = 0; i < 20; ++i)
    {
      pthread_t h;
      pthread_create (&h, NULL, f, (void *) (long) i);
      pthread_join (h, NULL);
    }
  return 0;
}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

-- 
---------------.                          ,-.   1325 Chesapeake Terrace
Ulrich Drepper  \    ,-------------------'   \  Sunnyvale, CA 94089 USA
Red Hat          `--' drepper at redhat.com   `------------------------


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]