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


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

gprof and LinuxThreads


Dear all,

I have exchanged mail with some users about gprof(1) profiling of
multi-threaded programs under LinuxThreads.  The conclusions so far
are as follows:

1- Each thread needs to do "moncontrol(1);" at start-up in order
   to activate PC sampling for that thread.  This could easily be done
   in a profiling version of libpthread (libpthread_p.a ?)

2- PC sampling as implemented in sysdeps/posix/profil.c seems mostly
   thread-safe.  One could argue that the increment in profil_count

      if (i < nsamples)
        ++samples[i];

   should be made atomic (using the <atomicity.h> macros), although
   PC-sampling is statistical in nature and might tolerate occasional
   lost increments due to race conditions.

3- mcount() as implemented in gmon/mcount.c is protected against
   reentrant calls (via the compare_and_swap at the beginning),
   but will not produce correct function call counts if several
   threads call mcount() simultaneously (all but one return without
   incrementing any counters).  This is more problematic than 
   for profil_count, because users generally expect exact call counts
   from gprof.  But since mcount() can be called from a signal handler,
   mutual exclusion in mcount() is out of the question, and rewriting
   mcount() to use only atomic operations on lists seems quite hard.

A possible solution to 3- would be to have mcount as a weak alias for
__mcount.  Then, LinuxThreads could redefine mcount to perform locking
around __mcount, except if mcount is called from a signal handler.
(LinuxThreads already maintains a per-thread "in signal handler" bit
for other purposes.)

Any opinions?  I guess the question is: is it worth implementing 1-
in LinuxThreads before 3- is fixed?

All the best,

- Xavier


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