Line data Source code
1 : #ifndef HEADER_fd_src_util_valloc_fd_valloc_h 2 : #define HEADER_fd_src_util_valloc_fd_valloc_h 3 : 4 : #include "../fd_util_base.h" 5 : 6 : /* APIs to abstract memory allocators. */ 7 : 8 : typedef void * (* fd_valloc_malloc_fn_t)( void * allocator, ulong align, ulong sz ); 9 : typedef void (* fd_valloc_free_fn_t )( void * allocator, void * ptr ); 10 : 11 : struct fd_valloc_vtable { 12 : fd_valloc_malloc_fn_t malloc; 13 : fd_valloc_free_fn_t free; 14 : }; 15 : 16 : typedef struct fd_valloc_vtable fd_valloc_vtable_t; 17 : 18 : struct fd_valloc { 19 : void * self; 20 : fd_valloc_vtable_t const * vt; 21 : }; 22 : 23 : typedef struct fd_valloc fd_valloc_t; 24 : 25 : FD_PROTOTYPES_BEGIN 26 : 27 : extern const fd_valloc_vtable_t fd_libc_vtable; 28 : #if FD_HAS_HOSTED 29 : extern const fd_valloc_vtable_t fd_backtracing_vtable; 30 : #endif 31 : 32 : static inline FD_FN_CONST fd_valloc_t 33 0 : fd_libc_alloc_virtual( void ) { 34 0 : fd_valloc_t valloc = { NULL, &fd_libc_vtable }; 35 0 : return valloc; 36 0 : } 37 : 38 : static inline FD_FN_CONST fd_valloc_t 39 0 : fd_null_alloc_virtual( void ) { 40 0 : fd_valloc_t valloc = { NULL, NULL }; 41 0 : return valloc; 42 0 : } 43 : 44 : static inline FD_FN_CONST int 45 410946 : fd_is_null_alloc_virtual( fd_valloc_t valloc ) { 46 410946 : return (int)(valloc.vt == NULL); 47 410946 : } 48 : 49 : #if FD_HAS_HOSTED 50 : /* The backtracing valloc is a debugging tool for tracking memory leaks in 51 : applications using vallocs. It can be used in combination with 52 : contrib/tool/leak-detector.py to find potential memory leaks. */ 53 : static inline FD_FN_CONST fd_valloc_t 54 0 : fd_backtracing_alloc_virtual( fd_valloc_t * inner_valloc ) { 55 0 : fd_valloc_t valloc = { inner_valloc, &fd_backtracing_vtable }; 56 0 : return valloc; 57 0 : } 58 : #endif 59 : 60 : static inline void * 61 : fd_valloc_malloc( fd_valloc_t valloc, 62 : ulong align, 63 731718 : ulong sz ) { 64 731718 : return valloc.vt->malloc( valloc.self, align, sz ); 65 731718 : } 66 : 67 : static inline void 68 : fd_valloc_free( fd_valloc_t valloc, 69 1566141 : void * ptr ) { 70 1566141 : valloc.vt->free( valloc.self, ptr ); 71 1566141 : } 72 : 73 : FD_PROTOTYPES_END 74 : 75 : #endif /* HEADER_fd_src_util_valloc_fd_valloc_h */