summaryrefslogtreecommitdiff
path: root/include/git2/sys/alloc.h
blob: c295807bcf25a236cc4a13327d0abd89cdff1de8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
/*
 * Copyright (C) the libgit2 contributors. All rights reserved.
 *
 * This file is part of libgit2, distributed under the GNU GPL v2 with
 * a Linking Exception. For full terms see the included COPYING file.
 */

#ifndef INCLUDE_sys_git_alloc_h__
#define INCLUDE_sys_git_alloc_h__

#include "git2/common.h"

GIT_BEGIN_DECL

/**
 * An instance for a custom memory allocator
 *
 * Setting the pointers of this structure allows the developer to implement
 * custom memory allocators. The global memory allocator can be set by using
 * "GIT_OPT_SET_ALLOCATOR" with the `git_libgit2_opts` function. Keep in mind
 * that all fields need to be set to a proper function.
 */
typedef struct {
	/** Allocate `n` bytes of memory */
	void * GIT_CALLBACK(gmalloc)(size_t n, const char *file, int line);

	/**
	 * Allocate memory for an array of `nelem` elements, where each element
	 * has a size of `elsize`. Returned memory shall be initialized to
	 * all-zeroes
	 */
	void * GIT_CALLBACK(gcalloc)(size_t nelem, size_t elsize, const char *file, int line);

	/** Allocate memory for the string `str` and duplicate its contents. */
	char * GIT_CALLBACK(gstrdup)(const char *str, const char *file, int line);

	/**
	 * Equivalent to the `gstrdup` function, but only duplicating at most
	 * `n + 1` bytes
	 */
	char * GIT_CALLBACK(gstrndup)(const char *str, size_t n, const char *file, int line);

	/**
	 * Equivalent to `gstrndup`, but will always duplicate exactly `n` bytes
	 * of `str`. Thus, out of bounds reads at `str` may happen.
	 */
	char * GIT_CALLBACK(gsubstrdup)(const char *str, size_t n, const char *file, int line);

	/**
	 * This function shall deallocate the old object `ptr` and return a
	 * pointer to a new object that has the size specified by `size`. In
	 * case `ptr` is `NULL`, a new array shall be allocated.
	 */
	void * GIT_CALLBACK(grealloc)(void *ptr, size_t size, const char *file, int line);

	/**
	 * This function shall be equivalent to `grealloc`, but allocating
	 * `neleme * elsize` bytes.
	 */
	void * GIT_CALLBACK(greallocarray)(void *ptr, size_t nelem, size_t elsize, const char *file, int line);

	/**
	 * This function shall allocate a new array of `nelem` elements, where
	 * each element has a size of `elsize` bytes.
	 */
	void * GIT_CALLBACK(gmallocarray)(size_t nelem, size_t elsize, const char *file, int line);

	/**
	 * This function shall free the memory pointed to by `ptr`. In case
	 * `ptr` is `NULL`, this shall be a no-op.
	 */
	void GIT_CALLBACK(gfree)(void *ptr);
} git_allocator;

/**
 * Initialize the allocator structure to use the `stdalloc` pointer.
 *
 * Set up the structure so that all of its members are using the standard
 * "stdalloc" allocator functions. The structure can then be used with
 * `git_allocator_setup`.
 *
 * @param allocator The allocator that is to be initialized.
 * @return An error code or 0.
 */
int git_stdalloc_init_allocator(git_allocator *allocator);

/**
 * Initialize the allocator structure to use the `crtdbg` pointer.
 *
 * Set up the structure so that all of its members are using the "crtdbg"
 * allocator functions. Note that this allocator is only available on Windows
 * platforms and only if libgit2 is being compiled with "-DMSVC_CRTDBG".
 *
 * @param allocator The allocator that is to be initialized.
 * @return An error code or 0.
 */
int git_win32_crtdbg_init_allocator(git_allocator *allocator);

GIT_END_DECL

#endif