@@ -62,11 +62,12 @@ static ModuleInterface module_interface = {
62
62
static CollectorInterface * collector_interface = NULL ;
63
63
static int heap_mode = 0 ;
64
64
static CollectorModule heap_hndl = COLLECTOR_MODULE_ERR ;
65
- static unsigned heap_key = COLLECTOR_TSD_INVALID_KEY ;
65
+ static const Heap_packet heap_packet0 = { .comm .tsize = sizeof ( Heap_packet ) };
66
+ static __thread int reentrance = 0 ;
66
67
67
- #define CHCK_REENTRANCE ( x ) ( !heap_mode || ((x) = collector_interface->getKey( heap_key )) == NULL || (*(x) != 0) )
68
- #define PUSH_REENTRANCE ( x ) ((*(x)) ++)
69
- #define POP_REENTRANCE ( x ) ((*(x)) --)
68
+ #define CHCK_REENTRANCE ( !heap_mode || reentrance != 0 )
69
+ #define PUSH_REENTRANCE (reentrance ++)
70
+ #define POP_REENTRANCE (reentrance --)
70
71
#define gethrtime collector_interface->getHiResTime
71
72
72
73
static void * (* __real_malloc )(size_t ) = NULL ;
@@ -81,14 +82,6 @@ void *__libc_malloc (size_t);
81
82
void __libc_free (void * );
82
83
void * __libc_realloc (void * , size_t );
83
84
84
- static void
85
- collector_memset (void * s , int c , size_t n )
86
- {
87
- unsigned char * s1 = s ;
88
- while (n -- )
89
- * s1 ++ = (unsigned char ) c ;
90
- }
91
-
92
85
void
93
86
__collector_module_init (CollectorInterface * _collector_interface )
94
87
{
@@ -139,14 +132,6 @@ open_experiment (const char *exp)
139
132
if (params == NULL ) /* Heap data collection not specified */
140
133
return COL_ERROR_HEAPINIT ;
141
134
142
- heap_key = collector_interface -> createKey (sizeof ( int ), NULL , NULL );
143
- if (heap_key == (unsigned ) - 1 )
144
- {
145
- Tprintf (0 , "heaptrace: TSD key create failed.\n" );
146
- collector_interface -> writeLog ("<event kind=\"%s\" id=\"%d\">TSD key not created</event>\n" ,
147
- SP_JCMD_CERROR , COL_ERROR_HEAPINIT );
148
- return COL_ERROR_HEAPINIT ;
149
- }
150
135
collector_interface -> writeLog ("<profile name=\"%s\">\n" , SP_JCMD_HEAPTRACE );
151
136
collector_interface -> writeLog (" <profdata fname=\"%s\"/>\n" ,
152
137
module_interface .description );
@@ -205,7 +190,6 @@ static int
205
190
close_experiment (void )
206
191
{
207
192
heap_mode = 0 ;
208
- heap_key = COLLECTOR_TSD_INVALID_KEY ;
209
193
Tprintf (0 , "heaptrace: close_experiment\n" );
210
194
return 0 ;
211
195
}
@@ -215,7 +199,6 @@ detach_experiment (void)
215
199
/* fork child. Clean up state but don't write to experiment */
216
200
{
217
201
heap_mode = 0 ;
218
- heap_key = COLLECTOR_TSD_INVALID_KEY ;
219
202
Tprintf (0 , "heaptrace: detach_experiment\n" );
220
203
return 0 ;
221
204
}
@@ -265,74 +248,67 @@ void *
265
248
malloc (size_t size )
266
249
{
267
250
void * ret ;
268
- int * guard ;
269
- Heap_packet hpacket ;
270
251
/* Linux startup workaround */
271
252
if (!heap_mode )
272
253
{
273
- void * ppp = (void * ) __libc_malloc (size );
274
- Tprintf (DBG_LT4 , "heaptrace: LINUX malloc(%ld, %p)... \n" , (long ) size , ppp );
275
- return ppp ;
254
+ ret = (void * ) __libc_malloc (size );
255
+ Tprintf (DBG_LT4 , "heaptrace: LINUX malloc(%ld, %p)\n" , (long ) size , ret );
256
+ return ret ;
276
257
}
277
258
if (NULL_PTR (malloc ))
278
259
init_heap_intf ();
279
- if (CHCK_REENTRANCE ( guard ) )
260
+ if (CHCK_REENTRANCE )
280
261
{
281
262
ret = (void * ) CALL_REAL (malloc )(size );
282
263
Tprintf (DBG_LT4 , "heaptrace: real malloc(%ld) = %p\n" , (long ) size , ret );
283
264
return ret ;
284
265
}
285
- PUSH_REENTRANCE (guard );
286
-
287
- ret = (void * ) CALL_REAL (malloc )(size );
288
- collector_memset (& hpacket , 0 , sizeof ( Heap_packet ));
289
- hpacket .comm .tsize = sizeof ( Heap_packet );
266
+ PUSH_REENTRANCE ;
267
+ Heap_packet hpacket = heap_packet0 ;
290
268
hpacket .comm .tstamp = gethrtime ();
269
+ ret = (void * ) CALL_REAL (malloc )(size );
291
270
hpacket .mtype = MALLOC_TRACE ;
292
271
hpacket .size = (Size_type ) size ;
293
272
hpacket .vaddr = (intptr_t ) ret ;
294
- hpacket .comm .frinfo = collector_interface -> getFrameInfo (heap_hndl , hpacket .comm .tstamp , FRINFO_FROM_STACK , & hpacket );
273
+ hpacket .comm .frinfo = collector_interface -> getFrameInfo (heap_hndl ,
274
+ hpacket .comm .tstamp , FRINFO_FROM_STACK , & hpacket );
295
275
collector_interface -> writeDataRecord (heap_hndl , (Common_packet * ) & hpacket );
296
- POP_REENTRANCE ( guard ) ;
297
- return ( void * ) ret ;
276
+ POP_REENTRANCE ;
277
+ return ret ;
298
278
}
299
279
300
280
/*------------------------------------------------------------- free */
301
281
302
282
void
303
283
free (void * ptr )
304
284
{
305
- int * guard ;
306
- Heap_packet hpacket ;
307
285
/* Linux startup workaround */
308
286
if (!heap_mode )
309
287
{
310
288
// Tprintf(DBG_LT4,"heaptrace: LINUX free(%p)...\n",ptr);
311
289
__libc_free (ptr );
312
290
return ;
313
291
}
314
- if (NULL_PTR (malloc ))
292
+ if (NULL_PTR (free ))
315
293
init_heap_intf ();
316
- if (CHCK_REENTRANCE (guard ))
294
+ if (ptr == NULL )
295
+ return ;
296
+ if (CHCK_REENTRANCE )
317
297
{
318
298
CALL_REAL (free )(ptr );
319
299
return ;
320
300
}
321
- if (ptr == NULL )
322
- return ;
323
- PUSH_REENTRANCE (guard );
324
-
301
+ PUSH_REENTRANCE ;
325
302
/* Get a timestamp before 'free' to enforce consistency */
326
- hrtime_t ts = gethrtime ();
303
+ Heap_packet hpacket = heap_packet0 ;
304
+ hpacket .comm .tstamp = gethrtime ();
327
305
CALL_REAL (free )(ptr );
328
- collector_memset (& hpacket , 0 , sizeof ( Heap_packet ));
329
- hpacket .comm .tsize = sizeof ( Heap_packet );
330
- hpacket .comm .tstamp = ts ;
331
306
hpacket .mtype = FREE_TRACE ;
332
307
hpacket .vaddr = (intptr_t ) ptr ;
333
- hpacket .comm .frinfo = collector_interface -> getFrameInfo (heap_hndl , hpacket .comm .tstamp , FRINFO_FROM_STACK , & hpacket );
308
+ hpacket .comm .frinfo = collector_interface -> getFrameInfo (heap_hndl ,
309
+ hpacket .comm .tstamp , FRINFO_FROM_STACK , & hpacket );
334
310
collector_interface -> writeDataRecord (heap_hndl , (Common_packet * ) & hpacket );
335
- POP_REENTRANCE ( guard ) ;
311
+ POP_REENTRANCE ;
336
312
return ;
337
313
}
338
314
@@ -341,9 +317,6 @@ void *
341
317
realloc (void * ptr , size_t size )
342
318
{
343
319
void * ret ;
344
- int * guard ;
345
- Heap_packet hpacket ;
346
-
347
320
/* Linux startup workaround */
348
321
if (!heap_mode )
349
322
{
@@ -354,51 +327,48 @@ realloc (void *ptr, size_t size)
354
327
}
355
328
if (NULL_PTR (realloc ))
356
329
init_heap_intf ();
357
- if (CHCK_REENTRANCE ( guard ) )
330
+ if (CHCK_REENTRANCE )
358
331
{
359
332
ret = (void * ) CALL_REAL (realloc )(ptr , size );
360
333
return ret ;
361
334
}
362
- PUSH_REENTRANCE (guard );
363
- hrtime_t ts = gethrtime ();
335
+ PUSH_REENTRANCE ;
336
+ Heap_packet hpacket = heap_packet0 ;
337
+ hpacket .comm .tstamp = gethrtime ();
364
338
ret = (void * ) CALL_REAL (realloc )(ptr , size );
365
- collector_memset (& hpacket , 0 , sizeof ( Heap_packet ));
366
- hpacket .comm .tsize = sizeof ( Heap_packet );
367
- hpacket .comm .tstamp = ts ;
368
339
hpacket .mtype = REALLOC_TRACE ;
369
340
hpacket .size = (Size_type ) size ;
370
341
hpacket .vaddr = (intptr_t ) ret ;
371
- hpacket .comm .frinfo = collector_interface -> getFrameInfo (heap_hndl , hpacket .comm .tstamp , FRINFO_FROM_STACK , & hpacket );
342
+ hpacket .comm .frinfo = collector_interface -> getFrameInfo (heap_hndl ,
343
+ hpacket .comm .tstamp , FRINFO_FROM_STACK , & hpacket );
372
344
collector_interface -> writeDataRecord (heap_hndl , (Common_packet * ) & hpacket );
373
- POP_REENTRANCE ( guard ) ;
374
- return ( void * ) ret ;
345
+ POP_REENTRANCE ;
346
+ return ret ;
375
347
}
376
348
377
349
/*------------------------------------------------------------- memalign */
378
350
void *
379
351
memalign (size_t align , size_t size )
380
352
{
381
353
void * ret ;
382
- int * guard ;
383
- Heap_packet hpacket ;
384
354
if (NULL_PTR (memalign ))
385
355
init_heap_intf ();
386
- if (CHCK_REENTRANCE ( guard ) )
356
+ if (CHCK_REENTRANCE )
387
357
{
388
358
ret = (void * ) CALL_REAL (memalign )(align , size );
389
359
return ret ;
390
360
}
391
- PUSH_REENTRANCE (guard );
392
- ret = (void * ) CALL_REAL (memalign )(align , size );
393
- collector_memset (& hpacket , 0 , sizeof ( Heap_packet ));
394
- hpacket .comm .tsize = sizeof ( Heap_packet );
361
+ PUSH_REENTRANCE ;
362
+ Heap_packet hpacket = heap_packet0 ;
395
363
hpacket .comm .tstamp = gethrtime ();
364
+ ret = (void * ) CALL_REAL (memalign )(align , size );
396
365
hpacket .mtype = MALLOC_TRACE ;
397
366
hpacket .size = (Size_type ) size ;
398
367
hpacket .vaddr = (intptr_t ) ret ;
399
- hpacket .comm .frinfo = collector_interface -> getFrameInfo (heap_hndl , hpacket .comm .tstamp , FRINFO_FROM_STACK , & hpacket );
368
+ hpacket .comm .frinfo = collector_interface -> getFrameInfo (heap_hndl ,
369
+ hpacket .comm .tstamp , FRINFO_FROM_STACK , & hpacket );
400
370
collector_interface -> writeDataRecord (heap_hndl , (Common_packet * ) & hpacket );
401
- POP_REENTRANCE ( guard ) ;
371
+ POP_REENTRANCE ;
402
372
return ret ;
403
373
}
404
374
@@ -408,26 +378,24 @@ void *
408
378
valloc (size_t size )
409
379
{
410
380
void * ret ;
411
- int * guard ;
412
- Heap_packet hpacket ;
413
- if (NULL_PTR (memalign ))
381
+ if (NULL_PTR (valloc ))
414
382
init_heap_intf ();
415
- if (CHCK_REENTRANCE ( guard ) )
383
+ if (CHCK_REENTRANCE )
416
384
{
417
385
ret = (void * ) CALL_REAL (valloc )(size );
418
386
return ret ;
419
387
}
420
- PUSH_REENTRANCE (guard );
421
- ret = (void * ) CALL_REAL (valloc )(size );
422
- collector_memset (& hpacket , 0 , sizeof ( Heap_packet ));
423
- hpacket .comm .tsize = sizeof ( Heap_packet );
388
+ PUSH_REENTRANCE ;
389
+ Heap_packet hpacket = heap_packet0 ;
424
390
hpacket .comm .tstamp = gethrtime ();
391
+ ret = (void * ) CALL_REAL (valloc )(size );
425
392
hpacket .mtype = MALLOC_TRACE ;
426
393
hpacket .size = (Size_type ) size ;
427
394
hpacket .vaddr = (intptr_t ) ret ;
428
- hpacket .comm .frinfo = collector_interface -> getFrameInfo (heap_hndl , hpacket .comm .tstamp , FRINFO_FROM_STACK , & hpacket );
395
+ hpacket .comm .frinfo = collector_interface -> getFrameInfo (heap_hndl ,
396
+ hpacket .comm .tstamp , FRINFO_FROM_STACK , & hpacket );
429
397
collector_interface -> writeDataRecord (heap_hndl , (Common_packet * ) & hpacket );
430
- POP_REENTRANCE ( guard ) ;
398
+ POP_REENTRANCE ;
431
399
return ret ;
432
400
}
433
401
@@ -436,30 +404,28 @@ void *
436
404
calloc (size_t size , size_t esize )
437
405
{
438
406
void * ret ;
439
- int * guard ;
440
- Heap_packet hpacket ;
441
407
if (NULL_PTR (calloc ))
442
408
{
443
409
if (in_init_heap_intf != 0 )
444
410
return NULL ; // Terminate infinite loop
445
411
init_heap_intf ();
446
412
}
447
- if (CHCK_REENTRANCE ( guard ) )
413
+ if (CHCK_REENTRANCE )
448
414
{
449
415
ret = (void * ) CALL_REAL (calloc )(size , esize );
450
416
return ret ;
451
417
}
452
- PUSH_REENTRANCE (guard );
453
- ret = (void * ) CALL_REAL (calloc )(size , esize );
454
- collector_memset (& hpacket , 0 , sizeof ( Heap_packet ));
455
- hpacket .comm .tsize = sizeof ( Heap_packet );
418
+ PUSH_REENTRANCE ;
419
+ Heap_packet hpacket = heap_packet0 ;
456
420
hpacket .comm .tstamp = gethrtime ();
421
+ ret = (void * ) CALL_REAL (calloc )(size , esize );
457
422
hpacket .mtype = MALLOC_TRACE ;
458
423
hpacket .size = (Size_type ) (size * esize );
459
424
hpacket .vaddr = (intptr_t ) ret ;
460
- hpacket .comm .frinfo = collector_interface -> getFrameInfo (heap_hndl , hpacket .comm .tstamp , FRINFO_FROM_STACK , & hpacket );
425
+ hpacket .comm .frinfo = collector_interface -> getFrameInfo (heap_hndl ,
426
+ hpacket .comm .tstamp , FRINFO_FROM_STACK , & hpacket );
461
427
collector_interface -> writeDataRecord (heap_hndl , (Common_packet * ) & hpacket );
462
- POP_REENTRANCE ( guard ) ;
428
+ POP_REENTRANCE ;
463
429
return ret ;
464
430
}
465
431
@@ -469,19 +435,17 @@ calloc (size_t size, size_t esize)
469
435
void
470
436
__collector_heap_record (int mtype , size_t size , void * vaddr )
471
437
{
472
- int * guard ;
473
- Heap_packet hpacket ;
474
- if (CHCK_REENTRANCE (guard ))
438
+ if (CHCK_REENTRANCE )
475
439
return ;
476
- PUSH_REENTRANCE (guard );
477
- collector_memset (& hpacket , 0 , sizeof ( Heap_packet ));
478
- hpacket .comm .tsize = sizeof ( Heap_packet );
440
+ PUSH_REENTRANCE ;
441
+ Heap_packet hpacket = heap_packet0 ;
479
442
hpacket .comm .tstamp = gethrtime ();
480
443
hpacket .mtype = mtype ;
481
444
hpacket .size = (Size_type ) size ;
482
445
hpacket .vaddr = (intptr_t ) vaddr ;
483
- hpacket .comm .frinfo = collector_interface -> getFrameInfo (heap_hndl , hpacket .comm .tstamp , FRINFO_FROM_STACK , & hpacket );
446
+ hpacket .comm .frinfo = collector_interface -> getFrameInfo (heap_hndl ,
447
+ hpacket .comm .tstamp , FRINFO_FROM_STACK , & hpacket );
484
448
collector_interface -> writeDataRecord (heap_hndl , (Common_packet * ) & hpacket );
485
- POP_REENTRANCE ( guard ) ;
449
+ POP_REENTRANCE ;
486
450
return ;
487
451
}
0 commit comments