2 * Win32 functions used by multiprocessing package
6 * Copyright (c) 2006-2008, R Oudkerk --- see COPYING.txt
9 #include "multiprocessing.h"
12 #define WIN32_FUNCTION(func) \
13 {#func, (PyCFunction)win32_ ## func, METH_VARARGS | METH_STATIC, ""}
15 #define WIN32_CONSTANT(fmt, con) \
16 PyDict_SetItemString(Win32Type.tp_dict, #con, Py_BuildValue(fmt, con))
20 win32_CloseHandle(PyObject
*self
, PyObject
*args
)
25 if (!PyArg_ParseTuple(args
, F_HANDLE
, &hObject
))
28 Py_BEGIN_ALLOW_THREADS
29 success
= CloseHandle(hObject
);
33 return PyErr_SetFromWindowsErr(0);
39 win32_ConnectNamedPipe(PyObject
*self
, PyObject
*args
)
42 LPOVERLAPPED lpOverlapped
;
45 if (!PyArg_ParseTuple(args
, F_HANDLE F_POINTER
,
46 &hNamedPipe
, &lpOverlapped
))
49 Py_BEGIN_ALLOW_THREADS
50 success
= ConnectNamedPipe(hNamedPipe
, lpOverlapped
);
54 return PyErr_SetFromWindowsErr(0);
60 win32_CreateFile(PyObject
*self
, PyObject
*args
)
63 DWORD dwDesiredAccess
;
65 LPSECURITY_ATTRIBUTES lpSecurityAttributes
;
66 DWORD dwCreationDisposition
;
67 DWORD dwFlagsAndAttributes
;
71 if (!PyArg_ParseTuple(args
, "s" F_DWORD F_DWORD F_POINTER
72 F_DWORD F_DWORD F_HANDLE
,
73 &lpFileName
, &dwDesiredAccess
, &dwShareMode
,
74 &lpSecurityAttributes
, &dwCreationDisposition
,
75 &dwFlagsAndAttributes
, &hTemplateFile
))
78 Py_BEGIN_ALLOW_THREADS
79 handle
= CreateFile(lpFileName
, dwDesiredAccess
,
80 dwShareMode
, lpSecurityAttributes
,
81 dwCreationDisposition
,
82 dwFlagsAndAttributes
, hTemplateFile
);
85 if (handle
== INVALID_HANDLE_VALUE
)
86 return PyErr_SetFromWindowsErr(0);
88 return Py_BuildValue(F_HANDLE
, handle
);
92 win32_CreateNamedPipe(PyObject
*self
, PyObject
*args
)
100 DWORD nDefaultTimeOut
;
101 LPSECURITY_ATTRIBUTES lpSecurityAttributes
;
104 if (!PyArg_ParseTuple(args
, "s" F_DWORD F_DWORD F_DWORD
105 F_DWORD F_DWORD F_DWORD F_POINTER
,
106 &lpName
, &dwOpenMode
, &dwPipeMode
,
107 &nMaxInstances
, &nOutBufferSize
,
108 &nInBufferSize
, &nDefaultTimeOut
,
109 &lpSecurityAttributes
))
112 Py_BEGIN_ALLOW_THREADS
113 handle
= CreateNamedPipe(lpName
, dwOpenMode
, dwPipeMode
,
114 nMaxInstances
, nOutBufferSize
,
115 nInBufferSize
, nDefaultTimeOut
,
116 lpSecurityAttributes
);
119 if (handle
== INVALID_HANDLE_VALUE
)
120 return PyErr_SetFromWindowsErr(0);
122 return Py_BuildValue(F_HANDLE
, handle
);
126 win32_ExitProcess(PyObject
*self
, PyObject
*args
)
130 if (!PyArg_ParseTuple(args
, "I", &uExitCode
))
133 #if defined(Py_DEBUG)
134 SetErrorMode(SEM_FAILCRITICALERRORS
|SEM_NOALIGNMENTFAULTEXCEPT
|SEM_NOGPFAULTERRORBOX
|SEM_NOOPENFILEERRORBOX
);
135 _CrtSetReportMode(_CRT_ASSERT
, _CRTDBG_MODE_DEBUG
);
139 ExitProcess(uExitCode
);
145 win32_GetLastError(PyObject
*self
, PyObject
*args
)
147 return Py_BuildValue(F_DWORD
, GetLastError());
151 win32_OpenProcess(PyObject
*self
, PyObject
*args
)
153 DWORD dwDesiredAccess
;
158 if (!PyArg_ParseTuple(args
, F_DWORD
"i" F_DWORD
,
159 &dwDesiredAccess
, &bInheritHandle
, &dwProcessId
))
162 handle
= OpenProcess(dwDesiredAccess
, bInheritHandle
, dwProcessId
);
164 return PyErr_SetFromWindowsErr(0);
166 return Py_BuildValue(F_HANDLE
, handle
);
170 win32_SetNamedPipeHandleState(PyObject
*self
, PyObject
*args
)
174 DWORD dwArgs
[3], *pArgs
[3] = {NULL
, NULL
, NULL
};
177 if (!PyArg_ParseTuple(args
, F_HANDLE
"OOO",
178 &hNamedPipe
, &oArgs
[0], &oArgs
[1], &oArgs
[2]))
183 for (i
= 0 ; i
< 3 ; i
++) {
184 if (oArgs
[i
] != Py_None
) {
185 dwArgs
[i
] = PyInt_AsUnsignedLongMask(oArgs
[i
]);
186 if (PyErr_Occurred())
188 pArgs
[i
] = &dwArgs
[i
];
192 if (!SetNamedPipeHandleState(hNamedPipe
, pArgs
[0], pArgs
[1], pArgs
[2]))
193 return PyErr_SetFromWindowsErr(0);
199 win32_WaitNamedPipe(PyObject
*self
, PyObject
*args
)
201 LPCTSTR lpNamedPipeName
;
205 if (!PyArg_ParseTuple(args
, "s" F_DWORD
, &lpNamedPipeName
, &nTimeOut
))
208 Py_BEGIN_ALLOW_THREADS
209 success
= WaitNamedPipe(lpNamedPipeName
, nTimeOut
);
213 return PyErr_SetFromWindowsErr(0);
218 static PyMethodDef win32_methods
[] = {
219 WIN32_FUNCTION(CloseHandle
),
220 WIN32_FUNCTION(GetLastError
),
221 WIN32_FUNCTION(OpenProcess
),
222 WIN32_FUNCTION(ExitProcess
),
223 WIN32_FUNCTION(ConnectNamedPipe
),
224 WIN32_FUNCTION(CreateFile
),
225 WIN32_FUNCTION(CreateNamedPipe
),
226 WIN32_FUNCTION(SetNamedPipeHandleState
),
227 WIN32_FUNCTION(WaitNamedPipe
),
232 PyTypeObject Win32Type
= {
233 PyVarObject_HEAD_INIT(NULL
, 0)
238 create_win32_namespace(void)
240 Win32Type
.tp_name
= "_multiprocessing.win32";
241 Win32Type
.tp_methods
= win32_methods
;
242 if (PyType_Ready(&Win32Type
) < 0)
244 Py_INCREF(&Win32Type
);
246 WIN32_CONSTANT(F_DWORD
, ERROR_ALREADY_EXISTS
);
247 WIN32_CONSTANT(F_DWORD
, ERROR_PIPE_BUSY
);
248 WIN32_CONSTANT(F_DWORD
, ERROR_PIPE_CONNECTED
);
249 WIN32_CONSTANT(F_DWORD
, ERROR_SEM_TIMEOUT
);
250 WIN32_CONSTANT(F_DWORD
, GENERIC_READ
);
251 WIN32_CONSTANT(F_DWORD
, GENERIC_WRITE
);
252 WIN32_CONSTANT(F_DWORD
, INFINITE
);
253 WIN32_CONSTANT(F_DWORD
, NMPWAIT_WAIT_FOREVER
);
254 WIN32_CONSTANT(F_DWORD
, OPEN_EXISTING
);
255 WIN32_CONSTANT(F_DWORD
, PIPE_ACCESS_DUPLEX
);
256 WIN32_CONSTANT(F_DWORD
, PIPE_ACCESS_INBOUND
);
257 WIN32_CONSTANT(F_DWORD
, PIPE_READMODE_MESSAGE
);
258 WIN32_CONSTANT(F_DWORD
, PIPE_TYPE_MESSAGE
);
259 WIN32_CONSTANT(F_DWORD
, PIPE_UNLIMITED_INSTANCES
);
260 WIN32_CONSTANT(F_DWORD
, PIPE_WAIT
);
261 WIN32_CONSTANT(F_DWORD
, PROCESS_ALL_ACCESS
);
263 WIN32_CONSTANT("i", NULL
);
265 return (PyObject
*)&Win32Type
;