5050#include <umf/memory_pool.h>
5151#include <umf/memory_provider.h>
5252#include <umf/providers/provider_os_memory.h>
53+ #include <umf/proxy_lib_handlers.h>
5354
5455#include "base_alloc_linear.h"
55- #include "proxy_lib.h"
5656#include "utils_common.h"
5757#include "utils_load_library.h"
5858#include "utils_log.h"
@@ -135,6 +135,22 @@ static __TLS int was_called_from_umfPool = 0;
135135// TODO remove this WA when the issue is fixed.
136136static __TLS int was_called_from_malloc_usable_size = 0 ;
137137
138+ // malloc API handlers
139+ static umf_proxy_lib_handler_malloc_pre_t Handler_malloc_pre = NULL ;
140+ static umf_proxy_lib_handler_aligned_malloc_pre_t Handler_aligned_malloc_pre =
141+ NULL ;
142+ static umf_proxy_lib_handler_free_pre_t Handler_free_pre = NULL ;
143+
144+ static umf_proxy_lib_handler_malloc_post_t Handler_malloc_post = NULL ;
145+ static umf_proxy_lib_handler_aligned_malloc_post_t Handler_aligned_malloc_post =
146+ NULL ;
147+
148+ static void * Handler_malloc_pre_user_data = NULL ;
149+ static void * Handler_aligned_malloc_pre_user_data = NULL ;
150+ static void * Handler_free_pre_user_data = NULL ;
151+ static void * Handler_malloc_post_user_data = NULL ;
152+ static void * Handler_aligned_malloc_post_user_data = NULL ;
153+
138154/*****************************************************************************/
139155/*** The constructor and destructor of the proxy library *********************/
140156/*****************************************************************************/
@@ -353,20 +369,35 @@ static inline size_t ba_leak_pool_contains_pointer(void *ptr) {
353369/*****************************************************************************/
354370
355371void * malloc (size_t size ) {
372+ umf_memory_pool_handle_t pool = Proxy_pool ;
373+ if (Handler_malloc_pre ) {
374+ Handler_malloc_pre (Handler_malloc_pre_user_data , & pool , & size );
375+ }
376+
377+ void * ptr = NULL ;
356378#ifndef _WIN32
357379 if (size < Size_threshold_value ) {
358- return System_malloc (size );
380+ ptr = System_malloc (size );
381+ goto handler_post ;
359382 }
383+
360384#endif /* _WIN32 */
361385
362- if (!was_called_from_umfPool && Proxy_pool ) {
386+ if (!was_called_from_umfPool && pool ) {
363387 was_called_from_umfPool = 1 ;
364- void * ptr = umfPoolMalloc (Proxy_pool , size );
388+ ptr = umfPoolMalloc (pool , size );
365389 was_called_from_umfPool = 0 ;
366- return ptr ;
390+ goto handler_post ;
367391 }
368392
369- return ba_leak_malloc (size );
393+ ptr = ba_leak_malloc (size );
394+
395+ handler_post :
396+ if (Handler_malloc_post ) {
397+ Handler_malloc_post (Handler_malloc_post_user_data , & ptr , pool );
398+ }
399+
400+ return ptr ;
370401}
371402
372403void * calloc (size_t nmemb , size_t size ) {
@@ -391,11 +422,19 @@ void free(void *ptr) {
391422 return ;
392423 }
393424
425+ // NOTE: for system allocations made during UMF and Proxy Lib
426+ // initialisation, we never call free handlers, as they should handle
427+ // only user-made allocations
394428 if (ba_leak_free (ptr ) == 0 ) {
395429 return ;
396430 }
397431
398- if (Proxy_pool && (umfPoolByPtr (ptr ) == Proxy_pool )) {
432+ umf_memory_pool_handle_t pool = umfPoolByPtr (ptr );
433+ if (Proxy_pool && (pool == Proxy_pool )) {
434+ if (Handler_free_pre ) {
435+ Handler_free_pre (Handler_free_pre_user_data , ptr , pool );
436+ }
437+
399438 if (umfPoolFree (Proxy_pool , ptr ) != UMF_RESULT_SUCCESS ) {
400439 LOG_ERR ("umfPoolFree() failed" );
401440 }
@@ -404,6 +443,9 @@ void free(void *ptr) {
404443
405444#ifndef _WIN32
406445 if (Size_threshold_value ) {
446+ if (Handler_free_pre ) {
447+ Handler_free_pre (Handler_free_pre_user_data , ptr , NULL );
448+ }
407449 System_free (ptr );
408450 return ;
409451 }
@@ -448,20 +490,36 @@ void *realloc(void *ptr, size_t size) {
448490}
449491
450492void * aligned_alloc (size_t alignment , size_t size ) {
493+ umf_memory_pool_handle_t pool = Proxy_pool ;
494+ if (Handler_aligned_malloc_pre ) {
495+ Handler_aligned_malloc_pre (Handler_aligned_malloc_pre_user_data , & pool ,
496+ & size , & alignment );
497+ }
498+
499+ void * ptr = NULL ;
451500#ifndef _WIN32
452501 if (size < Size_threshold_value ) {
453- return System_aligned_alloc (alignment , size );
502+ ptr = System_aligned_alloc (alignment , size );
503+ goto handler_post ;
454504 }
455505#endif /* _WIN32 */
456506
457507 if (!was_called_from_umfPool && Proxy_pool ) {
458508 was_called_from_umfPool = 1 ;
459- void * ptr = umfPoolAlignedMalloc (Proxy_pool , size , alignment );
509+ ptr = umfPoolAlignedMalloc (Proxy_pool , size , alignment );
460510 was_called_from_umfPool = 0 ;
461- return ptr ;
511+ goto handler_post ;
462512 }
463513
464- return ba_leak_aligned_alloc (alignment , size );
514+ ptr = ba_leak_aligned_alloc (alignment , size );
515+
516+ handler_post :
517+ if (Handler_aligned_malloc_post ) {
518+ Handler_aligned_malloc_post (Handler_aligned_malloc_post_user_data , & ptr ,
519+ pool );
520+ }
521+
522+ return ptr ;
465523}
466524
467525#ifdef _WIN32
@@ -555,3 +613,35 @@ void *_aligned_offset_recalloc(void *ptr, size_t num, size_t size,
555613}
556614
557615#endif
616+
617+ // malloc API handlers
618+
619+ void umfSetProxyLibHandlerMallocPre (umf_proxy_lib_handler_malloc_pre_t handler ,
620+ void * user_data ) {
621+ Handler_malloc_pre = handler ;
622+ Handler_malloc_pre_user_data = user_data ;
623+ }
624+
625+ void umfSetProxyLibHandlerAlignedMallocPre (
626+ umf_proxy_lib_handler_aligned_malloc_pre_t handler , void * user_data ) {
627+ Handler_aligned_malloc_pre = handler ;
628+ Handler_aligned_malloc_pre_user_data = user_data ;
629+ }
630+
631+ void umfSetProxyLibHandlerFreePre (umf_proxy_lib_handler_free_pre_t handler ,
632+ void * user_data ) {
633+ Handler_free_pre = handler ;
634+ Handler_free_pre_user_data = user_data ;
635+ }
636+
637+ void umfSetProxyLibHandlerMallocPost (
638+ umf_proxy_lib_handler_malloc_post_t handler , void * user_data ) {
639+ Handler_malloc_post = handler ;
640+ Handler_malloc_post_user_data = user_data ;
641+ }
642+
643+ void umfSetProxyLibHandlerAlignedMallocPost (
644+ umf_proxy_lib_handler_aligned_malloc_post_t handler , void * user_data ) {
645+ Handler_aligned_malloc_post = handler ;
646+ Handler_aligned_malloc_post_user_data = user_data ;
647+ }
0 commit comments