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;
}