mirror of
https://github.com/git-for-windows/git.git
synced 2026-02-04 03:33:01 -06:00
Update to newer mimalloc versions like this:
update_mimalloc ()
{
test $# = 1 || {
echo "Need a mimalloc version" 1>&2;
return 1
};
for oneline in 'mimalloc: adjust for building inside Git' 'Import the source code of mimalloc';
do
git revert -n HEAD^{/^"$oneline"} && git checkout HEAD -- Makefile && git commit -sm "Temporarily revert \"$oneline\"" -m 'In preparation for upgrading to a newer mimalloc version.' || return 1;
done;
for file in $(git show --format='%n' --name-only --diff-filter=A HEAD^{/^"Import the source code of mimalloc "}) compat/mimalloc/arena-abandon.c compat/mimalloc/free.c compat/mimalloc/libc.c compat/mimalloc/prim/prim.c compat/mimalloc/mimalloc-stats.h;
do
file2=${file#compat/mimalloc/};
case "$file2" in
segment-cache.c)
: no longer needed;
continue
;;
bitmap.h | *.c)
file2=src/$file2
;;
*.h)
file2=include/$file2
;;
esac;
mkdir -p "${file%/*}" && git -C /usr/src/mimalloc/ show "$1":$file2 > "$file" && git add "$file" || {
echo "Failed: $file2 -> $file" 1>&2;
return 1
};
done;
conv_sed='sed -n "/^ *eval/d;/ /p"' && git commit -sm "Import the source code of mimalloc $1" -m "Update to newer mimalloc versions like this:" -m "$(set | sed -n '/^update_mimalloc *() *$/,/^}/{s/^./ &/;p}')" -m ' update_mimalloc $MIMALLOC_VERSION' -m 'For convenience, you can set `MIMALLOC_VERSION` and then run:' -m ' eval "$(git show -s <this-commit> | '"$conv_sed"')"' || return 1;
git cherry-pick HEAD^{/^'mimalloc: adjust for building inside Git'} || return 1
}
update_mimalloc $MIMALLOC_VERSION
For convenience, you can set `MIMALLOC_VERSION` and then run:
eval "$(git show -s <this-commit> | sed -n "/^ *eval/d;/ /p")"
Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
77 lines
2.4 KiB
C
77 lines
2.4 KiB
C
/* ----------------------------------------------------------------------------
|
|
Copyright (c) 2018-2023, Microsoft Research, Daan Leijen
|
|
This is free software; you can redistribute it and/or modify it under the
|
|
terms of the MIT license. A copy of the license can be found in the file
|
|
"LICENSE" at the root of this distribution.
|
|
-----------------------------------------------------------------------------*/
|
|
|
|
// Select the implementation of the primitives
|
|
// depending on the OS.
|
|
|
|
#if defined(_WIN32)
|
|
#include "windows/prim.c" // VirtualAlloc (Windows)
|
|
|
|
#elif defined(__APPLE__)
|
|
#include "osx/prim.c" // macOSX (actually defers to mmap in unix/prim.c)
|
|
|
|
#elif defined(__wasi__)
|
|
#define MI_USE_SBRK
|
|
#include "wasi/prim.c" // memory-grow or sbrk (Wasm)
|
|
|
|
#elif defined(__EMSCRIPTEN__)
|
|
#include "emscripten/prim.c" // emmalloc_*, + pthread support
|
|
|
|
#else
|
|
#include "unix/prim.c" // mmap() (Linux, macOSX, BSD, Illumnos, Haiku, DragonFly, etc.)
|
|
|
|
#endif
|
|
|
|
// Generic process initialization
|
|
#ifndef MI_PRIM_HAS_PROCESS_ATTACH
|
|
#if defined(__GNUC__) || defined(__clang__)
|
|
// gcc,clang: use the constructor/destructor attribute
|
|
// which for both seem to run before regular constructors/destructors
|
|
#if defined(__clang__)
|
|
#define mi_attr_constructor __attribute__((constructor(101)))
|
|
#define mi_attr_destructor __attribute__((destructor(101)))
|
|
#else
|
|
#define mi_attr_constructor __attribute__((constructor))
|
|
#define mi_attr_destructor __attribute__((destructor))
|
|
#endif
|
|
static void mi_attr_constructor mi_process_attach(void) {
|
|
_mi_auto_process_init();
|
|
}
|
|
static void mi_attr_destructor mi_process_detach(void) {
|
|
_mi_auto_process_done();
|
|
}
|
|
#elif defined(__cplusplus)
|
|
// C++: use static initialization to detect process start/end
|
|
// This is not guaranteed to be first/last but the best we can generally do?
|
|
struct mi_init_done_t {
|
|
mi_init_done_t() {
|
|
_mi_auto_process_init();
|
|
}
|
|
~mi_init_done_t() {
|
|
_mi_auto_process_done();
|
|
}
|
|
};
|
|
static mi_init_done_t mi_init_done;
|
|
#else
|
|
#pragma message("define a way to call _mi_auto_process_init/done on your platform")
|
|
#endif
|
|
#endif
|
|
|
|
// Generic allocator init/done callback
|
|
#ifndef MI_PRIM_HAS_ALLOCATOR_INIT
|
|
bool _mi_is_redirected(void) {
|
|
return false;
|
|
}
|
|
bool _mi_allocator_init(const char** message) {
|
|
if (message != NULL) { *message = NULL; }
|
|
return true;
|
|
}
|
|
void _mi_allocator_done(void) {
|
|
// nothing to do
|
|
}
|
|
#endif
|