diff --git a/source/lib/sysdep/win/win.cpp b/source/lib/sysdep/win/win.cpp index cf2a0bc7b1..9ed3406acf 100755 --- a/source/lib/sysdep/win/win.cpp +++ b/source/lib/sysdep/win/win.cpp @@ -38,6 +38,26 @@ void sle(int x) SetLastError((DWORD)x); } + +// +// safe allocator that may be used independently of libc malloc +// (in particular, before _cinit and while calling static dtors). +// used by wpthread critical section code. +// + +void* win_alloc(size_t size) +{ + const DWORD flags = HEAP_ZERO_MEMORY; + return HeapAlloc(GetProcessHeap(), flags, size); +} + +void win_free(void* p) +{ + const DWORD flags = 0; + HeapFree(GetProcessHeap(), flags, p); +} + + char win_sys_dir[MAX_PATH+1]; char win_exe_dir[MAX_PATH+1]; diff --git a/source/lib/sysdep/win/win_internal.h b/source/lib/sysdep/win/win_internal.h index de6467a78a..3dde1bd1dc 100755 --- a/source/lib/sysdep/win/win_internal.h +++ b/source/lib/sysdep/win/win_internal.h @@ -404,6 +404,11 @@ extern void win_lock(uint idx); extern void win_unlock(uint idx); + +extern void* win_alloc(size_t size); +extern void win_free(void* p); + + // thread safe, useable in constructors #define WIN_ONCE(code) \ { \ diff --git a/source/lib/sysdep/win/wpthread.cpp b/source/lib/sysdep/win/wpthread.cpp index 7cdbf9b21c..fc58751ac6 100644 --- a/source/lib/sysdep/win/wpthread.cpp +++ b/source/lib/sysdep/win/wpthread.cpp @@ -158,7 +158,7 @@ void pthread_join(pthread_t thread, void** value_ptr) pthread_mutex_t pthread_mutex_initializer() { - CRITICAL_SECTION* cs = (CRITICAL_SECTION*)HeapAlloc(GetProcessHeap(), 0, sizeof(CRITICAL_SECTION)); + CRITICAL_SECTION* cs = (CRITICAL_SECTION*)win_alloc(sizeof(CRITICAL_SECTION)); InitializeCriticalSection(cs); return (pthread_mutex_t)cs; } @@ -167,7 +167,7 @@ int pthread_mutex_destroy(pthread_mutex_t* m) { CRITICAL_SECTION* cs = (CRITICAL_SECTION*)(*m); DeleteCriticalSection(cs); - HeapFree(GetProcessHeap(), 0, cs); + win_free(cs); return 0; }