Skip to content
Snippets Groups Projects
Commit 80fcbf98 authored by Basile Desloges's avatar Basile Desloges
Browse files

[eacsl] Use locks in dlmalloc to support multi-threaded environment

We use spin locks so as to not require Pthreads.
parent 3b52ad81
No related branches found
No related tags found
No related merge requests found
...@@ -162,7 +162,7 @@ VERSION_FILE=$(FRAMAC_ROOT_SRCDIR)/VERSION ...@@ -162,7 +162,7 @@ VERSION_FILE=$(FRAMAC_ROOT_SRCDIR)/VERSION
EACSL_VERSION:=$(shell sed -e 's/\\(.*\\)/\\1/' $(VERSION_FILE)) EACSL_VERSION:=$(shell sed -e 's/\\(.*\\)/\\1/' $(VERSION_FILE))
$(EACSL_PLUGIN_DIR)/src/local_config.ml: $(EACSL_PLUGIN_DIR)/Makefile.in $(VERSION_FILE) $(EACSL_PLUGIN_DIR)/src/local_config.ml: $(EACSL_PLUGIN_DIR)/Makefile $(VERSION_FILE)
$(PRINT_MAKING) $@ $(PRINT_MAKING) $@
$(RM) $@ $(RM) $@
$(ECHO) "(* This file was automatically generated from $<. Don't edit it. *)" >> $@ $(ECHO) "(* This file was automatically generated from $<. Don't edit it. *)" >> $@
...@@ -272,9 +272,11 @@ EACSL_DLMALLOC_FLAGS = \ ...@@ -272,9 +272,11 @@ EACSL_DLMALLOC_FLAGS = \
-DMSPACES=1 \ -DMSPACES=1 \
-DONLY_MSPACES \ -DONLY_MSPACES \
-DMALLOC_ALIGNMENT=32 \ -DMALLOC_ALIGNMENT=32 \
-DMSPACE_PREFIX="__e_acsl_" -DMSPACE_PREFIX="__e_acsl_" \
-DUSE_LOCKS=1 \
-DUSE_SPIN_LOCKS=1
$(EACSL_DLMALLOC_LIB): $(EACSL_DLMALLOC_SRC) $(EACSL_DLMALLOC_LIB): $(EACSL_DLMALLOC_SRC) $(EACSL_PLUGIN_DIR)/Makefile
$(MKDIR) $(EACSL_LIBDIR) $(MKDIR) $(EACSL_LIBDIR)
echo 'CC $<' echo 'CC $<'
$(CC) $< -c -O2 -g3 -o$(EACSL_DLMALLOC_OBJ) $(EACSL_DLMALLOC_FLAGS) $(CC) $< -c -O2 -g3 -o$(EACSL_DLMALLOC_OBJ) $(EACSL_DLMALLOC_FLAGS)
......
...@@ -925,6 +925,8 @@ if [ "$OPTION_DLMALLOC_FROM_SOURCES" = "1" -o \ ...@@ -925,6 +925,8 @@ if [ "$OPTION_DLMALLOC_FROM_SOURCES" = "1" -o \
-DONLY_MSPACES \ -DONLY_MSPACES \
-DMALLOC_ALIGNMENT=32 \ -DMALLOC_ALIGNMENT=32 \
-DMSPACE_PREFIX=__e_acsl_ \ -DMSPACE_PREFIX=__e_acsl_ \
-DUSE_LOCKS=1 \
-DUSE_SPIN_LOCKS=1 \
$OPTION_DLMALLOC_COMPILE_FLAGS $OPTION_DLMALLOC_COMPILE_FLAGS
" "
......
...@@ -22,6 +22,10 @@ ...@@ -22,6 +22,10 @@
#include "e_acsl_malloc.h" #include "e_acsl_malloc.h"
#define eacsl_create_mspace export_alias(create_mspace)
extern mspace eacsl_create_mspace(size_t, int);
struct memory_spaces mem_spaces = { struct memory_spaces mem_spaces = {
.rtl_mspace = NULL, .rtl_mspace = NULL,
.heap_mspace = NULL, .heap_mspace = NULL,
...@@ -32,12 +36,16 @@ struct memory_spaces mem_spaces = { ...@@ -32,12 +36,16 @@ struct memory_spaces mem_spaces = {
.heap_mspace_least = 0, .heap_mspace_least = 0,
}; };
mspace eacsl_create_locked_mspace(size_t size) {
return eacsl_create_mspace(size, 1);
}
/* \brief Create two memory spaces, one for RTL and the other for application /* \brief Create two memory spaces, one for RTL and the other for application
memory. This function *SHOULD* be called before any allocations are made memory. This function *SHOULD* be called before any allocations are made
otherwise execution fails */ otherwise execution fails */
void eacsl_make_memory_spaces(size_t rtl_size, size_t heap_size) { void eacsl_make_memory_spaces(size_t rtl_size, size_t heap_size) {
mem_spaces.rtl_mspace = eacsl_create_mspace(rtl_size, 0); mem_spaces.rtl_mspace = eacsl_create_locked_mspace(rtl_size);
mem_spaces.heap_mspace = eacsl_create_mspace(heap_size, 0); mem_spaces.heap_mspace = eacsl_create_locked_mspace(heap_size);
/* Do not use `eacsl_mspace_least_addr` here, as it returns the address of the /* Do not use `eacsl_mspace_least_addr` here, as it returns the address of the
mspace header. */ mspace header. */
mem_spaces.rtl_start = mem_spaces.rtl_start =
......
...@@ -28,7 +28,7 @@ ...@@ -28,7 +28,7 @@
* is split into two mspaces (memory spaces). Memory allocation itself is * is split into two mspaces (memory spaces). Memory allocation itself is
* delegated to a slightly customised version of dlmalloc shipped with the * delegated to a slightly customised version of dlmalloc shipped with the
* RTL. The overall pattern is as follows: * RTL. The overall pattern is as follows:
* mspace space = eacsl_create_mspace(capacity, locks); * mspace space = eacsl_create_locked_mspace(capacity);
* char *p = eacsl_mspace_malloc(space, size); * char *p = eacsl_mspace_malloc(space, size);
**************************************************************************/ **************************************************************************/
...@@ -70,7 +70,7 @@ void eacsl_destroy_memory_spaces(); ...@@ -70,7 +70,7 @@ void eacsl_destroy_memory_spaces();
/*** Mspace allocators (from dlmalloc) {{{ ***/ /*** Mspace allocators (from dlmalloc) {{{ ***/
/************************************************************************/ /************************************************************************/
#define eacsl_create_mspace export_alias(create_mspace) #define eacsl_create_locked_mspace export_alias(create_locked_mspace)
#define eacsl_destroy_mspace export_alias(destroy_mspace) #define eacsl_destroy_mspace export_alias(destroy_mspace)
#define eacsl_mspace_least_addr export_alias(mspace_least_addr) #define eacsl_mspace_least_addr export_alias(mspace_least_addr)
#define eacsl_mspace_malloc export_alias(mspace_malloc) #define eacsl_mspace_malloc export_alias(mspace_malloc)
...@@ -93,7 +93,7 @@ struct memory_spaces { ...@@ -93,7 +93,7 @@ struct memory_spaces {
}; };
extern struct memory_spaces mem_spaces; extern struct memory_spaces mem_spaces;
extern mspace eacsl_create_mspace(size_t, int); /* Original functions from dlmalloc */
extern size_t eacsl_destroy_mspace(mspace); extern size_t eacsl_destroy_mspace(mspace);
extern void *eacsl_mspace_malloc(mspace, size_t); extern void *eacsl_mspace_malloc(mspace, size_t);
extern void eacsl_mspace_free(mspace, void *); extern void eacsl_mspace_free(mspace, void *);
...@@ -103,6 +103,10 @@ extern void *eacsl_mspace_aligned_alloc(mspace, size_t, size_t); ...@@ -103,6 +103,10 @@ extern void *eacsl_mspace_aligned_alloc(mspace, size_t, size_t);
extern int eacsl_mspace_posix_memalign(mspace, void **, size_t, size_t); extern int eacsl_mspace_posix_memalign(mspace, void **, size_t, size_t);
extern void *eacsl_mspace_least_addr(mspace); extern void *eacsl_mspace_least_addr(mspace);
/*! \brief Wrapper around `eacsl_create_mspace` to always create a thread-safe
* mspace. */
mspace eacsl_create_locked_mspace(size_t size);
/* }}} */ /* }}} */
/************************************************************************/ /************************************************************************/
......
...@@ -675,7 +675,7 @@ void set_shadow_segment(memory_segment *seg, memory_segment *parent, ...@@ -675,7 +675,7 @@ void set_shadow_segment(memory_segment *seg, memory_segment *parent,
seg->name = name; seg->name = name;
seg->shadow_ratio = ratio; seg->shadow_ratio = ratio;
seg->size = parent->size / seg->shadow_ratio; seg->size = parent->size / seg->shadow_ratio;
seg->mspace = eacsl_create_mspace(seg->size + SHADOW_SEGMENT_PADDING, 0); seg->mspace = eacsl_create_locked_mspace(seg->size + SHADOW_SEGMENT_PADDING);
seg->start = (uintptr_t)eacsl_mspace_malloc(seg->mspace, 1); seg->start = (uintptr_t)eacsl_mspace_malloc(seg->mspace, 1);
seg->end = seg->start + seg->size - 1; seg->end = seg->start + seg->size - 1;
seg->shadow_offset = parent->start - seg->start; seg->shadow_offset = parent->start - seg->start;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment