Commit 6150f319 authored by Victor Stinner's avatar Victor Stinner

Fix usage of PyMem_Malloc() in overlapped.c

Issue #26563: Replace PyMem_Malloc() with PyMem_RawFree() since
PostToQueueCallback() calls PyMem_RawFree() (previously PyMem_Free()) in a new
C thread which doesn't hold the GIL.
parent ce911c3f
...@@ -238,7 +238,7 @@ PostToQueueCallback(PVOID lpParameter, BOOL TimerOrWaitFired) ...@@ -238,7 +238,7 @@ PostToQueueCallback(PVOID lpParameter, BOOL TimerOrWaitFired)
PostQueuedCompletionStatus(p->CompletionPort, TimerOrWaitFired, PostQueuedCompletionStatus(p->CompletionPort, TimerOrWaitFired,
0, p->Overlapped); 0, p->Overlapped);
/* ignore possible error! */ /* ignore possible error! */
PyMem_Free(p); PyMem_RawFree(p);
} }
PyDoc_STRVAR( PyDoc_STRVAR(
...@@ -262,7 +262,10 @@ overlapped_RegisterWaitWithQueue(PyObject *self, PyObject *args) ...@@ -262,7 +262,10 @@ overlapped_RegisterWaitWithQueue(PyObject *self, PyObject *args)
&Milliseconds)) &Milliseconds))
return NULL; return NULL;
pdata = PyMem_Malloc(sizeof(struct PostCallbackData)); /* Use PyMem_RawMalloc() rather than PyMem_Malloc(), since
PostToQueueCallback() will call PyMem_Free() from a new C thread
which doesn't hold the GIL. */
pdata = PyMem_RawMalloc(sizeof(struct PostCallbackData));
if (pdata == NULL) if (pdata == NULL)
return SetFromWindowsErr(0); return SetFromWindowsErr(0);
...@@ -273,7 +276,7 @@ overlapped_RegisterWaitWithQueue(PyObject *self, PyObject *args) ...@@ -273,7 +276,7 @@ overlapped_RegisterWaitWithQueue(PyObject *self, PyObject *args)
pdata, Milliseconds, pdata, Milliseconds,
WT_EXECUTEINWAITTHREAD | WT_EXECUTEONLYONCE)) WT_EXECUTEINWAITTHREAD | WT_EXECUTEONLYONCE))
{ {
PyMem_Free(pdata); PyMem_RawFree(pdata);
return SetFromWindowsErr(0); return SetFromWindowsErr(0);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment