# HG changeset patch # Parent 5cb3c08997e654c80aba47777ce322fb31a9a218 diff -r 5cb3c08997e6 Modules/_winapi.c --- a/Modules/_winapi.c Tue Oct 09 06:47:23 2012 -0700 +++ b/Modules/_winapi.c Wed Oct 10 13:50:48 2012 +0100 @@ -56,6 +56,7 @@ #endif #define F_HANDLE F_POINTER +#define F_ULONG_PTR F_POINTER #define F_DWORD "k" #define F_BOOL "i" #define F_UINT "I" @@ -199,6 +200,12 @@ Py_RETURN_NONE; } +static PyObject* +overlapped_getaddress(OverlappedObject *self) +{ + return PyLong_FromVoidPtr(&self->overlapped); +} + static PyMethodDef overlapped_methods[] = { {"GetOverlappedResult", (PyCFunction) overlapped_GetOverlappedResult, METH_O, NULL}, @@ -214,6 +221,12 @@ {NULL} }; +static PyGetSetDef overlapped_getsets[] = { + {"address", (getter)overlapped_getaddress, NULL, + "Address of overlapped structure"}, + {NULL}, +}; + PyTypeObject OverlappedType = { PyVarObject_HEAD_INIT(NULL, 0) /* tp_name */ "_winapi.Overlapped", @@ -244,7 +257,7 @@ /* tp_iternext */ 0, /* tp_methods */ overlapped_methods, /* tp_members */ overlapped_members, - /* tp_getset */ 0, + /* tp_getset */ overlapped_getsets, /* tp_base */ 0, /* tp_dict */ 0, /* tp_descr_get */ 0, @@ -379,6 +392,31 @@ } static PyObject * +winapi_CreateIoCompletionPort(PyObject *self, PyObject *args) +{ + HANDLE FileHandle; + HANDLE ExistingCompletionPort; + ULONG_PTR CompletionKey; + DWORD NumberOfConcurrentThreads; + HANDLE result; + + if (!PyArg_ParseTuple(args, F_HANDLE F_HANDLE F_ULONG_PTR F_DWORD, + &FileHandle, &ExistingCompletionPort, &CompletionKey, + &NumberOfConcurrentThreads)) + return NULL; + + Py_BEGIN_ALLOW_THREADS + result = CreateIoCompletionPort(FileHandle, ExistingCompletionPort, + CompletionKey, NumberOfConcurrentThreads); + Py_END_ALLOW_THREADS + + if (result == NULL) + return PyErr_SetFromWindowsErr(0); + + return Py_BuildValue(F_HANDLE, result); +} + +static PyObject * winapi_CreateNamedPipe(PyObject *self, PyObject *args) { LPCTSTR lpName; @@ -797,6 +835,37 @@ return PyUnicode_FromWideChar(filename, wcslen(filename)); } +static PyObject * +winapi_GetQueuedCompletionStatus(PyObject *self, PyObject *args) +{ + HANDLE CompletionPort; + DWORD Milliseconds; + ULONG_PTR CompletionKey; + DWORD NumberOfBytes; + OVERLAPPED *Overlapped; + BOOL success; + + if (!PyArg_ParseTuple(args, F_HANDLE F_DWORD, + &CompletionPort, &Milliseconds)) + return NULL; + + Py_BEGIN_ALLOW_THREADS + success = GetQueuedCompletionStatus( + CompletionPort, &NumberOfBytes, &CompletionKey, + &Overlapped, Milliseconds); + Py_END_ALLOW_THREADS + + if (!success) { + if (GetLastError() == WAIT_TIMEOUT) + Py_RETURN_NONE; + else + return PyErr_SetFromWindowsErr(0); + } + + return Py_BuildValue(F_DWORD F_ULONG_PTR F_POINTER, + NumberOfBytes, CompletionKey, Overlapped); +} + PyDoc_STRVAR(GetStdHandle_doc, "GetStdHandle(handle) -> integer\n\ \n\ @@ -907,6 +976,31 @@ } static PyObject * +winapi_PostQueuedCompletionStatus(PyObject *self, PyObject *args) +{ + HANDLE CompletionPort; + DWORD NumberOfBytes; + ULONG_PTR CompletionKey; + OVERLAPPED *Overlapped; + BOOL success; + + if (!PyArg_ParseTuple(args, F_HANDLE F_DWORD F_ULONG_PTR F_POINTER, + &CompletionPort, &NumberOfBytes, &CompletionKey, + &Overlapped)) + return NULL; + + Py_BEGIN_ALLOW_THREADS + success = PostQueuedCompletionStatus( + CompletionPort, NumberOfBytes, CompletionKey, Overlapped); + Py_END_ALLOW_THREADS + + if (!success) + return PyErr_SetFromWindowsErr(0); + + Py_RETURN_NONE; +} + +static PyObject * winapi_ReadFile(PyObject *self, PyObject *args, PyObject *kwds) { HANDLE handle; @@ -1202,6 +1296,8 @@ METH_VARARGS | METH_KEYWORDS, ""}, {"CreateFile", winapi_CreateFile, METH_VARARGS, ""}, + {"CreateIoCompletionPort", winapi_CreateIoCompletionPort, METH_VARARGS, + ""}, {"CreateNamedPipe", winapi_CreateNamedPipe, METH_VARARGS, ""}, {"CreatePipe", winapi_CreatePipe, METH_VARARGS, @@ -1220,6 +1316,8 @@ GetCurrentProcess_doc}, {"GetModuleFileName", winapi_GetModuleFileName, METH_VARARGS, GetModuleFileName_doc}, + {"GetQueuedCompletionStatus", winapi_GetQueuedCompletionStatus, + METH_VARARGS, ""}, {"GetStdHandle", winapi_GetStdHandle, METH_VARARGS, GetStdHandle_doc}, {"GetVersion", winapi_GetVersion, METH_VARARGS, @@ -1228,6 +1326,8 @@ ""}, {"PeekNamedPipe", winapi_PeekNamedPipe, METH_VARARGS, ""}, + {"PostQueuedCompletionStatus", winapi_PostQueuedCompletionStatus, + METH_VARARGS, ""}, {"ReadFile", (PyCFunction)winapi_ReadFile, METH_VARARGS | METH_KEYWORDS, ""}, {"SetNamedPipeHandleState", winapi_SetNamedPipeHandleState, METH_VARARGS, @@ -1322,7 +1422,8 @@ WINAPI_CONSTANT(F_DWORD, WAIT_OBJECT_0); WINAPI_CONSTANT(F_DWORD, WAIT_TIMEOUT); - WINAPI_CONSTANT("i", NULL); + WINAPI_CONSTANT(F_HANDLE, INVALID_HANDLE_VALUE); + WINAPI_CONSTANT(F_HANDLE, NULL); return m; }