https://bugs.exim.org/show_bug.cgi?id=2377
Giuseppe D'Angelo <[email protected]> changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |[email protected] --- Comment #2 from Giuseppe D'Angelo <[email protected]> --- What's the minimum Windows version that PCRE wants to support? On Windows 7, it's fairly easy using the INIT_ONCE family of functions, for instance as described here: https://docs.microsoft.com/it-it/windows/desktop/Sync/using-one-time-initialization So possibly something like this (just written here, not tested...): static HANDLE global_mutex = 0; static INIT_ONCE global_mutex_once = INIT_ONCE_STATIC_INIT; static BOOL CALLBACK sljit_grab_lock_initialize(PINIT_ONCE, PVOID, PVOID *) { global_mutex = CreateMutex(NULL, TRUE, NULL); return TRUE; } And change sljit_grab_lock to do { if (!InitOnceExecuteOnce(&global_mutex_once, sljit_grab_lock_initialize, NULL, NULL)) /* OS failure. abort()? */ WaitForSingleObject(global_mutex, INFINITE); } If you also need to support earlier versions of Windows, then one has to use the Interlocked API: https://docs.microsoft.com/en-us/windows/desktop/sync/interlocked-variable-access Basically using the fact that HANDLE is a PVOID. So (again, pseudocode): static volatile HANDLE global_mutex = 0; SLJIT_API_FUNC_ATTRIBUTE void SLJIT_FUNC sljit_grab_lock(void) { if (!global_mutex) { // this read is atomic on Windows HANDLE mutex = CreateMutex(NULL, TRUE, NULL); if (InterlockedCompareExchangePointer(&global_mutex, mutex, NULL) != NULL) { // some other thread got there first CloseHandle(mutex); } } WaitForSingleObject(global_mutex, INFINITE); } Hope this helps. -- You are receiving this mail because: You are on the CC list for the bug. -- ## List details at https://lists.exim.org/mailman/listinfo/pcre-dev
