| 
									
										
										
										
											2008-06-13 19:28:21 +00:00
										 |  |  | /*
 | 
					
						
							|  |  |  |  * Extension module used by multiprocessing package | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * multiprocessing.c | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * Copyright (c) 2006-2008, R Oudkerk --- see COPYING.txt | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include "multiprocessing.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
											
												Merged revisions 70908,70939,71009,71022,71036 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk
........
  r70908 | jesse.noller | 2009-03-31 17:20:35 -0500 (Tue, 31 Mar 2009) | 1 line
  Issue 5619: Pass MS CRT debug flags into subprocesses
........
  r70939 | jesse.noller | 2009-03-31 22:45:50 -0500 (Tue, 31 Mar 2009) | 1 line
  Fix multiprocessing.event to match the new threading.Event API
........
  r71009 | jesse.noller | 2009-04-01 19:03:28 -0500 (Wed, 01 Apr 2009) | 1 line
  issue5545: Switch to Autoconf for multiprocessing; special thanks to Martin Lowis for help
........
  r71022 | jesse.noller | 2009-04-01 21:32:55 -0500 (Wed, 01 Apr 2009) | 1 line
  Issue 3110: Additional protection for SEM_VALUE_MAX on platforms, thanks to Martin Loewis
........
  r71036 | jesse.noller | 2009-04-01 23:22:09 -0500 (Wed, 01 Apr 2009) | 1 line
  Issue 3551: Raise ValueError if the size causes ERROR_NO_SYSTEM_RESOURCES
........
											
										 
											2009-04-05 21:24:58 +00:00
										 |  |  | #ifdef SCM_RIGHTS
 | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  |     #define HAVE_FD_TRANSFER 1
 | 
					
						
							| 
									
										
										
											
												Merged revisions 70908,70939,71009,71022,71036 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk
........
  r70908 | jesse.noller | 2009-03-31 17:20:35 -0500 (Tue, 31 Mar 2009) | 1 line
  Issue 5619: Pass MS CRT debug flags into subprocesses
........
  r70939 | jesse.noller | 2009-03-31 22:45:50 -0500 (Tue, 31 Mar 2009) | 1 line
  Fix multiprocessing.event to match the new threading.Event API
........
  r71009 | jesse.noller | 2009-04-01 19:03:28 -0500 (Wed, 01 Apr 2009) | 1 line
  issue5545: Switch to Autoconf for multiprocessing; special thanks to Martin Lowis for help
........
  r71022 | jesse.noller | 2009-04-01 21:32:55 -0500 (Wed, 01 Apr 2009) | 1 line
  Issue 3110: Additional protection for SEM_VALUE_MAX on platforms, thanks to Martin Loewis
........
  r71036 | jesse.noller | 2009-04-01 23:22:09 -0500 (Wed, 01 Apr 2009) | 1 line
  Issue 3551: Raise ValueError if the size causes ERROR_NO_SYSTEM_RESOURCES
........
											
										 
											2009-04-05 21:24:58 +00:00
										 |  |  | #else
 | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  |     #define HAVE_FD_TRANSFER 0
 | 
					
						
							| 
									
										
										
											
												Merged revisions 70908,70939,71009,71022,71036 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk
........
  r70908 | jesse.noller | 2009-03-31 17:20:35 -0500 (Tue, 31 Mar 2009) | 1 line
  Issue 5619: Pass MS CRT debug flags into subprocesses
........
  r70939 | jesse.noller | 2009-03-31 22:45:50 -0500 (Tue, 31 Mar 2009) | 1 line
  Fix multiprocessing.event to match the new threading.Event API
........
  r71009 | jesse.noller | 2009-04-01 19:03:28 -0500 (Wed, 01 Apr 2009) | 1 line
  issue5545: Switch to Autoconf for multiprocessing; special thanks to Martin Lowis for help
........
  r71022 | jesse.noller | 2009-04-01 21:32:55 -0500 (Wed, 01 Apr 2009) | 1 line
  Issue 3110: Additional protection for SEM_VALUE_MAX on platforms, thanks to Martin Loewis
........
  r71036 | jesse.noller | 2009-04-01 23:22:09 -0500 (Wed, 01 Apr 2009) | 1 line
  Issue 3551: Raise ValueError if the size causes ERROR_NO_SYSTEM_RESOURCES
........
											
										 
											2009-04-05 21:24:58 +00:00
										 |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-06-13 19:28:21 +00:00
										 |  |  | PyObject *create_win32_namespace(void); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | PyObject *ProcessError, *BufferTooShort; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /*
 | 
					
						
							|  |  |  |  * Function which raises exceptions based on error codes | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | PyObject * | 
					
						
							|  |  |  | mp_SetError(PyObject *Type, int num) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  |     switch (num) { | 
					
						
							| 
									
										
										
										
											2008-06-13 19:28:21 +00:00
										 |  |  | #ifdef MS_WINDOWS
 | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  |     case MP_STANDARD_ERROR: | 
					
						
							|  |  |  |         if (Type == NULL) | 
					
						
							|  |  |  |             Type = PyExc_WindowsError; | 
					
						
							|  |  |  |         PyErr_SetExcFromWindowsErr(Type, 0); | 
					
						
							|  |  |  |         break; | 
					
						
							|  |  |  |     case MP_SOCKET_ERROR: | 
					
						
							|  |  |  |         if (Type == NULL) | 
					
						
							|  |  |  |             Type = PyExc_WindowsError; | 
					
						
							|  |  |  |         PyErr_SetExcFromWindowsErr(Type, WSAGetLastError()); | 
					
						
							|  |  |  |         break; | 
					
						
							| 
									
										
										
										
											2008-06-13 19:28:21 +00:00
										 |  |  | #else /* !MS_WINDOWS */
 | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  |     case MP_STANDARD_ERROR: | 
					
						
							|  |  |  |     case MP_SOCKET_ERROR: | 
					
						
							|  |  |  |         if (Type == NULL) | 
					
						
							|  |  |  |             Type = PyExc_OSError; | 
					
						
							|  |  |  |         PyErr_SetFromErrno(Type); | 
					
						
							|  |  |  |         break; | 
					
						
							| 
									
										
										
										
											2008-06-13 19:28:21 +00:00
										 |  |  | #endif /* !MS_WINDOWS */
 | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  |     case MP_MEMORY_ERROR: | 
					
						
							|  |  |  |         PyErr_NoMemory(); | 
					
						
							|  |  |  |         break; | 
					
						
							|  |  |  |     case MP_EXCEPTION_HAS_BEEN_SET: | 
					
						
							|  |  |  |         break; | 
					
						
							|  |  |  |     default: | 
					
						
							|  |  |  |         PyErr_Format(PyExc_RuntimeError, | 
					
						
							|  |  |  |                      "unkown error number %d", num); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     return NULL; | 
					
						
							| 
									
										
										
										
											2008-06-13 19:28:21 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /*
 | 
					
						
							|  |  |  |  * Windows only | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #ifdef MS_WINDOWS
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* On Windows we set an event to signal Ctrl-C; compare with timemodule.c */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | HANDLE sigint_event = NULL; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static BOOL WINAPI | 
					
						
							|  |  |  | ProcessingCtrlHandler(DWORD dwCtrlType) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  |     SetEvent(sigint_event); | 
					
						
							|  |  |  |     return FALSE; | 
					
						
							| 
									
										
										
										
											2008-06-13 19:28:21 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /*
 | 
					
						
							|  |  |  |  * Unix only | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #else /* !MS_WINDOWS */
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #if HAVE_FD_TRANSFER
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* Functions for transferring file descriptors between processes.
 | 
					
						
							|  |  |  |    Reimplements some of the functionality of the fdcred | 
					
						
							|  |  |  |    module at http://www.mca-ltd.com/resources/fdcred_1.tgz. */
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static PyObject * | 
					
						
							|  |  |  | multiprocessing_sendfd(PyObject *self, PyObject *args) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  |     int conn, fd, res; | 
					
						
							|  |  |  |     char dummy_char; | 
					
						
							|  |  |  |     char buf[CMSG_SPACE(sizeof(int))]; | 
					
						
							|  |  |  |     struct msghdr msg = {0}; | 
					
						
							|  |  |  |     struct iovec dummy_iov; | 
					
						
							|  |  |  |     struct cmsghdr *cmsg; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (!PyArg_ParseTuple(args, "ii", &conn, &fd)) | 
					
						
							|  |  |  |         return NULL; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     dummy_iov.iov_base = &dummy_char; | 
					
						
							|  |  |  |     dummy_iov.iov_len = 1; | 
					
						
							|  |  |  |     msg.msg_control = buf; | 
					
						
							|  |  |  |     msg.msg_controllen = sizeof(buf); | 
					
						
							|  |  |  |     msg.msg_iov = &dummy_iov; | 
					
						
							|  |  |  |     msg.msg_iovlen = 1; | 
					
						
							|  |  |  |     cmsg = CMSG_FIRSTHDR(&msg); | 
					
						
							|  |  |  |     cmsg->cmsg_level = SOL_SOCKET; | 
					
						
							|  |  |  |     cmsg->cmsg_type = SCM_RIGHTS; | 
					
						
							|  |  |  |     cmsg->cmsg_len = CMSG_LEN(sizeof(int)); | 
					
						
							|  |  |  |     msg.msg_controllen = cmsg->cmsg_len; | 
					
						
							| 
									
										
										
										
											2010-10-17 21:12:18 +00:00
										 |  |  |     *CMSG_DATA(cmsg) = fd; | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     Py_BEGIN_ALLOW_THREADS | 
					
						
							|  |  |  |     res = sendmsg(conn, &msg, 0); | 
					
						
							|  |  |  |     Py_END_ALLOW_THREADS | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (res < 0) | 
					
						
							|  |  |  |         return PyErr_SetFromErrno(PyExc_OSError); | 
					
						
							|  |  |  |     Py_RETURN_NONE; | 
					
						
							| 
									
										
										
										
											2008-06-13 19:28:21 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static PyObject * | 
					
						
							|  |  |  | multiprocessing_recvfd(PyObject *self, PyObject *args) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  |     int conn, fd, res; | 
					
						
							|  |  |  |     char dummy_char; | 
					
						
							|  |  |  |     char buf[CMSG_SPACE(sizeof(int))]; | 
					
						
							|  |  |  |     struct msghdr msg = {0}; | 
					
						
							|  |  |  |     struct iovec dummy_iov; | 
					
						
							|  |  |  |     struct cmsghdr *cmsg; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (!PyArg_ParseTuple(args, "i", &conn)) | 
					
						
							|  |  |  |         return NULL; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     dummy_iov.iov_base = &dummy_char; | 
					
						
							|  |  |  |     dummy_iov.iov_len = 1; | 
					
						
							|  |  |  |     msg.msg_control = buf; | 
					
						
							|  |  |  |     msg.msg_controllen = sizeof(buf); | 
					
						
							|  |  |  |     msg.msg_iov = &dummy_iov; | 
					
						
							|  |  |  |     msg.msg_iovlen = 1; | 
					
						
							|  |  |  |     cmsg = CMSG_FIRSTHDR(&msg); | 
					
						
							|  |  |  |     cmsg->cmsg_level = SOL_SOCKET; | 
					
						
							|  |  |  |     cmsg->cmsg_type = SCM_RIGHTS; | 
					
						
							|  |  |  |     cmsg->cmsg_len = CMSG_LEN(sizeof(int)); | 
					
						
							|  |  |  |     msg.msg_controllen = cmsg->cmsg_len; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     Py_BEGIN_ALLOW_THREADS | 
					
						
							|  |  |  |     res = recvmsg(conn, &msg, 0); | 
					
						
							|  |  |  |     Py_END_ALLOW_THREADS | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (res < 0) | 
					
						
							|  |  |  |         return PyErr_SetFromErrno(PyExc_OSError); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-10-17 21:12:18 +00:00
										 |  |  |     fd = *CMSG_DATA(cmsg); | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  |     return Py_BuildValue("i", fd); | 
					
						
							| 
									
										
										
										
											2008-06-13 19:28:21 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #endif /* HAVE_FD_TRANSFER */
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #endif /* !MS_WINDOWS */
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /*
 | 
					
						
							|  |  |  |  * All platforms | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static PyObject* | 
					
						
							|  |  |  | multiprocessing_address_of_buffer(PyObject *self, PyObject *obj) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  |     void *buffer; | 
					
						
							|  |  |  |     Py_ssize_t buffer_len; | 
					
						
							| 
									
										
										
										
											2008-06-13 19:28:21 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  |     if (PyObject_AsWriteBuffer(obj, &buffer, &buffer_len) < 0) | 
					
						
							|  |  |  |         return NULL; | 
					
						
							| 
									
										
										
										
											2008-06-13 19:28:21 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-05-09 20:55:03 +02:00
										 |  |  |     return Py_BuildValue("Nn", | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  |                          PyLong_FromVoidPtr(buffer), buffer_len); | 
					
						
							| 
									
										
										
										
											2008-06-13 19:28:21 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /*
 | 
					
						
							|  |  |  |  * Function table | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static PyMethodDef module_methods[] = { | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  |     {"address_of_buffer", multiprocessing_address_of_buffer, METH_O, | 
					
						
							|  |  |  |      "address_of_buffer(obj) -> int\n" | 
					
						
							|  |  |  |      "Return address of obj assuming obj supports buffer inteface"}, | 
					
						
							| 
									
										
										
										
											2008-06-13 19:28:21 +00:00
										 |  |  | #if HAVE_FD_TRANSFER
 | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  |     {"sendfd", multiprocessing_sendfd, METH_VARARGS, | 
					
						
							|  |  |  |      "sendfd(sockfd, fd) -> None\n" | 
					
						
							|  |  |  |      "Send file descriptor given by fd over the unix domain socket\n" | 
					
						
							|  |  |  |      "whose file decriptor is sockfd"}, | 
					
						
							|  |  |  |     {"recvfd", multiprocessing_recvfd, METH_VARARGS, | 
					
						
							|  |  |  |      "recvfd(sockfd) -> fd\n" | 
					
						
							|  |  |  |      "Receive a file descriptor over a unix domain socket\n" | 
					
						
							|  |  |  |      "whose file decriptor is sockfd"}, | 
					
						
							| 
									
										
										
										
											2008-06-13 19:28:21 +00:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  |     {NULL} | 
					
						
							| 
									
										
										
										
											2008-06-13 19:28:21 +00:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /*
 | 
					
						
							|  |  |  |  * Initialize | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static struct PyModuleDef multiprocessing_module = { | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  |     PyModuleDef_HEAD_INIT, | 
					
						
							|  |  |  |     "_multiprocessing", | 
					
						
							|  |  |  |     NULL, | 
					
						
							|  |  |  |     -1, | 
					
						
							|  |  |  |     module_methods, | 
					
						
							|  |  |  |     NULL, | 
					
						
							|  |  |  |     NULL, | 
					
						
							|  |  |  |     NULL, | 
					
						
							|  |  |  |     NULL | 
					
						
							| 
									
										
										
										
											2008-06-13 19:28:21 +00:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  | PyMODINIT_FUNC | 
					
						
							| 
									
										
										
										
											2008-06-13 19:28:21 +00:00
										 |  |  | PyInit__multiprocessing(void) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  |     PyObject *module, *temp, *value; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /* Initialize module */ | 
					
						
							|  |  |  |     module = PyModule_Create(&multiprocessing_module); | 
					
						
							|  |  |  |     if (!module) | 
					
						
							|  |  |  |         return NULL; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /* Get copy of BufferTooShort */ | 
					
						
							|  |  |  |     temp = PyImport_ImportModule("multiprocessing"); | 
					
						
							|  |  |  |     if (!temp) | 
					
						
							|  |  |  |         return NULL; | 
					
						
							|  |  |  |     BufferTooShort = PyObject_GetAttrString(temp, "BufferTooShort"); | 
					
						
							|  |  |  |     Py_XDECREF(temp); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #if defined(MS_WINDOWS) ||                                              \
 | 
					
						
							| 
									
										
										
										
											2009-11-28 12:48:43 +00:00
										 |  |  |   (defined(HAVE_SEM_OPEN) && !defined(POSIX_SEMAPHORES_NOT_ENABLED)) | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  |     /* Add SemLock type to module */ | 
					
						
							|  |  |  |     if (PyType_Ready(&SemLockType) < 0) | 
					
						
							|  |  |  |         return NULL; | 
					
						
							|  |  |  |     Py_INCREF(&SemLockType); | 
					
						
							| 
									
										
										
										
											2010-10-17 02:14:36 +00:00
										 |  |  |     { | 
					
						
							|  |  |  |         PyObject *py_sem_value_max; | 
					
						
							|  |  |  |         /* Some systems define SEM_VALUE_MAX as an unsigned value that
 | 
					
						
							|  |  |  |          * causes it to be negative when used as an int (NetBSD). */ | 
					
						
							|  |  |  |         if ((int)(SEM_VALUE_MAX) < 0) | 
					
						
							|  |  |  |             py_sem_value_max = PyLong_FromLong(INT_MAX); | 
					
						
							|  |  |  |         else | 
					
						
							|  |  |  |             py_sem_value_max = PyLong_FromLong(SEM_VALUE_MAX); | 
					
						
							|  |  |  |         if (py_sem_value_max == NULL) | 
					
						
							|  |  |  |             return NULL; | 
					
						
							|  |  |  |         PyDict_SetItemString(SemLockType.tp_dict, "SEM_VALUE_MAX", | 
					
						
							|  |  |  |                              py_sem_value_max); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  |     PyModule_AddObject(module, "SemLock", (PyObject*)&SemLockType); | 
					
						
							| 
									
										
										
										
											2008-06-13 19:28:21 +00:00
										 |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #ifdef MS_WINDOWS
 | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  |     /* Initialize win32 class and add to multiprocessing */ | 
					
						
							|  |  |  |     temp = create_win32_namespace(); | 
					
						
							|  |  |  |     if (!temp) | 
					
						
							|  |  |  |         return NULL; | 
					
						
							|  |  |  |     PyModule_AddObject(module, "win32", temp); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /* Initialize the event handle used to signal Ctrl-C */ | 
					
						
							|  |  |  |     sigint_event = CreateEvent(NULL, TRUE, FALSE, NULL); | 
					
						
							|  |  |  |     if (!sigint_event) { | 
					
						
							|  |  |  |         PyErr_SetFromWindowsErr(0); | 
					
						
							|  |  |  |         return NULL; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     if (!SetConsoleCtrlHandler(ProcessingCtrlHandler, TRUE)) { | 
					
						
							|  |  |  |         PyErr_SetFromWindowsErr(0); | 
					
						
							|  |  |  |         return NULL; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2008-06-13 19:28:21 +00:00
										 |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  |     /* Add configuration macros */ | 
					
						
							|  |  |  |     temp = PyDict_New(); | 
					
						
							|  |  |  |     if (!temp) | 
					
						
							|  |  |  |         return NULL; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #define ADD_FLAG(name)                                            \
 | 
					
						
							|  |  |  |     value = Py_BuildValue("i", name);                             \ | 
					
						
							|  |  |  |     if (value == NULL) { Py_DECREF(temp); return NULL; }          \ | 
					
						
							|  |  |  |     if (PyDict_SetItemString(temp, #name, value) < 0) {           \ | 
					
						
							|  |  |  |         Py_DECREF(temp); Py_DECREF(value); return NULL; }                 \ | 
					
						
							|  |  |  |     Py_DECREF(value) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-11-28 12:48:43 +00:00
										 |  |  | #if defined(HAVE_SEM_OPEN) && !defined(POSIX_SEMAPHORES_NOT_ENABLED)
 | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  |     ADD_FLAG(HAVE_SEM_OPEN); | 
					
						
							| 
									
										
										
										
											2008-06-13 19:28:21 +00:00
										 |  |  | #endif
 | 
					
						
							|  |  |  | #ifdef HAVE_SEM_TIMEDWAIT
 | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  |     ADD_FLAG(HAVE_SEM_TIMEDWAIT); | 
					
						
							| 
									
										
										
										
											2008-06-13 19:28:21 +00:00
										 |  |  | #endif
 | 
					
						
							|  |  |  | #ifdef HAVE_FD_TRANSFER
 | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  |     ADD_FLAG(HAVE_FD_TRANSFER); | 
					
						
							| 
									
										
										
										
											2008-06-13 19:28:21 +00:00
										 |  |  | #endif
 | 
					
						
							|  |  |  | #ifdef HAVE_BROKEN_SEM_GETVALUE
 | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  |     ADD_FLAG(HAVE_BROKEN_SEM_GETVALUE); | 
					
						
							| 
									
										
										
										
											2008-06-13 19:28:21 +00:00
										 |  |  | #endif
 | 
					
						
							|  |  |  | #ifdef HAVE_BROKEN_SEM_UNLINK
 | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  |     ADD_FLAG(HAVE_BROKEN_SEM_UNLINK); | 
					
						
							| 
									
										
										
										
											2008-06-13 19:28:21 +00:00
										 |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  |     if (PyModule_AddObject(module, "flags", temp) < 0) | 
					
						
							|  |  |  |         return NULL; | 
					
						
							| 
									
										
										
										
											2008-06-13 19:28:21 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  |     return module; | 
					
						
							| 
									
										
										
										
											2008-06-13 19:28:21 +00:00
										 |  |  | } |