Home | History | Annotate | Download | only in internals
      1 The structure of this module is worth noting.
      2 
      3 The main part is in vg_replace_malloc.c.  It gets compiled into the tool's
      4 'preload' shared object, which goes into the client's area of memory, and
      5 runs on the simulated CPU just like client code.  As a result, it cannot
      6 use any functions in the core directly;  it can only communicate with the
      7 core using client requests, just like any other client code.
      8 
      9 And yet it must call the tool's malloc wrappers.  How does it know where
     10 they are?  The init function uses a client request which asks for the list
     11 of all the core functions (and variables) that it needs to access.  It then
     12 uses a client request each time it needs to call one of these.
     13 
     14 This means that the following sequence occurs each time a tool that uses
     15 this module starts up:
     16 
     17  - Tool does initialisation, including calling VG_(malloc_funcs)() to tell
     18    the core the names of its malloc wrappers.  These are stored in
     19    VG_(tdict).
     20 
     21  - On the first allocation, vg_replace_malloc.c:init() calls the
     22    GET_MALLOCFUNCS client request to get the names of the malloc wrappers
     23    out of VG_(tdict), storing them in 'info'.
     24 
     25  - All calls to these functions are done using 'info'.
     26 
     27 This is a bit complex, but it's hard to see how it can be done more simply. 
     28 
     29 
     30