@@ -119,6 +119,49 @@ extern inline mi_decl_restrict void* mi_malloc(size_t size) mi_attr_noexcept {
119119 return mi_heap_malloc (mi_get_default_heap (), size );
120120}
121121
122+ mi_decl_restrict void * mi_malloc_conceal (size_t size ) mi_attr_noexcept {
123+ void * p ;
124+ p = mi_heap_malloc (mi_get_default_heap (), size );
125+ if (mi_likely (p != NULL )) {
126+ #if defined(MADV_DONTDUMP )
127+ madvise (p , size , MADV_DONTDUMP );
128+ #elif defined(MADV_NOCORE )
129+ madvise (p , size , MADV_NOCORE );
130+ #endif
131+ }
132+ return p ;
133+ }
134+
135+ mi_decl_restrict void * mi_calloc_conceal (size_t count , size_t size ) mi_attr_noexcept {
136+ void * p ;
137+ p = mi_heap_calloc (mi_get_default_heap (),count ,size );
138+ if (mi_likely (p != NULL )) {
139+ #if defined(MADV_DONTDUMP )
140+ madvise (p , size , MADV_DONTDUMP );
141+ #elif defined(MADV_NOCORE )
142+ madvise (p , size , MADV_NOCORE );
143+ #endif
144+ }
145+ return p ;
146+ }
147+
148+ void mi_freezero (void * p , size_t size ) mi_attr_noexcept {
149+ mi_free (p );
150+ #if (MI_DEBUG == 0 )
151+ if (size > 0 ) {
152+ #if defined(_MSC_VER )
153+ SecureZeroMemory (p , size );
154+ #else
155+ // reusing memset return value and using memory fence
156+ // so memset call is generated regardless of the optimisation level
157+ p = memset (p , 0 , size );
158+ __asm__ volatile ("" :: "r" (p ) : "memory" );
159+ #endif
160+ }
161+ #else
162+ MI_UNUSED (size );
163+ #endif
164+ }
122165
123166void _mi_block_zero_init (const mi_page_t * page , void * p , size_t size ) {
124167 // note: we need to initialize the whole usable block size to zero, not just the requested size,
0 commit comments