mirror of
https://github.com/libgit2/libgit2.git
synced 2026-06-22 06:26:26 +00:00
settings: allow swapping out memory allocator
Tie in the newly created infrastructure for swapping out memory allocators into our settings code. A user can now simply use the new option "GIT_OPT_SET_ALLOCATOR" with `git_libgit2_opts`, passing in an already initialized allocator structure as vararg.
This commit is contained in:
@@ -183,6 +183,7 @@ typedef enum {
|
||||
GIT_OPT_GET_WINDOWS_SHAREMODE,
|
||||
GIT_OPT_SET_WINDOWS_SHAREMODE,
|
||||
GIT_OPT_ENABLE_STRICT_HASH_VERIFICATION,
|
||||
GIT_OPT_SET_ALLOCATOR
|
||||
} git_libgit2_opt_t;
|
||||
|
||||
/**
|
||||
@@ -345,6 +346,12 @@ typedef enum {
|
||||
* > additional checksum calculation on each object. This defaults
|
||||
* > to enabled.
|
||||
*
|
||||
* opts(GIT_OPT_SET_ALLOCATOR, git_allocator *allocator)
|
||||
*
|
||||
* > Set the memory allocator to a different memory allocator. This
|
||||
* > allocator will then be used to make all memory allocations for
|
||||
* > libgit2 operations.
|
||||
*
|
||||
* @param option Option key
|
||||
* @param ... value to set the option
|
||||
* @return 0 on success, <0 on failure
|
||||
|
||||
@@ -72,6 +72,30 @@ typedef struct {
|
||||
void (*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
|
||||
|
||||
@@ -29,3 +29,12 @@ int git_allocator_setup(git_allocator *allocator)
|
||||
memcpy(&git__allocator, allocator, sizeof(*allocator));
|
||||
return 0;
|
||||
}
|
||||
|
||||
#if !defined(GIT_MSVC_CRTDBG)
|
||||
int git_win32_crtdbg_init_allocator(git_allocator *allocator)
|
||||
{
|
||||
GIT_UNUSED(allocator);
|
||||
giterr_set(GIT_EINVALID, "crtdbg memory allocator not available");
|
||||
return -1;
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -16,6 +16,7 @@
|
||||
#endif
|
||||
|
||||
#include <git2.h>
|
||||
#include "alloc.h"
|
||||
#include "sysdir.h"
|
||||
#include "cache.h"
|
||||
#include "global.h"
|
||||
@@ -260,6 +261,10 @@ int git_libgit2_opts(int key, ...)
|
||||
git_odb__strict_hash_verification = (va_arg(ap, int) != 0);
|
||||
break;
|
||||
|
||||
case GIT_OPT_SET_ALLOCATOR:
|
||||
error = git_allocator_setup(va_arg(ap, git_allocator *));
|
||||
break;
|
||||
|
||||
default:
|
||||
giterr_set(GITERR_INVALID, "invalid option key");
|
||||
error = -1;
|
||||
|
||||
Reference in New Issue
Block a user