/* _HandleCreators is a NULL-terminated array with a maximun of HANDLE_CREATOR_MAX HANDLE_CREATOR */
#define HANDLE_CLOSE_CB_MAX 128
static HANDLE_CLOSE_CB **_HandleCloseCbs = NULL;
+static CRITICAL_SECTION _HandleCloseCbsLock;
static pthread_once_t _HandleCloseCbsInitialized = PTHREAD_ONCE_INIT;
static void _HandleCloseCbsInit()
_HandleCloseCbs = (HANDLE_CLOSE_CB**)calloc(HANDLE_CLOSE_CB_MAX+1, sizeof(HANDLE_CLOSE_CB*));
+ InitializeCriticalSection(&_HandleCloseCbsLock);
+
assert(_HandleCloseCbs != NULL);
}
return FALSE;
}
+ EnterCriticalSection(&_HandleCloseCbsLock);
for (i=0; i<HANDLE_CLOSE_CB_MAX; i++)
{
if (_HandleCloseCbs[i] == NULL)
{
_HandleCloseCbs[i] = pHandleCloseCb;
+
+ LeaveCriticalSection(&_HandleCloseCbsLock);
return TRUE;
}
}
+ LeaveCriticalSection(&_HandleCloseCbsLock);
return FALSE;
}
return FALSE;
}
+
+ EnterCriticalSection(&_HandleCloseCbsLock);
+
for (i=0; _HandleCloseCbs[i] != NULL; i++)
{
HANDLE_CLOSE_CB *close_cb = (HANDLE_CLOSE_CB*)_HandleCloseCbs[i];
if (close_cb && close_cb->IsHandled(hObject))
{
- return close_cb->CloseHandle(hObject);
+ BOOL result = close_cb->CloseHandle(hObject);
+
+ LeaveCriticalSection(&_HandleCloseCbsLock);
+ return result;
}
}
+ LeaveCriticalSection(&_HandleCloseCbsLock);
+
if (Type == HANDLE_TYPE_THREAD)
{