Skip to content

Commit 25d6169

Browse files
Memory: Test for presence of cfree, valloc, pvalloc, mallinfo (#3490)
1 parent 978160f commit 25d6169

File tree

5 files changed

+147
-44
lines changed

5 files changed

+147
-44
lines changed

cmake/detect-features-c.cmake

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@ check_function_exists(_strdup HAVE__STRDUP)
7474
check_function_exists(asctime CMK_HAS_ASCTIME)
7575
check_function_exists(backtrace CMK_USE_BACKTRACE)
7676
check_function_exists(bindprocessor CMK_HAS_BINDPROCESSOR)
77+
check_function_exists(cfree CMK_HAS_CFREE)
7778
check_function_exists(clz HAVE_CLZ)
7879
check_function_exists(clzl HAVE_CLZL)
7980
check_symbol_exists(dlopen dlfcn.h CMK_DLL_USE_DLOPEN)
@@ -119,6 +120,7 @@ check_symbol_exists(pthread_getaffinity_np pthread.h HAVE_DECL_PTHREAD_GETAFFINI
119120
check_symbol_exists(pthread_setaffinity_np pthread.h HAVE_DECL_PTHREAD_SETAFFINITY_NP)
120121
set(CMK_HAS_PTHREAD_SETAFFINITY ${HAVE_DECL_PTHREAD_SETAFFINITY_NP})
121122
check_symbol_exists(pthread_spin_lock pthread.h CMK_HAS_SPINLOCK)
123+
check_symbol_exists(pvalloc malloc.h CMK_HAS_PVALLOC)
122124
check_symbol_exists(RTLD_DEFAULT dlfcn.h CMK_HAS_RTLD_DEFAULT)
123125
check_symbol_exists(RTLD_NEXT dlfcn.h CMK_HAS_RTLD_NEXT)
124126
check_function_exists(readlink CMK_HAS_READLINK)
@@ -142,6 +144,7 @@ check_function_exists(sysctl HAVE_SYSCTL)
142144
check_function_exists(sysctlbyname HAVE_SYSCTLBYNAME)
143145
check_function_exists(uname HAVE_UNAME)
144146
check_function_exists(usleep CMK_HAS_USLEEP)
147+
check_symbol_exists(valloc malloc.h CMK_HAS_VALLOC)
145148

146149

147150
# Complex tests

src/conv-core/memory-isomalloc.C

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -200,7 +200,7 @@ static void *meta_valloc(size_t size)
200200
static void *meta_pvalloc(size_t size)
201201
{
202202
const size_t pagesize = CmiGetPageSize();
203-
return meta_memalign(pagesize, (size + pagesize - 1) & ~(pagesize - 1));
203+
return meta_memalign(pagesize, CMIALIGN(size, pagesize));
204204
}
205205

206206
#define CMK_MEMORY_HAS_NOMIGRATE

src/conv-core/memory-os-wrapper.C

Lines changed: 50 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -15,19 +15,28 @@
1515
#include <sys/types.h>
1616
#include <dlfcn.h>
1717

18-
struct mallinfo;
19-
2018
extern void * (*mm_impl_malloc)(size_t);
2119
extern void * (*mm_impl_calloc)(size_t,size_t);
2220
extern void * (*mm_impl_realloc)(void*,size_t);
21+
extern void (*mm_impl_free)(void*);
22+
2323
extern void * (*mm_impl_memalign)(size_t,size_t);
2424
extern int (*mm_impl_posix_memalign)(void **,size_t,size_t);
2525
extern void * (*mm_impl_aligned_alloc)(size_t,size_t);
26+
27+
#if CMK_HAS_VALLOC
2628
extern void * (*mm_impl_valloc)(size_t);
29+
#endif
30+
#if CMK_HAS_PVALLOC
2731
extern void * (*mm_impl_pvalloc)(size_t);
28-
extern void (*mm_impl_free)(void*);
32+
#endif
33+
#if CMK_HAS_CFREE
2934
extern void (*mm_impl_cfree)(void*);
35+
#endif
36+
#if CMK_HAS_MALLINFO
37+
struct mallinfo;
3038
extern struct mallinfo (*mm_impl_mallinfo)(void);
39+
#endif
3140

3241

3342
extern char initialize_memory_wrapper_status;
@@ -37,22 +46,49 @@ void initialize_memory_wrapper() {
3746
initialize_memory_wrapper_status = 1;
3847

3948
// wait to install these all at once because dlsym calls them, and a mismatch would be bad
40-
void * (*os_malloc)(size_t) = (void *(*)(size_t)) dlsym(RTLD_NEXT, "malloc");
41-
void * (*os_calloc)(size_t,size_t) = (void *(*)(size_t,size_t)) dlsym(RTLD_NEXT, "calloc");
42-
void (*os_free)(void*) = (void (*)(void*)) dlsym(RTLD_NEXT, "free");
49+
auto os_malloc = (void *(*)(size_t)) dlsym(RTLD_NEXT, "malloc");
50+
auto os_calloc = (void *(*)(size_t,size_t)) dlsym(RTLD_NEXT, "calloc");
51+
auto os_realloc = (void *(*)(void*,size_t)) dlsym(RTLD_NEXT, "realloc");
52+
auto os_free = (void (*)(void*)) dlsym(RTLD_NEXT, "free");
53+
54+
auto os_memalign = (void *(*)(size_t,size_t)) dlsym(RTLD_NEXT, "memalign");
55+
auto os_posix_memalign = (int (*)(void **,size_t,size_t)) dlsym(RTLD_NEXT, "posix_memalign");
56+
auto os_aligned_alloc = (void *(*)(size_t,size_t)) dlsym(RTLD_NEXT, "aligned_alloc");
57+
58+
#if CMK_HAS_VALLOC
59+
auto os_valloc = (void *(*)(size_t)) dlsym(RTLD_NEXT, "valloc");
60+
#endif
61+
#if CMK_HAS_PVALLOC
62+
auto os_pvalloc = (void *(*)(size_t)) dlsym(RTLD_NEXT, "pvalloc");
63+
#endif
64+
#if CMK_HAS_CFREE
65+
auto os_cfree = (void (*)(void*)) dlsym(RTLD_NEXT, "cfree");
66+
#endif
67+
#if CMK_HAS_MALLINFO
68+
auto os_mallinfo = (struct mallinfo (*)(void)) dlsym(RTLD_NEXT, "mallinfo");
69+
#endif
4370

4471
mm_impl_malloc = os_malloc;
4572
mm_impl_calloc = os_calloc;
73+
mm_impl_realloc = os_realloc;
4674
mm_impl_free = os_free;
4775

48-
mm_impl_realloc = (void *(*)(void*,size_t)) dlsym(RTLD_NEXT, "realloc");
49-
mm_impl_memalign = (void *(*)(size_t,size_t)) dlsym(RTLD_NEXT, "memalign");
50-
mm_impl_posix_memalign = (int (*)(void **,size_t,size_t)) dlsym(RTLD_NEXT, "posix_memalign");
51-
mm_impl_aligned_alloc = (void *(*)(size_t,size_t)) dlsym(RTLD_NEXT, "aligned_alloc");
52-
mm_impl_valloc = (void *(*)(size_t)) dlsym(RTLD_NEXT, "valloc");
53-
mm_impl_pvalloc = (void *(*)(size_t)) dlsym(RTLD_NEXT, "pvalloc");
54-
mm_impl_cfree = (void (*)(void*)) dlsym(RTLD_NEXT, "cfree");
55-
mm_impl_mallinfo = (struct mallinfo (*)(void)) dlsym(RTLD_NEXT, "mallinfo");
76+
mm_impl_memalign = os_memalign;
77+
mm_impl_posix_memalign = os_posix_memalign;
78+
mm_impl_aligned_alloc = os_aligned_alloc;
79+
80+
#if CMK_HAS_VALLOC
81+
mm_impl_valloc = os_valloc;
82+
#endif
83+
#if CMK_HAS_PVALLOC
84+
mm_impl_pvalloc = os_pvalloc;
85+
#endif
86+
#if CMK_HAS_CFREE
87+
mm_impl_cfree = os_cfree;
88+
#endif
89+
#if CMK_HAS_MALLINFO
90+
mm_impl_mallinfo = os_mallinfo;
91+
#endif
5692
}
5793

5894
#endif

src/conv-core/memory.C

Lines changed: 63 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -107,31 +107,40 @@ int cpdInSystem=1; /*Start inside the system (until we start executing user code
107107
#if CMK_MEMORY_BUILD_OS
108108
#if CMK_MEMORY_BUILD_OS_WRAPPED
109109

110-
struct mallinfo;
111-
112110
void initialize_memory_wrapper(void);
113-
void * initialize_memory_wrapper_calloc(size_t nelem, size_t size);
114-
void * initialize_memory_wrapper_malloc(size_t size);
115-
void * initialize_memory_wrapper_realloc(void *ptr, size_t size);
116-
void * initialize_memory_wrapper_memalign(size_t align, size_t size);
117-
int initialize_memory_wrapper_posix_memalign(void **memptr, size_t align, size_t size);
118-
void * initialize_memory_wrapper_aligned_alloc(size_t align, size_t size);
119-
void * initialize_memory_wrapper_valloc(size_t size);
120-
void * initialize_memory_wrapper_pvalloc(size_t size);
121-
void initialize_memory_wrapper_free(void *ptr);
122-
void initialize_memory_wrapper_cfree(void *ptr);
123111

112+
void * initialize_memory_wrapper_malloc(size_t size);
124113
void * (*mm_impl_malloc)(size_t) = initialize_memory_wrapper_malloc;
114+
void * initialize_memory_wrapper_calloc(size_t nelem, size_t size);
125115
void * (*mm_impl_calloc)(size_t,size_t) = initialize_memory_wrapper_calloc;
116+
void * initialize_memory_wrapper_realloc(void *ptr, size_t size);
126117
void * (*mm_impl_realloc)(void*,size_t) = initialize_memory_wrapper_realloc;
118+
void initialize_memory_wrapper_free(void *ptr);
119+
void (*mm_impl_free)(void*) = initialize_memory_wrapper_free;
120+
121+
void * initialize_memory_wrapper_memalign(size_t align, size_t size);
127122
void * (*mm_impl_memalign)(size_t,size_t) = initialize_memory_wrapper_memalign;
123+
int initialize_memory_wrapper_posix_memalign(void **memptr, size_t align, size_t size);
128124
int (*mm_impl_posix_memalign)(void **,size_t,size_t) = initialize_memory_wrapper_posix_memalign;
125+
void * initialize_memory_wrapper_aligned_alloc(size_t align, size_t size);
129126
void * (*mm_impl_aligned_alloc)(size_t,size_t) = initialize_memory_wrapper_aligned_alloc;
127+
128+
#if CMK_HAS_VALLOC
129+
void * initialize_memory_wrapper_valloc(size_t size);
130130
void * (*mm_impl_valloc)(size_t) = initialize_memory_wrapper_valloc;
131+
#endif
132+
#if CMK_HAS_PVALLOC
133+
void * initialize_memory_wrapper_pvalloc(size_t size);
131134
void * (*mm_impl_pvalloc)(size_t) = initialize_memory_wrapper_pvalloc;
132-
void (*mm_impl_free)(void*) = initialize_memory_wrapper_free;
135+
#endif
136+
#if CMK_HAS_CFREE
137+
void initialize_memory_wrapper_cfree(void *ptr);
133138
void (*mm_impl_cfree)(void*) = initialize_memory_wrapper_cfree;
139+
#endif
140+
#if CMK_HAS_MALLINFO
141+
struct mallinfo;
134142
struct mallinfo (*mm_impl_mallinfo)(void) = NULL;
143+
#endif
135144

136145
static char fake_malloc_buffer[1024];
137146
static char* fake_malloc_buffer_pos = fake_malloc_buffer;
@@ -203,15 +212,19 @@ void * initialize_memory_wrapper_aligned_alloc(size_t align, size_t size) {
203212
return (*mm_impl_aligned_alloc)(align,size);
204213
}
205214

215+
#if CMK_HAS_VALLOC
206216
void * initialize_memory_wrapper_valloc(size_t size) {
207217
initialize_memory_wrapper();
208218
return (*mm_impl_valloc)(size);
209219
}
220+
#endif
210221

222+
#if CMK_HAS_PVALLOC
211223
void * initialize_memory_wrapper_pvalloc(size_t size) {
212224
initialize_memory_wrapper();
213225
return (*mm_impl_pvalloc)(size);
214226
}
227+
#endif
215228

216229
void initialize_memory_wrapper_free(void *ptr) {
217230
if (initialize_memory_wrapper_status)
@@ -220,21 +233,42 @@ void initialize_memory_wrapper_free(void *ptr) {
220233
(*mm_impl_free)(ptr);
221234
}
222235

236+
#if CMK_HAS_CFREE
223237
void initialize_memory_wrapper_cfree(void *ptr) {
224238
initialize_memory_wrapper();
225239
(*mm_impl_cfree)(ptr);
226240
}
241+
#endif
227242

228243
#define mm_impl_malloc (*mm_impl_malloc)
229244
#define mm_impl_free (*mm_impl_free)
230245
#define mm_impl_calloc (*mm_impl_calloc)
246+
#if CMK_HAS_CFREE
231247
#define mm_impl_cfree (*mm_impl_cfree)
248+
#else
249+
#define mm_impl_cfree (*mm_impl_free)
250+
#endif
232251
#define mm_impl_realloc (*mm_impl_realloc)
233252
#define mm_impl_memalign (*mm_impl_memalign)
234253
#define mm_impl_posix_memalign (*mm_impl_posix_memalign)
235254
#define mm_impl_aligned_alloc (*mm_impl_aligned_alloc)
255+
#if CMK_HAS_VALLOC
236256
#define mm_impl_valloc (*mm_impl_valloc)
257+
#else
258+
static inline void *mm_impl_valloc(size_t size)
259+
{
260+
return mm_impl_memalign(CmiGetPageSize(), size);
261+
}
262+
#endif
263+
#if CMK_HAS_PVALLOC
237264
#define mm_impl_pvalloc (*mm_impl_pvalloc)
265+
#else
266+
static inline void *mm_impl_pvalloc(size_t size)
267+
{
268+
const size_t pagesize = CmiGetPageSize();
269+
return mm_impl_memalign(pagesize, CMIALIGN(size, pagesize));
270+
}
271+
#endif
238272
#endif /* CMK_MEMORY_BUILD_OS_WRAPPED */
239273
#endif /* CMK_MEMORY_BUILD_OS */
240274

@@ -365,14 +399,16 @@ static inline void *mm_impl_calloc(size_t nelem, size_t size)
365399
AFTER_MALLOC_CALL;
366400
return result;
367401
}
368-
#if 0
369402
static inline void mm_impl_cfree(void *mem)
370403
{
371404
BEFORE_MALLOC_CALL;
405+
#if CMK_HAS_CFREE
372406
cfree(mem);
407+
#else
408+
free(mem);
409+
#endif
373410
AFTER_MALLOC_CALL;
374411
}
375-
#endif
376412
static inline void *mm_impl_realloc(void *mem, size_t size)
377413
{
378414
void *result;
@@ -409,24 +445,31 @@ static inline void *mm_impl_aligned_alloc(size_t align, size_t size)
409445
AFTER_MALLOC_CALL;
410446
return result;
411447
}
412-
#if 0
413448
static inline void *mm_impl_valloc(size_t size)
414449
{
415450
void *result;
416451
BEFORE_MALLOC_CALL;
452+
#if CMK_HAS_VALLOC
417453
result = valloc(size);
454+
#else
455+
result = memalign(CmiGetPageSize(), size);
456+
#endif
418457
AFTER_MALLOC_CALL;
419458
return result;
420459
}
421460
static inline void *mm_impl_pvalloc(size_t size)
422461
{
423462
void *result;
424463
BEFORE_MALLOC_CALL;
464+
#if CMK_HAS_PVALLOC
425465
result = pvalloc(size);
466+
#else
467+
const size_t pagesize = CmiGetPageSize();
468+
return memalign(pagesize, CMIALIGN(size, pagesize));
469+
#endif
426470
AFTER_MALLOC_CALL;
427471
return result;
428472
}
429-
#endif
430473

431474
#undef BEFORE_MALLOC_CALL
432475
#undef AFTER_MALLOC_CALL
@@ -486,19 +529,10 @@ CLINKAGE void *pvalloc(size_t size) CMK_THROW { return meta_pvalloc(size); }
486529

487530
#else
488531

532+
// So that this file can call allocators with or without interception:
533+
489534
#define mm_impl_malloc malloc
490535
#define mm_impl_free free
491-
#define mm_impl_calloc calloc
492-
#define mm_impl_cfree cfree
493-
#define mm_impl_memalign memalign
494-
#define mm_impl_posix_memalign posix_memalign
495-
#if (defined __cplusplus && __cplusplus >= 201703L) || (defined __STDC_VERSION__ && __STDC_VERSION__ >= 201112L)
496-
#define mm_impl_aligned_alloc aligned_alloc
497-
#else
498-
#define mm_impl_aligned_alloc memalign
499-
#endif
500-
#define mm_impl_valloc valloc
501-
#define mm_impl_pvalloc pvalloc
502536

503537
#endif /* CMK_MEMORY_BUILD_OS_WRAPPED || CMK_MEMORY_BUILD_GNU_HOOKS */
504538

@@ -579,7 +613,7 @@ INLINE static CMK_TYPEDEF_UINT8 MemusageProcSelfStat(void){
579613
return vsz;
580614
}
581615

582-
#if ! CMK_HAS_MALLINFO || defined(CMK_MALLINFO_IS_BROKEN)
616+
#if ! CMK_HAS_MALLINFO
583617
INLINE static CMK_TYPEDEF_UINT8 MemusageMallinfo(void){ return 0;}
584618
#else
585619
#if CMK_HAS_MALLOC_H

src/scripts/configure.ac

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1904,6 +1904,36 @@ EOT
19041904
test_link "whether has mallinfo" "yes" "no" ""
19051905
AC_DEFINE_UNQUOTED(CMK_HAS_MALLINFO, $pass, [whether has mallinfo])
19061906

1907+
#### test for cfree ###
1908+
cat > $t <<EOT
1909+
#include <stdlib.h>
1910+
int main() {
1911+
cfree(0);
1912+
}
1913+
EOT
1914+
test_link "whether has cfree" "yes" "no" ""
1915+
AC_DEFINE_UNQUOTED(CMK_HAS_CFREE, $pass, [whether has cfree])
1916+
1917+
#### test for pvalloc ###
1918+
cat > $t <<EOT
1919+
#include <malloc.h>
1920+
int main() {
1921+
return pvalloc(4096) == 0;
1922+
}
1923+
EOT
1924+
test_link "whether has pvalloc" "yes" "no" ""
1925+
AC_DEFINE_UNQUOTED(CMK_HAS_PVALLOC, $pass, [whether has pvalloc])
1926+
1927+
#### test for valloc ###
1928+
cat > $t <<EOT
1929+
#include <malloc.h>
1930+
int main() {
1931+
return valloc(4096) == 0;
1932+
}
1933+
EOT
1934+
test_link "whether has valloc" "yes" "no" ""
1935+
AC_DEFINE_UNQUOTED(CMK_HAS_VALLOC, $pass, [whether has valloc])
1936+
19071937
#### test for __morecore ###
19081938
cat > $t <<EOT
19091939
#include <cstddef>

0 commit comments

Comments
 (0)