multiprocessing.h revision c4920e86ef7511b4e858028e870b1811437a71d0
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#  include <netinet/in.h>
27#  include <sys/socket.h>
28#  include <sys/uio.h>
29#  include <arpa/inet.h>             /* htonl() and ntohl() */
30#  if defined(HAVE_SEM_OPEN) && !defined(HAVE_BROKEN_POSIX_SEMAPHORES)
31#    include <semaphore.h>
32     typedef sem_t *SEM_HANDLE;
33#  endif
34#  define HANDLE int
35#  define SOCKET int
36#  define BOOL int
37#  define UINT32 uint32_t
38#  define INT32 int32_t
39#  define TRUE 1
40#  define FALSE 0
41#  define INVALID_HANDLE_VALUE (-1)
42#endif
43
44/*
45 * Issue 3110 - Solaris does not define SEM_VALUE_MAX
46 */
47#ifndef SEM_VALUE_MAX
48	#if defined(HAVE_SYSCONF) && defined(_SC_SEM_VALUE_MAX)
49		# define SEM_VALUE_MAX sysconf(_SC_SEM_VALUE_MAX)
50	#elif defined(_SEM_VALUE_MAX)
51		# define SEM_VALUE_MAX _SEM_VALUE_MAX
52	#elif defined(_POSIX_SEM_VALUE_MAX)
53		# define SEM_VALUE_MAX _POSIX_SEM_VALUE_MAX
54	#else
55		# define SEM_VALUE_MAX INT_MAX
56	#endif
57#endif
58
59
60/*
61 * Make sure Py_ssize_t available
62 */
63
64#if PY_VERSION_HEX < 0x02050000 && !defined(PY_SSIZE_T_MIN)
65   typedef int Py_ssize_t;
66#  define PY_SSIZE_T_MAX INT_MAX
67#  define PY_SSIZE_T_MIN INT_MIN
68#  define F_PY_SSIZE_T "i"
69#  define PyInt_FromSsize_t(n) PyInt_FromLong((long)n)
70#else
71#  define F_PY_SSIZE_T "n"
72#endif
73
74/*
75 * Format codes
76 */
77
78#if SIZEOF_VOID_P == SIZEOF_LONG
79#  define F_POINTER "k"
80#  define T_POINTER T_ULONG
81#elif defined(HAVE_LONG_LONG) && (SIZEOF_VOID_P == SIZEOF_LONG_LONG)
82#  define F_POINTER "K"
83#  define T_POINTER T_ULONGLONG
84#else
85#  error "can't find format code for unsigned integer of same size as void*"
86#endif
87
88#ifdef MS_WINDOWS
89#  define F_HANDLE F_POINTER
90#  define T_HANDLE T_POINTER
91#  define F_SEM_HANDLE F_HANDLE
92#  define T_SEM_HANDLE T_HANDLE
93#  define F_DWORD "k"
94#  define T_DWORD T_ULONG
95#else
96#  define F_HANDLE "i"
97#  define T_HANDLE T_INT
98#  define F_SEM_HANDLE F_POINTER
99#  define T_SEM_HANDLE T_POINTER
100#endif
101
102#if PY_VERSION_HEX >= 0x03000000
103#  define F_RBUFFER "y"
104#else
105#  define F_RBUFFER "s"
106#endif
107
108/*
109 * Error codes which can be returned by functions called without GIL
110 */
111
112#define MP_SUCCESS (0)
113#define MP_STANDARD_ERROR (-1)
114#define MP_MEMORY_ERROR (-1001)
115#define MP_END_OF_FILE (-1002)
116#define MP_EARLY_END_OF_FILE (-1003)
117#define MP_BAD_MESSAGE_LENGTH (-1004)
118#define MP_SOCKET_ERROR (-1005)
119#define MP_EXCEPTION_HAS_BEEN_SET (-1006)
120
121PyObject *mp_SetError(PyObject *Type, int num);
122
123/*
124 * Externs - not all will really exist on all platforms
125 */
126
127extern PyObject *pickle_dumps;
128extern PyObject *pickle_loads;
129extern PyObject *pickle_protocol;
130extern PyObject *BufferTooShort;
131extern PyTypeObject SemLockType;
132extern PyTypeObject ConnectionType;
133extern PyTypeObject PipeConnectionType;
134extern HANDLE sigint_event;
135
136/*
137 * Py3k compatibility
138 */
139
140#if PY_VERSION_HEX >= 0x03000000
141#  define PICKLE_MODULE "pickle"
142#  define FROM_FORMAT PyUnicode_FromFormat
143#  define PyInt_FromLong PyLong_FromLong
144#  define PyInt_FromSsize_t PyLong_FromSsize_t
145#else
146#  define PICKLE_MODULE "cPickle"
147#  define FROM_FORMAT PyString_FromFormat
148#endif
149
150#ifndef PyVarObject_HEAD_INIT
151#  define PyVarObject_HEAD_INIT(type, size) PyObject_HEAD_INIT(type) size,
152#endif
153
154#ifndef Py_TPFLAGS_HAVE_WEAKREFS
155#  define Py_TPFLAGS_HAVE_WEAKREFS 0
156#endif
157
158/*
159 * Connection definition
160 */
161
162#define CONNECTION_BUFFER_SIZE 1024
163
164typedef struct {
165	PyObject_HEAD
166	HANDLE handle;
167	int flags;
168	PyObject *weakreflist;
169	char buffer[CONNECTION_BUFFER_SIZE];
170} ConnectionObject;
171
172/*
173 * Miscellaneous
174 */
175
176#define MAX_MESSAGE_LENGTH 0x7fffffff
177
178#ifndef MIN
179#  define MIN(x, y) ((x) < (y) ? x : y)
180#  define MAX(x, y) ((x) > (y) ? x : y)
181#endif
182
183#endif /* MULTIPROCESSING_H */
184