99#include <ctype.h>
1010#include <errno.h>
1111#include <inttypes.h>
12+ #include <stdatomic.h>
1213#include <stdlib.h>
1314#include <string.h>
1415
@@ -33,6 +34,7 @@ static char *DEFAULT_NAME = "disjoint";
3334struct ctl disjoint_ctl_root ;
3435static UTIL_ONCE_FLAG ctl_initialized = UTIL_ONCE_FLAG_INIT ;
3536
37+ // CTL: name attribute
3638static int CTL_READ_HANDLER (name )(void * ctx , umf_ctl_query_source_t source ,
3739 void * arg , size_t size ,
3840 umf_ctl_index_utlist_t * indexes ,
@@ -66,10 +68,25 @@ static int CTL_WRITE_HANDLER(name)(void *ctx, umf_ctl_query_source_t source,
6668 return 0 ;
6769}
6870
69- static const umf_ctl_node_t CTL_NODE (disjoint )[] = {CTL_LEAF_RW (name ),
70- CTL_NODE_END };
71+ // CTL: allocation counters
72+ atomic_int counter_alloc_balance ;
73+ // atomic_fetch_add(&counter_alloc_balance, 1);
74+
75+ static int CTL_READ_HANDLER (allocation_balance )(
76+ void * ctx , umf_ctl_query_source_t source , void * arg , size_t size ,
77+ umf_ctl_index_utlist_t * indexes , const char * extra_name ,
78+ umf_ctl_query_type_t queryType ) {
79+ (void )ctx , (void )source , (void )size , (void )indexes , (void )extra_name ,
80+ (void )queryType ;
81+ * (int * )arg = atomic_load (& counter_alloc_balance );
82+ return 0 ;
83+ }
84+
85+ static const umf_ctl_node_t CTL_NODE (disjoint )[] = {
86+ CTL_LEAF_RW (name ), CTL_LEAF_RO (allocation_balance ), CTL_NODE_END };
7187
7288static void initialize_disjoint_ctl (void ) {
89+ atomic_init (& counter_alloc_balance , 0 );
7390 CTL_REGISTER_MODULE (& disjoint_ctl_root , disjoint );
7491}
7592
@@ -745,7 +762,7 @@ umf_result_t disjoint_pool_initialize(umf_memory_provider_handle_t provider,
745762void * disjoint_pool_malloc (void * pool , size_t size ) {
746763 disjoint_pool_t * hPool = (disjoint_pool_t * )pool ;
747764 void * ptr = disjoint_pool_allocate (hPool , size );
748-
765+ atomic_fetch_add ( & counter_alloc_balance , 1 );
749766 return ptr ;
750767}
751768
@@ -779,6 +796,7 @@ void *disjoint_pool_aligned_malloc(void *pool, size_t size, size_t alignment) {
779796 }
780797
781798 if (alignment <= 1 ) {
799+ atomic_fetch_add (& counter_alloc_balance , 1 );
782800 return disjoint_pool_allocate (pool , size );
783801 }
784802
@@ -809,6 +827,7 @@ void *disjoint_pool_aligned_malloc(void *pool, size_t size, size_t alignment) {
809827
810828 assert (ptr );
811829 utils_annotate_memory_undefined (ptr , size );
830+ atomic_fetch_add (& counter_alloc_balance , 1 );
812831 return ptr ;
813832 }
814833
@@ -847,6 +866,7 @@ void *disjoint_pool_aligned_malloc(void *pool, size_t size, size_t alignment) {
847866 (from_pool ? "pool" : "provider" ), ptr );
848867 }
849868
869+ atomic_fetch_add (& counter_alloc_balance , 1 );
850870 return aligned_ptr ;
851871}
852872
@@ -914,6 +934,8 @@ umf_result_t disjoint_pool_free(void *pool, void *ptr) {
914934 if (ret != UMF_RESULT_SUCCESS ) {
915935 TLS_last_allocation_error = ret ;
916936 LOG_ERR ("deallocation from the memory provider failed" );
937+ } else {
938+ atomic_fetch_sub (& counter_alloc_balance , 1 );
917939 }
918940
919941 return ret ;
@@ -958,6 +980,7 @@ umf_result_t disjoint_pool_free(void *pool, void *ptr) {
958980 disjoint_pool -> params .cur_pool_size );
959981 }
960982
983+ atomic_fetch_sub (& counter_alloc_balance , 1 );
961984 return UMF_RESULT_SUCCESS ;
962985}
963986
0 commit comments