1010typedef enum Memory_Mode {
1111 MEMORY_MODE_UNKNOWN = 0 ,
1212 MEMORY_MODE_POOL ,
13- MEMORY_MODE_ALLOCATOR
13+ MEMORY_MODE_ALLOCATOR ,
14+ MEMORY_MODE_SYSTEM_ALLOCATOR
1415} Memory_Mode ;
1516
1617static Memory_Mode memory_mode = MEMORY_MODE_UNKNOWN ;
1718
1819static mem_allocator_t pool_allocator = NULL ;
1920
21+ #if WASM_MEM_ALLOC_WITH_USER_DATA != 0
22+ static void * allocator_user_data = NULL ;
23+ static void * (* malloc_func )(void * user_data , unsigned int size ) = NULL ;
24+ static void * (* realloc_func )(void * user_data , void * ptr ,
25+ unsigned int size ) = NULL ;
26+ static void (* free_func )(void * user_data , void * ptr ) = NULL ;
27+ #else
2028static void * (* malloc_func )(unsigned int size ) = NULL ;
2129static void * (* realloc_func )(void * ptr , unsigned int size ) = NULL ;
2230static void (* free_func )(void * ptr ) = NULL ;
31+ #endif
2332
2433static unsigned int global_pool_size ;
2534
@@ -38,6 +47,24 @@ wasm_memory_init_with_pool(void *mem, unsigned int bytes)
3847 return false;
3948}
4049
50+ #if WASM_MEM_ALLOC_WITH_USER_DATA != 0
51+ static bool
52+ wasm_memory_init_with_allocator (void * _user_data , void * _malloc_func ,
53+ void * _realloc_func , void * _free_func )
54+ {
55+ if (_malloc_func && _free_func && _malloc_func != _free_func ) {
56+ memory_mode = MEMORY_MODE_ALLOCATOR ;
57+ allocator_user_data = _user_data ;
58+ malloc_func = _malloc_func ;
59+ realloc_func = _realloc_func ;
60+ free_func = _free_func ;
61+ return true;
62+ }
63+ LOG_ERROR ("Init memory with allocator (%p, %p, %p, %p) failed.\n" ,
64+ _user_data , _malloc_func , _realloc_func , _free_func );
65+ return false;
66+ }
67+ #else
4168static bool
4269wasm_memory_init_with_allocator (void * _malloc_func , void * _realloc_func ,
4370 void * _free_func )
@@ -53,23 +80,37 @@ wasm_memory_init_with_allocator(void *_malloc_func, void *_realloc_func,
5380 _realloc_func , _free_func );
5481 return false;
5582}
83+ #endif
5684
5785bool
5886wasm_runtime_memory_init (mem_alloc_type_t mem_alloc_type ,
5987 const MemAllocOption * alloc_option )
6088{
61- if (mem_alloc_type == Alloc_With_Pool )
89+ if (mem_alloc_type == Alloc_With_Pool ) {
6290 return wasm_memory_init_with_pool (alloc_option -> pool .heap_buf ,
6391 alloc_option -> pool .heap_size );
64- else if (mem_alloc_type == Alloc_With_Allocator )
92+ }
93+ else if (mem_alloc_type == Alloc_With_Allocator ) {
94+ #if WASM_MEM_ALLOC_WITH_USER_DATA != 0
6595 return wasm_memory_init_with_allocator (
96+ alloc_option -> allocator .user_data ,
6697 alloc_option -> allocator .malloc_func ,
6798 alloc_option -> allocator .realloc_func ,
6899 alloc_option -> allocator .free_func );
69- else if (mem_alloc_type == Alloc_With_System_Allocator )
70- return wasm_memory_init_with_allocator (os_malloc , os_realloc , os_free );
71- else
100+ #else
101+ return wasm_memory_init_with_allocator (
102+ alloc_option -> allocator .malloc_func ,
103+ alloc_option -> allocator .realloc_func ,
104+ alloc_option -> allocator .free_func );
105+ #endif
106+ }
107+ else if (mem_alloc_type == Alloc_With_System_Allocator ) {
108+ memory_mode = MEMORY_MODE_SYSTEM_ALLOCATOR ;
109+ return true;
110+ }
111+ else {
72112 return false;
113+ }
73114}
74115
75116void
@@ -109,8 +150,15 @@ wasm_runtime_malloc_internal(unsigned int size)
109150 else if (memory_mode == MEMORY_MODE_POOL ) {
110151 return mem_allocator_malloc (pool_allocator , size );
111152 }
112- else {
153+ else if (memory_mode == MEMORY_MODE_ALLOCATOR ) {
154+ #if WASM_MEM_ALLOC_WITH_USER_DATA != 0
155+ return malloc_func (allocator_user_data , size );
156+ #else
113157 return malloc_func (size );
158+ #endif
159+ }
160+ else {
161+ return os_malloc (size );
114162 }
115163}
116164
@@ -125,12 +173,19 @@ wasm_runtime_realloc_internal(void *ptr, unsigned int size)
125173 else if (memory_mode == MEMORY_MODE_POOL ) {
126174 return mem_allocator_realloc (pool_allocator , ptr , size );
127175 }
128- else {
176+ else if ( memory_mode == MEMORY_MODE_ALLOCATOR ) {
129177 if (realloc_func )
178+ #if WASM_MEM_ALLOC_WITH_USER_DATA != 0
179+ return realloc_func (allocator_user_data , ptr , size );
180+ #else
130181 return realloc_func (ptr , size );
182+ #endif
131183 else
132184 return NULL ;
133185 }
186+ else {
187+ return os_realloc (ptr , size );
188+ }
134189}
135190
136191static inline void
@@ -148,8 +203,15 @@ wasm_runtime_free_internal(void *ptr)
148203 else if (memory_mode == MEMORY_MODE_POOL ) {
149204 mem_allocator_free (pool_allocator , ptr );
150205 }
151- else {
206+ else if (memory_mode == MEMORY_MODE_ALLOCATOR ) {
207+ #if WASM_MEM_ALLOC_WITH_USER_DATA != 0
208+ free_func (allocator_user_data , ptr );
209+ #else
152210 free_func (ptr );
211+ #endif
212+ }
213+ else {
214+ os_free (ptr );
153215 }
154216}
155217
0 commit comments