17db96d56Sopenharmony_ci#ifndef MULTIPROCESSING_H
27db96d56Sopenharmony_ci#define MULTIPROCESSING_H
37db96d56Sopenharmony_ci
47db96d56Sopenharmony_ci#define PY_SSIZE_T_CLEAN
57db96d56Sopenharmony_ci
67db96d56Sopenharmony_ci#include "Python.h"
77db96d56Sopenharmony_ci#include "structmember.h"
87db96d56Sopenharmony_ci#include "pythread.h"
97db96d56Sopenharmony_ci
107db96d56Sopenharmony_ci/*
117db96d56Sopenharmony_ci * Platform includes and definitions
127db96d56Sopenharmony_ci */
137db96d56Sopenharmony_ci
147db96d56Sopenharmony_ci#ifdef MS_WINDOWS
157db96d56Sopenharmony_ci#  define WIN32_LEAN_AND_MEAN
167db96d56Sopenharmony_ci#  include <windows.h>
177db96d56Sopenharmony_ci#  include <winsock2.h>
187db96d56Sopenharmony_ci#  include <process.h>               /* getpid() */
197db96d56Sopenharmony_ci#  ifdef Py_DEBUG
207db96d56Sopenharmony_ci#    include <crtdbg.h>
217db96d56Sopenharmony_ci#  endif
227db96d56Sopenharmony_ci#  define SEM_HANDLE HANDLE
237db96d56Sopenharmony_ci#  define SEM_VALUE_MAX LONG_MAX
247db96d56Sopenharmony_ci#  define HAVE_MP_SEMAPHORE
257db96d56Sopenharmony_ci#else
267db96d56Sopenharmony_ci#  include <fcntl.h>                 /* O_CREAT and O_EXCL */
277db96d56Sopenharmony_ci#  if defined(HAVE_SEM_OPEN) && !defined(POSIX_SEMAPHORES_NOT_ENABLED)
287db96d56Sopenharmony_ci#    define HAVE_MP_SEMAPHORE
297db96d56Sopenharmony_ci#    include <semaphore.h>
307db96d56Sopenharmony_ci     typedef sem_t *SEM_HANDLE;
317db96d56Sopenharmony_ci#  endif
327db96d56Sopenharmony_ci#endif
337db96d56Sopenharmony_ci
347db96d56Sopenharmony_ci/*
357db96d56Sopenharmony_ci * Issue 3110 - Solaris does not define SEM_VALUE_MAX
367db96d56Sopenharmony_ci */
377db96d56Sopenharmony_ci#ifndef SEM_VALUE_MAX
387db96d56Sopenharmony_ci    #if defined(HAVE_SYSCONF) && defined(_SC_SEM_VALUE_MAX)
397db96d56Sopenharmony_ci        # define SEM_VALUE_MAX sysconf(_SC_SEM_VALUE_MAX)
407db96d56Sopenharmony_ci    #elif defined(_SEM_VALUE_MAX)
417db96d56Sopenharmony_ci        # define SEM_VALUE_MAX _SEM_VALUE_MAX
427db96d56Sopenharmony_ci    #elif defined(_POSIX_SEM_VALUE_MAX)
437db96d56Sopenharmony_ci        # define SEM_VALUE_MAX _POSIX_SEM_VALUE_MAX
447db96d56Sopenharmony_ci    #else
457db96d56Sopenharmony_ci        # define SEM_VALUE_MAX INT_MAX
467db96d56Sopenharmony_ci    #endif
477db96d56Sopenharmony_ci#endif
487db96d56Sopenharmony_ci
497db96d56Sopenharmony_ci
507db96d56Sopenharmony_ci/*
517db96d56Sopenharmony_ci * Format codes
527db96d56Sopenharmony_ci */
537db96d56Sopenharmony_ci
547db96d56Sopenharmony_ci#if SIZEOF_VOID_P == SIZEOF_LONG
557db96d56Sopenharmony_ci#  define F_POINTER "k"
567db96d56Sopenharmony_ci#  define T_POINTER T_ULONG
577db96d56Sopenharmony_ci#elif SIZEOF_VOID_P == SIZEOF_LONG_LONG
587db96d56Sopenharmony_ci#  define F_POINTER "K"
597db96d56Sopenharmony_ci#  define T_POINTER T_ULONGLONG
607db96d56Sopenharmony_ci#else
617db96d56Sopenharmony_ci#  error "can't find format code for unsigned integer of same size as void*"
627db96d56Sopenharmony_ci#endif
637db96d56Sopenharmony_ci
647db96d56Sopenharmony_ci#ifdef MS_WINDOWS
657db96d56Sopenharmony_ci#  define F_HANDLE F_POINTER
667db96d56Sopenharmony_ci#  define T_HANDLE T_POINTER
677db96d56Sopenharmony_ci#  define F_SEM_HANDLE F_HANDLE
687db96d56Sopenharmony_ci#  define T_SEM_HANDLE T_HANDLE
697db96d56Sopenharmony_ci#else
707db96d56Sopenharmony_ci#  define F_HANDLE "i"
717db96d56Sopenharmony_ci#  define T_HANDLE T_INT
727db96d56Sopenharmony_ci#  define F_SEM_HANDLE F_POINTER
737db96d56Sopenharmony_ci#  define T_SEM_HANDLE T_POINTER
747db96d56Sopenharmony_ci#endif
757db96d56Sopenharmony_ci
767db96d56Sopenharmony_ci/*
777db96d56Sopenharmony_ci * Error codes which can be returned by functions called without GIL
787db96d56Sopenharmony_ci */
797db96d56Sopenharmony_ci
807db96d56Sopenharmony_ci#define MP_SUCCESS (0)
817db96d56Sopenharmony_ci#define MP_STANDARD_ERROR (-1)
827db96d56Sopenharmony_ci#define MP_MEMORY_ERROR (-1001)
837db96d56Sopenharmony_ci#define MP_SOCKET_ERROR (-1002)
847db96d56Sopenharmony_ci#define MP_EXCEPTION_HAS_BEEN_SET (-1003)
857db96d56Sopenharmony_ci
867db96d56Sopenharmony_ciPyObject *_PyMp_SetError(PyObject *Type, int num);
877db96d56Sopenharmony_ci
887db96d56Sopenharmony_ci/*
897db96d56Sopenharmony_ci * Externs - not all will really exist on all platforms
907db96d56Sopenharmony_ci */
917db96d56Sopenharmony_ci
927db96d56Sopenharmony_ciextern PyTypeObject _PyMp_SemLockType;
937db96d56Sopenharmony_ciextern PyObject *_PyMp_sem_unlink(const char *name);
947db96d56Sopenharmony_ci
957db96d56Sopenharmony_ci#endif /* MULTIPROCESSING_H */
96