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