SimGrid
3.18
Versatile Simulation of Distributed Systems
|
#include "xbt/mallocator.h"
#include "mallocator_private.h"
#include "simgrid/modelchecker.h"
#include "src/internal_config.h"
#include "xbt/asserts.h"
#include "xbt/sysdep.h"
Functions | |
XBT_LOG_NEW_DEFAULT_SUBCATEGORY (xbt_mallocator, xbt, "Mallocators") | |
static void | lock_reset (xbt_mallocator_t m) |
static void | lock_acquire (xbt_mallocator_t m) |
static void | lock_release (xbt_mallocator_t m) |
void | xbt_mallocator_initialization_is_done (int protect) |
This function must be called once the framework configuration is done. More... | |
static int | xbt_mallocator_is_active (void) |
used by the module to know if it's time to activate the mallocators yet More... | |
xbt_mallocator_t | xbt_mallocator_new (int size, pvoid_f_void_t new_f, void_f_pvoid_t free_f, void_f_pvoid_t reset_f) |
Constructor. More... | |
void | xbt_mallocator_free (xbt_mallocator_t m) |
Destructor. More... | |
void * | xbt_mallocator_get (xbt_mallocator_t m) |
Extract an object from a mallocator. More... | |
void | xbt_mallocator_release (xbt_mallocator_t m, void *object) |
Push an object into a mallocator. More... | |
Variables | |
static int | initialization_done = 0 |
Implementation note on the mallocators: More... | |
XBT_LOG_NEW_DEFAULT_SUBCATEGORY | ( | xbt_mallocator | , |
xbt | , | ||
"Mallocators" | |||
) |
|
inlinestatic |
|
inlinestatic |
|
inlinestatic |
|
inlinestatic |
used by the module to know if it's time to activate the mallocators yet
|
static |
Implementation note on the mallocators:
Mallocators and memory mess introduced by model-checking do not mix well together: the mallocator will give standard memory when we are using raw memory (so these blocks are killed on restore) and the contrary (so these blocks will leak across restores).
In addition, model-checking is activated when the command-line arguments are parsed, at the beginning of main, while most of the mallocators are created during the constructor functions launched from xbt_preinit, before the beginning of the main function.
We want the code as fast as possible when they are active while we can deal with a little slow-down when they are inactive. So we start the mallocators as inactive. When they are so, they check at each use whether they should switch to the fast active mode or should stay in inactive mode. Finally, we give external elements a way to switch them all to the active mode (through xbt_mallocator_initialization_is_done).
This design avoids to store all mallocators somewhere for later conversion, which would be hard to achieve provided that all our data structures use some mallocators internally...