mirror of
https://github.com/microsoft/mimalloc.git
synced 2025-05-06 23:39:31 +03:00
Merge branch 'dev' into dev2
This commit is contained in:
commit
4ded84afdc
3 changed files with 16 additions and 15 deletions
|
@ -64,8 +64,8 @@ terms of the MIT license. A copy of the license can be found in the file
|
||||||
|
|
||||||
// "libc.c"
|
// "libc.c"
|
||||||
#include <stdarg.h>
|
#include <stdarg.h>
|
||||||
void _mi_vsnprintf(char* buf, size_t bufsize, const char* fmt, va_list args);
|
int _mi_vsnprintf(char* buf, size_t bufsize, const char* fmt, va_list args);
|
||||||
void _mi_snprintf(char* buf, size_t buflen, const char* fmt, ...);
|
int _mi_snprintf(char* buf, size_t buflen, const char* fmt, ...);
|
||||||
char _mi_toupper(char c);
|
char _mi_toupper(char c);
|
||||||
int _mi_strnicmp(const char* s, const char* t, size_t n);
|
int _mi_strnicmp(const char* s, const char* t, size_t n);
|
||||||
void _mi_strlcpy(char* dest, const char* src, size_t dest_size);
|
void _mi_strlcpy(char* dest, const char* src, size_t dest_size);
|
||||||
|
|
24
src/libc.c
24
src/libc.c
|
@ -7,7 +7,7 @@ terms of the MIT license. A copy of the license can be found in the file
|
||||||
|
|
||||||
// --------------------------------------------------------
|
// --------------------------------------------------------
|
||||||
// This module defines various std libc functions to reduce
|
// This module defines various std libc functions to reduce
|
||||||
// the dependency on libc, and also prevent errors caused
|
// the dependency on libc, and also prevent errors caused
|
||||||
// by some libc implementations when called before `main`
|
// by some libc implementations when called before `main`
|
||||||
// executes (due to malloc redirection)
|
// executes (due to malloc redirection)
|
||||||
// --------------------------------------------------------
|
// --------------------------------------------------------
|
||||||
|
@ -83,7 +83,7 @@ bool _mi_getenv(const char* name, char* result, size_t result_size) {
|
||||||
// Define our own limited `_mi_vsnprintf` and `_mi_snprintf`
|
// Define our own limited `_mi_vsnprintf` and `_mi_snprintf`
|
||||||
// This is mostly to avoid calling these when libc is not yet
|
// This is mostly to avoid calling these when libc is not yet
|
||||||
// initialized (and to reduce dependencies)
|
// initialized (and to reduce dependencies)
|
||||||
//
|
//
|
||||||
// format: d i, p x u, s
|
// format: d i, p x u, s
|
||||||
// prec: z l ll L
|
// prec: z l ll L
|
||||||
// width: 10
|
// width: 10
|
||||||
|
@ -130,7 +130,7 @@ static void mi_out_alignright(char fill, char* start, size_t len, size_t extra,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static void mi_out_num(uintmax_t x, size_t base, char prefix, char** out, char* end)
|
static void mi_out_num(uintmax_t x, size_t base, char prefix, char** out, char* end)
|
||||||
{
|
{
|
||||||
if (x == 0 || base == 0 || base > 16) {
|
if (x == 0 || base == 0 || base > 16) {
|
||||||
if (prefix != 0) { mi_outc(prefix, out, end); }
|
if (prefix != 0) { mi_outc(prefix, out, end); }
|
||||||
|
@ -144,8 +144,8 @@ static void mi_out_num(uintmax_t x, size_t base, char prefix, char** out, char*
|
||||||
mi_outc((digit <= 9 ? '0' + digit : 'A' + digit - 10),out,end);
|
mi_outc((digit <= 9 ? '0' + digit : 'A' + digit - 10),out,end);
|
||||||
x = x / base;
|
x = x / base;
|
||||||
}
|
}
|
||||||
if (prefix != 0) {
|
if (prefix != 0) {
|
||||||
mi_outc(prefix, out, end);
|
mi_outc(prefix, out, end);
|
||||||
}
|
}
|
||||||
size_t len = *out - start;
|
size_t len = *out - start;
|
||||||
// and reverse in-place
|
// and reverse in-place
|
||||||
|
@ -160,8 +160,8 @@ static void mi_out_num(uintmax_t x, size_t base, char prefix, char** out, char*
|
||||||
|
|
||||||
#define MI_NEXTC() c = *in; if (c==0) break; in++;
|
#define MI_NEXTC() c = *in; if (c==0) break; in++;
|
||||||
|
|
||||||
void _mi_vsnprintf(char* buf, size_t bufsize, const char* fmt, va_list args) {
|
int _mi_vsnprintf(char* buf, size_t bufsize, const char* fmt, va_list args) {
|
||||||
if (buf == NULL || bufsize == 0 || fmt == NULL) return;
|
if (buf == NULL || bufsize == 0 || fmt == NULL) return 0;
|
||||||
buf[bufsize - 1] = 0;
|
buf[bufsize - 1] = 0;
|
||||||
char* const end = buf + (bufsize - 1);
|
char* const end = buf + (bufsize - 1);
|
||||||
const char* in = fmt;
|
const char* in = fmt;
|
||||||
|
@ -181,7 +181,7 @@ void _mi_vsnprintf(char* buf, size_t bufsize, const char* fmt, va_list args) {
|
||||||
size_t width = 0;
|
size_t width = 0;
|
||||||
char numtype = 'd';
|
char numtype = 'd';
|
||||||
char numplus = 0;
|
char numplus = 0;
|
||||||
bool alignright = true;
|
bool alignright = true;
|
||||||
if (c == '+' || c == ' ') { numplus = c; MI_NEXTC(); }
|
if (c == '+' || c == ' ') { numplus = c; MI_NEXTC(); }
|
||||||
if (c == '-') { alignright = false; MI_NEXTC(); }
|
if (c == '-') { alignright = false; MI_NEXTC(); }
|
||||||
if (c == '0') { fill = '0'; MI_NEXTC(); }
|
if (c == '0') { fill = '0'; MI_NEXTC(); }
|
||||||
|
@ -191,7 +191,7 @@ void _mi_vsnprintf(char* buf, size_t bufsize, const char* fmt, va_list args) {
|
||||||
width = (10 * width) + (c - '0'); MI_NEXTC();
|
width = (10 * width) + (c - '0'); MI_NEXTC();
|
||||||
}
|
}
|
||||||
if (c == 0) break; // extra check due to while
|
if (c == 0) break; // extra check due to while
|
||||||
}
|
}
|
||||||
if (c == 'z' || c == 't' || c == 'L') { numtype = c; MI_NEXTC(); }
|
if (c == 'z' || c == 't' || c == 'L') { numtype = c; MI_NEXTC(); }
|
||||||
else if (c == 'l') {
|
else if (c == 'l') {
|
||||||
numtype = c; MI_NEXTC();
|
numtype = c; MI_NEXTC();
|
||||||
|
@ -265,11 +265,13 @@ void _mi_vsnprintf(char* buf, size_t bufsize, const char* fmt, va_list args) {
|
||||||
}
|
}
|
||||||
mi_assert_internal(out <= end);
|
mi_assert_internal(out <= end);
|
||||||
*out = 0;
|
*out = 0;
|
||||||
|
return (int)(out - buf);
|
||||||
}
|
}
|
||||||
|
|
||||||
void _mi_snprintf(char* buf, size_t buflen, const char* fmt, ...) {
|
int _mi_snprintf(char* buf, size_t buflen, const char* fmt, ...) {
|
||||||
va_list args;
|
va_list args;
|
||||||
va_start(args, fmt);
|
va_start(args, fmt);
|
||||||
_mi_vsnprintf(buf, buflen, fmt, args);
|
const int written = _mi_vsnprintf(buf, buflen, fmt, args);
|
||||||
va_end(args);
|
va_end(args);
|
||||||
|
return written;
|
||||||
}
|
}
|
||||||
|
|
|
@ -412,7 +412,7 @@ void _mi_page_force_abandon(mi_page_t* page) {
|
||||||
|
|
||||||
// ensure this page is no longer in the heap delayed free list
|
// ensure this page is no longer in the heap delayed free list
|
||||||
_mi_heap_delayed_free_all(heap);
|
_mi_heap_delayed_free_all(heap);
|
||||||
// We can still access the page meta-info even if it is freed as we ensure
|
// We can still access the page meta-info even if it is freed as we ensure
|
||||||
// in `mi_segment_force_abandon` that the segment is not freed (yet)
|
// in `mi_segment_force_abandon` that the segment is not freed (yet)
|
||||||
if (page->capacity == 0) return; // it may have been freed now
|
if (page->capacity == 0) return; // it may have been freed now
|
||||||
|
|
||||||
|
@ -1023,7 +1023,6 @@ void* _mi_malloc_generic(mi_heap_t* heap, size_t size, bool zero, size_t huge_al
|
||||||
}
|
}
|
||||||
// move singleton pages to the full queue
|
// move singleton pages to the full queue
|
||||||
if (page->reserved == page->used) {
|
if (page->reserved == page->used) {
|
||||||
mi_assert_internal(page->reserved == 1);
|
|
||||||
mi_page_to_full(page, mi_page_queue_of(page));
|
mi_page_to_full(page, mi_page_queue_of(page));
|
||||||
}
|
}
|
||||||
return p;
|
return p;
|
||||||
|
|
Loading…
Add table
Reference in a new issue