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 #else
25 #  include <fcntl.h>                 /* O_CREAT and O_EXCL */
26 #  if defined(HAVE_SEM_OPEN) && !defined(POSIX_SEMAPHORES_NOT_ENABLED)
27 #    include <semaphore.h>
28      typedef sem_t *SEM_HANDLE;
29 #  endif
30 #  define HANDLE int
31 #  define SOCKET int
32 #  define BOOL int
33 #  define UINT32 uint32_t
34 #  define INT32 int32_t
35 #  define TRUE 1
36 #  define FALSE 0
37 #  define INVALID_HANDLE_VALUE (-1)
38 #endif
39 
40 /*
41  * Issue 3110 - Solaris does not define SEM_VALUE_MAX
42  */
43 #ifndef SEM_VALUE_MAX
44     #if defined(HAVE_SYSCONF) && defined(_SC_SEM_VALUE_MAX)
45         # define SEM_VALUE_MAX sysconf(_SC_SEM_VALUE_MAX)
46     #elif defined(_SEM_VALUE_MAX)
47         # define SEM_VALUE_MAX _SEM_VALUE_MAX
48     #elif defined(_POSIX_SEM_VALUE_MAX)
49         # define SEM_VALUE_MAX _POSIX_SEM_VALUE_MAX
50     #else
51         # define SEM_VALUE_MAX INT_MAX
52     #endif
53 #endif
54 
55 
56 /*
57  * Format codes
58  */
59 
60 #if SIZEOF_VOID_P == SIZEOF_LONG
61 #  define F_POINTER "k"
62 #  define T_POINTER T_ULONG
63 #elif SIZEOF_VOID_P == SIZEOF_LONG_LONG
64 #  define F_POINTER "K"
65 #  define T_POINTER T_ULONGLONG
66 #else
67 #  error "can't find format code for unsigned integer of same size as void*"
68 #endif
69 
70 #ifdef MS_WINDOWS
71 #  define F_HANDLE F_POINTER
72 #  define T_HANDLE T_POINTER
73 #  define F_SEM_HANDLE F_HANDLE
74 #  define T_SEM_HANDLE T_HANDLE
75 #  define F_DWORD "k"
76 #  define T_DWORD T_ULONG
77 #else
78 #  define F_HANDLE "i"
79 #  define T_HANDLE T_INT
80 #  define F_SEM_HANDLE F_POINTER
81 #  define T_SEM_HANDLE T_POINTER
82 #endif
83 
84 /*
85  * Error codes which can be returned by functions called without GIL
86  */
87 
88 #define MP_SUCCESS (0)
89 #define MP_STANDARD_ERROR (-1)
90 #define MP_MEMORY_ERROR (-1001)
91 #define MP_SOCKET_ERROR (-1002)
92 #define MP_EXCEPTION_HAS_BEEN_SET (-1003)
93 
94 PyObject *_PyMp_SetError(PyObject *Type, int num);
95 
96 /*
97  * Externs - not all will really exist on all platforms
98  */
99 
100 extern PyTypeObject _PyMp_SemLockType;
101 extern PyObject *_PyMp_sem_unlink(PyObject *ignore, PyObject *args);
102 
103 #endif /* MULTIPROCESSING_H */
104