1818#include <umf/memory_provider_ops.h>
1919#include <umf/providers/provider_file_memory.h>
2020
21+ #include "provider_ctl_stats_type.h"
2122#include "utils_log.h"
2223
2324#if defined(_WIN32 ) || defined(UMF_NO_HWLOC )
@@ -77,6 +78,7 @@ umf_result_t umfFileMemoryProviderParamsSetVisibility(
7778#include "utils_common.h"
7879#include "utils_concurrency.h"
7980#include "utils_log.h"
81+ #include "provider_ctl_stats_type.h"
8082
8183#define FSDAX_PAGE_SIZE_2MB ((size_t)(2 * 1024 * 1024)) // == 2 MB
8284
@@ -112,8 +114,12 @@ typedef struct file_memory_provider_t {
112114 critnib * fd_offset_map ;
113115
114116 coarse_t * coarse ; // coarse library handle
117+ ctl_stats_t stats ;
115118} file_memory_provider_t ;
116119
120+ #define CTL_PROVIDER_TYPE file_memory_provider_t
121+ #include "provider_ctl_stats_impl.h"
122+
117123// File Memory Provider settings struct
118124typedef struct umf_file_memory_provider_params_t {
119125 char * path ;
@@ -139,6 +145,9 @@ static __TLS file_last_native_error_t TLS_last_native_error;
139145#define _UMF_FILE_RESULT_ERROR_PURGE_FORCE_FAILED \
140146 (UMF_FILE_RESULT_ERROR_PURGE_FORCE_FAILED - UMF_FILE_RESULT_SUCCESS)
141147
148+ struct ctl file_memory_ctl_root ;
149+ static UTIL_ONCE_FLAG ctl_initialized = UTIL_ONCE_FLAG_INIT ;
150+
142151static const char * Native_error_str [] = {
143152 [_UMF_FILE_RESULT_SUCCESS ] = "success" ,
144153 [_UMF_FILE_RESULT_ERROR_ALLOC_FAILED ] = "memory allocation failed" ,
@@ -152,6 +161,10 @@ static void file_store_last_native_error(int32_t native_error,
152161 TLS_last_native_error .errno_value = errno_value ;
153162}
154163
164+ static void initialize_file_ctl (void ) {
165+ CTL_REGISTER_MODULE (& file_memory_ctl_root , stats );
166+ }
167+
155168static umf_result_t
156169file_translate_params (const umf_file_memory_provider_params_t * in_params ,
157170 file_memory_provider_t * provider ) {
@@ -496,7 +509,12 @@ static umf_result_t file_alloc_aligned(file_memory_provider_t *file_provider,
496509static umf_result_t file_alloc (void * provider , size_t size , size_t alignment ,
497510 void * * resultPtr ) {
498511 file_memory_provider_t * file_provider = (file_memory_provider_t * )provider ;
499- return coarse_alloc (file_provider -> coarse , size , alignment , resultPtr );
512+ umf_result_t ret =
513+ coarse_alloc (file_provider -> coarse , size , alignment , resultPtr );
514+ if (ret == UMF_RESULT_SUCCESS ) {
515+ provider_ctl_stats_alloc (file_provider , size );
516+ }
517+ return ret ;
500518}
501519
502520static umf_result_t file_alloc_cb (void * provider , size_t size , size_t alignment ,
@@ -859,9 +877,22 @@ static umf_result_t file_close_ipc_handle(void *provider, void *ptr,
859877 return UMF_RESULT_SUCCESS ;
860878}
861879
880+ static umf_result_t file_ctl (void * provider ,
881+ umf_ctl_query_source_t operationType ,
882+ const char * name , void * arg , size_t size ,
883+ umf_ctl_query_type_t query_type , va_list args ) {
884+ utils_init_once (& ctl_initialized , initialize_file_ctl );
885+ return ctl_query (& file_memory_ctl_root , provider , operationType , name ,
886+ query_type , arg , size , args );
887+ }
888+
862889static umf_result_t file_free (void * provider , void * ptr , size_t size ) {
863890 file_memory_provider_t * file_provider = (file_memory_provider_t * )provider ;
864- return coarse_free (file_provider -> coarse , ptr , size );
891+ umf_result_t ret = coarse_free (file_provider -> coarse , ptr , size );
892+ if (ret == UMF_RESULT_SUCCESS ) {
893+ provider_ctl_stats_free (file_provider , size );
894+ }
895+ return ret ;
865896}
866897
867898static umf_memory_provider_ops_t UMF_FILE_MEMORY_PROVIDER_OPS = {
@@ -882,7 +913,8 @@ static umf_memory_provider_ops_t UMF_FILE_MEMORY_PROVIDER_OPS = {
882913 .ext_get_ipc_handle = file_get_ipc_handle ,
883914 .ext_put_ipc_handle = file_put_ipc_handle ,
884915 .ext_open_ipc_handle = file_open_ipc_handle ,
885- .ext_close_ipc_handle = file_close_ipc_handle };
916+ .ext_close_ipc_handle = file_close_ipc_handle ,
917+ .ext_ctl = file_ctl };
886918
887919const umf_memory_provider_ops_t * umfFileMemoryProviderOps (void ) {
888920 return & UMF_FILE_MEMORY_PROVIDER_OPS ;
0 commit comments