50
50
#include <umf/memory_pool.h>
51
51
#include <umf/memory_provider.h>
52
52
#include <umf/providers/provider_os_memory.h>
53
+ #include <umf/proxy_lib_handlers.h>
53
54
54
55
#include "base_alloc_linear.h"
55
- #include "proxy_lib.h"
56
56
#include "utils_common.h"
57
57
#include "utils_load_library.h"
58
58
#include "utils_log.h"
@@ -135,6 +135,22 @@ static __TLS int was_called_from_umfPool = 0;
135
135
// TODO remove this WA when the issue is fixed.
136
136
static __TLS int was_called_from_malloc_usable_size = 0 ;
137
137
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
+
138
154
/*****************************************************************************/
139
155
/*** The constructor and destructor of the proxy library *********************/
140
156
/*****************************************************************************/
@@ -353,20 +369,35 @@ static inline size_t ba_leak_pool_contains_pointer(void *ptr) {
353
369
/*****************************************************************************/
354
370
355
371
void * 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 ;
356
378
#ifndef _WIN32
357
379
if (size < Size_threshold_value ) {
358
- return System_malloc (size );
380
+ ptr = System_malloc (size );
381
+ goto handler_post ;
359
382
}
383
+
360
384
#endif /* _WIN32 */
361
385
362
- if (!was_called_from_umfPool && Proxy_pool ) {
386
+ if (!was_called_from_umfPool && pool ) {
363
387
was_called_from_umfPool = 1 ;
364
- void * ptr = umfPoolMalloc (Proxy_pool , size );
388
+ ptr = umfPoolMalloc (pool , size );
365
389
was_called_from_umfPool = 0 ;
366
- return ptr ;
390
+ goto handler_post ;
367
391
}
368
392
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 ;
370
401
}
371
402
372
403
void * calloc (size_t nmemb , size_t size ) {
@@ -387,15 +418,28 @@ void *calloc(size_t nmemb, size_t size) {
387
418
}
388
419
389
420
void free (void * ptr ) {
421
+ umf_memory_pool_handle_t pool = NULL ;
422
+ if (Handler_free_pre ) {
423
+ pool = umfPoolByPtr (ptr );
424
+ Handler_free_pre (Handler_free_pre_user_data , & ptr , pool );
425
+ }
426
+
390
427
if (ptr == NULL ) {
391
428
return ;
392
429
}
393
430
431
+ // NOTE: for system allocations made during UMF and Proxy Lib
432
+ // initialisation, we never call free handlers, as they should handle
433
+ // only user-made allocations
394
434
if (ba_leak_free (ptr ) == 0 ) {
395
435
return ;
396
436
}
397
437
398
- if (Proxy_pool && (umfPoolByPtr (ptr ) == Proxy_pool )) {
438
+ if (Proxy_pool && pool == NULL ) {
439
+ pool = umfPoolByPtr (ptr );
440
+ }
441
+
442
+ if (pool == Proxy_pool ) {
399
443
if (umfPoolFree (Proxy_pool , ptr ) != UMF_RESULT_SUCCESS ) {
400
444
LOG_ERR ("umfPoolFree() failed" );
401
445
}
@@ -448,20 +492,36 @@ void *realloc(void *ptr, size_t size) {
448
492
}
449
493
450
494
void * aligned_alloc (size_t alignment , size_t size ) {
495
+ umf_memory_pool_handle_t pool = Proxy_pool ;
496
+ if (Handler_aligned_malloc_pre ) {
497
+ Handler_aligned_malloc_pre (Handler_aligned_malloc_pre_user_data , & pool ,
498
+ & size , & alignment );
499
+ }
500
+
501
+ void * ptr = NULL ;
451
502
#ifndef _WIN32
452
503
if (size < Size_threshold_value ) {
453
- return System_aligned_alloc (alignment , size );
504
+ ptr = System_aligned_alloc (alignment , size );
505
+ goto handler_post ;
454
506
}
455
507
#endif /* _WIN32 */
456
508
457
509
if (!was_called_from_umfPool && Proxy_pool ) {
458
510
was_called_from_umfPool = 1 ;
459
- void * ptr = umfPoolAlignedMalloc (Proxy_pool , size , alignment );
511
+ ptr = umfPoolAlignedMalloc (Proxy_pool , size , alignment );
460
512
was_called_from_umfPool = 0 ;
461
- return ptr ;
513
+ goto handler_post ;
462
514
}
463
515
464
- return ba_leak_aligned_alloc (alignment , size );
516
+ ptr = ba_leak_aligned_alloc (alignment , size );
517
+
518
+ handler_post :
519
+ if (Handler_aligned_malloc_post ) {
520
+ Handler_aligned_malloc_post (Handler_aligned_malloc_post_user_data , & ptr ,
521
+ pool );
522
+ }
523
+
524
+ return ptr ;
465
525
}
466
526
467
527
#ifdef _WIN32
@@ -555,3 +615,35 @@ void *_aligned_offset_recalloc(void *ptr, size_t num, size_t size,
555
615
}
556
616
557
617
#endif
618
+
619
+ // malloc API handlers
620
+
621
+ void umfSetProxyLibHandlerMallocPre (umf_proxy_lib_handler_malloc_pre_t handler ,
622
+ void * user_data ) {
623
+ Handler_malloc_pre = handler ;
624
+ Handler_malloc_pre_user_data = user_data ;
625
+ }
626
+
627
+ void umfSetProxyLibHandlerAlignedMallocPre (
628
+ umf_proxy_lib_handler_aligned_malloc_pre_t handler , void * user_data ) {
629
+ Handler_aligned_malloc_pre = handler ;
630
+ Handler_aligned_malloc_pre_user_data = user_data ;
631
+ }
632
+
633
+ void umfSetProxyLibHandlerFreePre (umf_proxy_lib_handler_free_pre_t handler ,
634
+ void * user_data ) {
635
+ Handler_free_pre = handler ;
636
+ Handler_free_pre_user_data = user_data ;
637
+ }
638
+
639
+ void umfSetProxyLibHandlerMallocPost (
640
+ umf_proxy_lib_handler_malloc_post_t handler , void * user_data ) {
641
+ Handler_malloc_post = handler ;
642
+ Handler_malloc_post_user_data = user_data ;
643
+ }
644
+
645
+ void umfSetProxyLibHandlerAlignedMallocPost (
646
+ umf_proxy_lib_handler_aligned_malloc_post_t handler , void * user_data ) {
647
+ Handler_aligned_malloc_post = handler ;
648
+ Handler_aligned_malloc_post_user_data = user_data ;
649
+ }
0 commit comments