1 #ifndef MULTIPROCESSING_H 2 #define MULTIPROCESSING_H 3 4 #define PY_SSIZE_T_CLEAN 5 6 #include "Python.h" 7 #include "structmember.h" 8 #include "pythread.h" 9 10 /* 11 * Platform includes and definitions 12 */ 13 14 #ifdef MS_WINDOWS 15 # define WIN32_LEAN_AND_MEAN 16 # include <windows.h> 17 # include <winsock2.h> 18 # include <process.h> /* getpid() */ 19 # ifdef Py_DEBUG 20 # include <crtdbg.h> 21 # endif 22 # define SEM_HANDLE HANDLE 23 # define SEM_VALUE_MAX LONG_MAX 24 # define HAVE_MP_SEMAPHORE 25 #else 26 # include <fcntl.h> /* O_CREAT and O_EXCL */ 27 # if defined(HAVE_SEM_OPEN) && !defined(POSIX_SEMAPHORES_NOT_ENABLED) 28 # define HAVE_MP_SEMAPHORE 29 # include <semaphore.h> 30 typedef sem_t *SEM_HANDLE; 31 # endif 32 #endif 33 34 /* 35 * Issue 3110 - Solaris does not define SEM_VALUE_MAX 36 */ 37 #ifndef SEM_VALUE_MAX 38 #if defined(HAVE_SYSCONF) && defined(_SC_SEM_VALUE_MAX) 39 # define SEM_VALUE_MAX sysconf(_SC_SEM_VALUE_MAX) 40 #elif defined(_SEM_VALUE_MAX) 41 # define SEM_VALUE_MAX _SEM_VALUE_MAX 42 #elif defined(_POSIX_SEM_VALUE_MAX) 43 # define SEM_VALUE_MAX _POSIX_SEM_VALUE_MAX 44 #else 45 # define SEM_VALUE_MAX INT_MAX 46 #endif 47 #endif 48 49 50 /* 51 * Format codes 52 */ 53 54 #if SIZEOF_VOID_P == SIZEOF_LONG 55 # define F_POINTER "k" 56 # define T_POINTER T_ULONG 57 #elif SIZEOF_VOID_P == SIZEOF_LONG_LONG 58 # define F_POINTER "K" 59 # define T_POINTER T_ULONGLONG 60 #else 61 # error "can't find format code for unsigned integer of same size as void*" 62 #endif 63 64 #ifdef MS_WINDOWS 65 # define F_HANDLE F_POINTER 66 # define T_HANDLE T_POINTER 67 # define F_SEM_HANDLE F_HANDLE 68 # define T_SEM_HANDLE T_HANDLE 69 #else 70 # define F_HANDLE "i" 71 # define T_HANDLE T_INT 72 # define F_SEM_HANDLE F_POINTER 73 # define T_SEM_HANDLE T_POINTER 74 #endif 75 76 /* 77 * Error codes which can be returned by functions called without GIL 78 */ 79 80 #define MP_SUCCESS (0) 81 #define MP_STANDARD_ERROR (-1) 82 #define MP_MEMORY_ERROR (-1001) 83 #define MP_SOCKET_ERROR (-1002) 84 #define MP_EXCEPTION_HAS_BEEN_SET (-1003) 85 86 PyObject *_PyMp_SetError(PyObject *Type, int num); 87 88 /* 89 * Externs - not all will really exist on all platforms 90 */ 91 92 extern PyTypeObject _PyMp_SemLockType; 93 extern PyObject *_PyMp_sem_unlink(const char *name); 94 95 #endif /* MULTIPROCESSING_H */ 96