source: src/Common/DebugMalloc.cc @ 6da4cbbc

Last change on this file since 6da4cbbc was fb114fa1, checked in by Peter A. Buhr <pabuhr@…>, 8 years ago

more refactoring of parser code

  • Property mode set to 100644
File size: 2.0 KB
RevLine 
[fb114fa1]1#if 0
2#include <dlfcn.h>
3#include <unistd.h>
4#include <stdlib.h>
5
6bool recursion = false;
7
8static char hex[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };
9
10static union {
11    void *addr;
12    unsigned char bytes[sizeof(void *)];
13};
14
15struct Mallocmsg {
16    const char start[9];
17    char addr[16];
18    const char sep[3];
19    char size[16];
20    const char end[1];
21} mallocmsg = {
22    'm', 'a', 'l', 'l', 'o', 'c', ' ', '0', 'x',
23    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
24    ' ', '0', 'x',
25    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
26    '\n'
27};
28
29void * malloc( size_t size ) {
30    if ( recursion ) { write( STDERR_FILENO, "recursion\n", 10 ); abort(); }
31    recursion = true;
32    __typeof__( ::malloc ) *libc_malloc = (__typeof__( ::malloc ) *)dlsym(RTLD_NEXT, "malloc");
33    addr = (void *)size;
34    for ( int i = 0, j = 7; i < 16; i += 2, j -= 1 ) {
35        mallocmsg.size[i] = hex[bytes[j] >> 4];
36        mallocmsg.size[i + 1] = hex[bytes[j] & 0x0f];
37    } // for
38    addr = libc_malloc( size );
39    for ( int i = 0, j = 7; i < 16; i += 2, j -= 1 ) {
40        mallocmsg.addr[i] = hex[bytes[j] >> 4];
41        mallocmsg.addr[i + 1] = hex[bytes[j] & 0x0f];
42    } // for
43    write( STDERR_FILENO, &mallocmsg, sizeof(mallocmsg) );
44    recursion = false;
45    return addr;
46}
47
48struct Freemsg {
49    const char start[7];
50    char addr[16];
51    const char end[1];
52} freemsg = {
53    'f', 'r', 'e', 'e', ' ', '0', 'x',
54    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
55    '\n'
56};
57
58void free( void * x ) {
59    if ( recursion ) { write( STDERR_FILENO, "recursion\n", 10 ); abort(); }
60    recursion = true;
61    __typeof__( ::free ) *libc_free = (__typeof__( ::free ) *)dlsym(RTLD_NEXT, "free");
62    addr = x;
63    for ( int i = 0, j = 7; i < 16; i += 2, j -= 1 ) {
64        freemsg.addr[i] = hex[bytes[j] >> 4];
65        freemsg.addr[i + 1] = hex[bytes[j] & 0x0f];
66    } // for
67    write( STDERR_FILENO, &freemsg, sizeof(freemsg) );
68    recursion = false;
69    libc_free( addr );
70}
71#endif // 0
Note: See TracBrowser for help on using the repository browser.