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 86PyObject *_PyMp_SetError(PyObject *Type, int num); 87 88/* 89 * Externs - not all will really exist on all platforms 90 */ 91 92extern PyTypeObject _PyMp_SemLockType; 93extern PyObject *_PyMp_sem_unlink(const char *name); 94 95#endif /* MULTIPROCESSING_H */ 96