diff --git a/bin/mimalloc-redirect.dll b/bin/mimalloc-redirect.dll index 14ed46ec..aaecc653 100644 Binary files a/bin/mimalloc-redirect.dll and b/bin/mimalloc-redirect.dll differ diff --git a/bin/mimalloc-redirect.lib b/bin/mimalloc-redirect.lib index cf2f95e4..0e9ca3c3 100644 Binary files a/bin/mimalloc-redirect.lib and b/bin/mimalloc-redirect.lib differ diff --git a/bin/mimalloc-redirect32.dll b/bin/mimalloc-redirect32.dll new file mode 100644 index 00000000..89b9625d Binary files /dev/null and b/bin/mimalloc-redirect32.dll differ diff --git a/bin/mimalloc-redirect32.lib b/bin/mimalloc-redirect32.lib new file mode 100644 index 00000000..aed3b67f Binary files /dev/null and b/bin/mimalloc-redirect32.lib differ diff --git a/ide/vs2017/mimalloc-override-test.vcxproj b/ide/vs2017/mimalloc-override-test.vcxproj index 7df1e79a..b8e2648b 100644 --- a/ide/vs2017/mimalloc-override-test.vcxproj +++ b/ide/vs2017/mimalloc-override-test.vcxproj @@ -100,7 +100,8 @@ - COPY /Y $(SolutionDir)..\..\bin\mimalloc-redirect32.dll $(OutputPath) + + @@ -123,7 +124,8 @@ - COPY /Y $(SolutionDir)..\..\bin\mimalloc-redirect.dll $(OutputPath) + + @@ -145,7 +147,8 @@ kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) - COPY /Y $(SolutionDir)..\..\bin\mimalloc-redirect32.dll $(OutputPath) + + @@ -169,7 +172,8 @@ kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) - COPY /Y $(SolutionDir)..\..\bin\mimalloc-redirect.dll $(OutputPath) + + diff --git a/ide/vs2017/mimalloc-override.vcxproj b/ide/vs2017/mimalloc-override.vcxproj index 7d452b55..6847e388 100644 --- a/ide/vs2017/mimalloc-override.vcxproj +++ b/ide/vs2017/mimalloc-override.vcxproj @@ -101,15 +101,20 @@ Default - %(AdditionalDependencies) + $(ProjectDir)\..\..\bin\mimalloc-redirect32.lib;%(AdditionalDependencies) Default - DllEntry false + + COPY /Y $(ProjectDir)..\..\bin\mimalloc-redirect32.dll $(OutputPath) + + + Copy mimalloc-redirect32.dll to the output directory + @@ -124,17 +129,16 @@ Default - %(AdditionalDependencies) + $(ProjectDir)\..\..\bin\mimalloc-redirect.lib;%(AdditionalDependencies) Default - DllEntry false - COPY /Y $(SolutionDir)..\..\bin\mimalloc-redirect.dll $(OutputPath) + COPY /Y $(ProjectDir)..\..\bin\mimalloc-redirect.dll $(OutputPath) copy mimalloc-redirect.dll to the output directory @@ -159,13 +163,18 @@ true true - %(AdditionalDependencies) + $(ProjectDir)\..\..\bin\mimalloc-redirect32.lib;%(AdditionalDependencies) Default - DllEntry false + + COPY /Y $(ProjectDir)..\..\bin\mimalloc-redirect32.dll $(OutputPath) + + + Copy mimalloc-redirect32.dll to the output directory + @@ -186,15 +195,14 @@ true true - %(AdditionalDependencies) + $(ProjectDir)\..\..\bin\mimalloc-redirect.lib;%(AdditionalDependencies) Default - DllEntry false - COPY /Y $(SolutionDir)..\..\bin\mimalloc-redirect.dll $(OutputPath) + COPY /Y $(ProjectDir)..\..\bin\mimalloc-redirect.dll $(OutputPath) copy mimalloc-redirect.dll to the output directory @@ -214,7 +222,6 @@ false false - true true diff --git a/ide/vs2017/mimalloc-override.vcxproj.filters b/ide/vs2017/mimalloc-override.vcxproj.filters index df0bf5ed..ffabddac 100644 --- a/ide/vs2017/mimalloc-override.vcxproj.filters +++ b/ide/vs2017/mimalloc-override.vcxproj.filters @@ -67,8 +67,5 @@ Source Files - - Source Files - \ No newline at end of file diff --git a/src/init.c b/src/init.c index f807d74a..7215e4fb 100644 --- a/src/init.c +++ b/src/init.c @@ -388,7 +388,7 @@ bool _mi_preloading() { } // Communicate with the redirection module on Windows -#if 0 +#if defined(_WIN32) && defined(MI_SHARED_LIB) #ifdef __cplusplus extern "C" { #endif @@ -475,9 +475,7 @@ static void mi_process_done(void) { #if defined(_WIN32) && defined(MI_SHARED_LIB) - // Windows DLL: easy to hook into process_init and thread_done - #include - + // Windows DLL: easy to hook into process_init and thread_done __declspec(dllexport) BOOL WINAPI DllMain(HINSTANCE inst, DWORD reason, LPVOID reserved) { UNUSED(reserved); UNUSED(inst); diff --git a/src/options.c b/src/options.c index 01620e75..9f045905 100644 --- a/src/options.c +++ b/src/options.c @@ -208,8 +208,25 @@ static void mi_strlcat(char* dest, const char* src, size_t dest_size) { dest[dest_size - 1] = 0; } -static const char* mi_getenv(const char* name) { - if (_mi_preloading()) return NULL; // don't call getenv too early +#if defined _WIN32 +#include +static bool mi_getenv(const char* name, char* result, size_t result_size) { + result[0] = 0; + bool ok = (GetEnvironmentVariableA(name, result, (DWORD)result_size) > 0); + if (!ok) { + char buf[64+1]; + size_t len = strlen(name); + if (len >= sizeof(buf)) len = sizeof(buf) - 1; + for (size_t i = 0; i < len; i++) { + buf[i] = toupper(name[i]); + } + buf[len] = 0; + ok = (GetEnvironmentVariableA(name, result, (DWORD)result_size) > 0); + } + return ok; +} +#else +static bool mi_getenv(const char* name, char* result, size_t result_size) { #pragma warning(suppress:4996) const char* s = getenv(name); if (s == NULL) { @@ -223,17 +240,23 @@ static const char* mi_getenv(const char* name) { #pragma warning(suppress:4996) s = getenv(buf); } - return s; + if (s != NULL && strlen(s) < result_size) { + mi_strlcpy(result,s,result_size); + return true; + } + else { + return false; + } } - +#endif static void mi_option_init(mi_option_desc_t* desc) { - if (!_mi_preloading()) desc->init = DEFAULTED; + desc->init = DEFAULTED; // Read option value from the environment char buf[64+1]; mi_strlcpy(buf, "mimalloc_", sizeof(buf)); mi_strlcat(buf, desc->name, sizeof(buf)); - const char* s = mi_getenv(buf); - if (s != NULL) { + char s[64+1]; + if (mi_getenv(buf, s, sizeof(s))) { size_t len = strlen(s); if (len >= sizeof(buf)) len = sizeof(buf) - 1; for (size_t i = 0; i < len; i++) { diff --git a/test/main-override.cpp b/test/main-override.cpp index 58d06c6a..385778c7 100644 --- a/test/main-override.cpp +++ b/test/main-override.cpp @@ -23,11 +23,11 @@ public: int main() { - mi_stats_reset(); // ignore earlier allocations + //mi_stats_reset(); // ignore earlier allocations atexit(free_p); void* p1 = malloc(78); void* p2 = mi_malloc_aligned(16,24); - free(p1); + free(p1); p1 = malloc(8); char* s = mi_strdup("hello\n"); mi_free(p2); @@ -40,6 +40,7 @@ int main() { delete t; t = new (std::nothrow) Test(42); delete t; + mi_stats_print(NULL); return 0; }