]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commit
gprofng: fix infinite recursion on calloc with multi-threaded applications
authorVladimir Mezentsev <vladimir.mezentsev@oracle.com>
Sun, 24 Mar 2024 01:31:03 +0000 (18:31 -0700)
committerVladimir Mezentsev <vladimir.mezentsev@oracle.com>
Mon, 25 Mar 2024 23:29:41 +0000 (16:29 -0700)
commit99c3fe52d237eae546d7de484d0cfbd615ac192c
tree6ddaba97d85156d9e873fde679af8bd0e9043fcf
parent02d02fc7924992ddd98073b95810b957efdc421a
gprofng: fix infinite recursion on calloc with multi-threaded applications

libcollector uses pthread_getspecific() and pthread_setspecific() to access
thread local memory. libcollector uses this memory to check that
interposed functions (like malloc, calloc or free) don't have recursion.
The first time we call calloc(), we call pthread_setspecific() to create
a thread-specific value.
On Ubuntu machine, pthread_setspecific() calls calloc(), and we cannot intercept
such recursion.
gcc supports thread-local storage. For example,
  static __thread int reentrance = 0;
I rewrote code using this instead of pthread_setspecific().

gprofng/ChangeLog
2024-03-23  Vladimir Mezentsev  <vladimir.mezentsev@oracle.com>

PR gprofng/31460
* libcollector/heaptrace.c: Use the __thread variable to check for
* reentry. Clean up code.
gprofng/libcollector/heaptrace.c