1 /* 2 * Copyright (C) the libgit2 contributors. All rights reserved. 3 * 4 * This file is part of libgit2, distributed under the GNU GPL v2 with 5 * a Linking Exception. For full terms see the included COPYING file. 6 */ 7 module libgit2_d.sys.alloc; 8 9 10 extern (C): 11 nothrow @nogc: 12 package(libgit2_d): 13 14 /** 15 * An instance for a custom memory allocator 16 * 17 * Setting the pointers of this structure allows the developer to implement 18 * custom memory allocators. The global memory allocator can be set by using 19 * "git_libgit2_opt_t.GIT_OPT_SET_ALLOCATOR" with the `git_libgit2_opts` function. Keep in mind 20 * that all fields need to be set to a proper function. 21 */ 22 struct git_allocator 23 { 24 /** 25 * Allocate `n` bytes of memory 26 */ 27 void* function(size_t n, const (char)* file, int line) gmalloc; 28 29 /** 30 * Allocate memory for an array of `nelem` elements, where each element 31 * has a size of `elsize`. Returned memory shall be initialized to 32 * all-zeroes 33 */ 34 void* function(size_t nelem, size_t elsize, const (char)* file, int line) gcalloc; 35 36 /** 37 * Allocate memory for the string `str` and duplicate its contents. 38 */ 39 char* function(const (char)* str, const (char)* file, int line) gstrdup; 40 41 /** 42 * Equivalent to the `gstrdup` function, but only duplicating at most 43 * `n + 1` bytes 44 */ 45 char* function(const (char)* str, size_t n, const (char)* file, int line) gstrndup; 46 47 /** 48 * Equivalent to `gstrndup`, but will always duplicate exactly `n` bytes 49 * of `str`. Thus, out of bounds reads at `str` may happen. 50 */ 51 char* function(const (char)* str, size_t n, const (char)* file, int line) gsubstrdup; 52 53 /** 54 * This function shall deallocate the old object `ptr_` and return a 55 * pointer to a new object that has the size specified by `size`. In 56 * case `ptr_` is `NULL`, a new array shall be allocated. 57 */ 58 void* function(void* ptr_, size_t size, const (char)* file, int line) grealloc; 59 60 /** 61 * This function shall be equivalent to `grealloc`, but allocating 62 * `neleme * elsize` bytes. 63 */ 64 void* function(void* ptr_, size_t nelem, size_t elsize, const (char)* file, int line) greallocarray; 65 66 /** 67 * This function shall allocate a new array of `nelem` elements, where 68 * each element has a size of `elsize` bytes. 69 */ 70 void* function(size_t nelem, size_t elsize, const (char)* file, int line) gmallocarray; 71 72 /** 73 * This function shall free the memory pointed to by `ptr_`. In case 74 * `ptr_` is `NULL`, this shall be a no-op. 75 */ 76 void function(void* ptr_) gfree; 77 } 78 79 /** 80 * Initialize the allocator structure to use the `stdalloc` pointer. 81 * 82 * Set up the structure so that all of its members are using the standard 83 * "stdalloc" allocator functions. The structure can then be used with 84 * `git_allocator_setup`. 85 * 86 * @param allocator The allocator that is to be initialized. 87 * @return An error code or 0. 88 */ 89 int git_stdalloc_init_allocator(.git_allocator* allocator); 90 91 /** 92 * Initialize the allocator structure to use the `crtdbg` pointer. 93 * 94 * Set up the structure so that all of its members are using the "crtdbg" 95 * allocator functions. Note that this allocator is only available on Windows 96 * platforms and only if libgit2 is being compiled with "-DMSVC_CRTDBG". 97 * 98 * @param allocator The allocator that is to be initialized. 99 * @return An error code or 0. 100 */ 101 int git_win32_crtdbg_init_allocator(.git_allocator* allocator);