Path: blob/main/Modules/_multiprocessing/multiprocessing.c
12 views
/*1* Extension module used by multiprocessing package2*3* multiprocessing.c4*5* Copyright (c) 2006-2008, R Oudkerk6* Licensed to PSF under a Contributor Agreement.7*/89#include "multiprocessing.h"1011/*[python input]12class HANDLE_converter(CConverter):13type = "HANDLE"14format_unit = '"F_HANDLE"'1516def parse_arg(self, argname, displayname):17return """18{paramname} = PyLong_AsVoidPtr({argname});19if (!{paramname} && PyErr_Occurred()) {{{{20goto exit;21}}}}22""".format(argname=argname, paramname=self.parser_name)2324[python start generated code]*/25/*[python end generated code: output=da39a3ee5e6b4b0d input=3e537d244034affb]*/2627/*[clinic input]28module _multiprocessing29[clinic start generated code]*/30/*[clinic end generated code: output=da39a3ee5e6b4b0d input=01e0745f380ac6e3]*/3132#include "clinic/multiprocessing.c.h"3334/*35* Function which raises exceptions based on error codes36*/3738PyObject *39_PyMp_SetError(PyObject *Type, int num)40{41switch (num) {42#ifdef MS_WINDOWS43case MP_STANDARD_ERROR:44if (Type == NULL)45Type = PyExc_OSError;46PyErr_SetExcFromWindowsErr(Type, 0);47break;48case MP_SOCKET_ERROR:49if (Type == NULL)50Type = PyExc_OSError;51PyErr_SetExcFromWindowsErr(Type, WSAGetLastError());52break;53#else /* !MS_WINDOWS */54case MP_STANDARD_ERROR:55case MP_SOCKET_ERROR:56if (Type == NULL)57Type = PyExc_OSError;58PyErr_SetFromErrno(Type);59break;60#endif /* !MS_WINDOWS */61case MP_MEMORY_ERROR:62PyErr_NoMemory();63break;64case MP_EXCEPTION_HAS_BEEN_SET:65break;66default:67PyErr_Format(PyExc_RuntimeError,68"unknown error number %d", num);69}70return NULL;71}7273#ifdef MS_WINDOWS74/*[clinic input]75_multiprocessing.closesocket7677handle: HANDLE78/7980[clinic start generated code]*/8182static PyObject *83_multiprocessing_closesocket_impl(PyObject *module, HANDLE handle)84/*[clinic end generated code: output=214f359f900966f4 input=8a20706dd386c6cc]*/85{86int ret;8788Py_BEGIN_ALLOW_THREADS89ret = closesocket((SOCKET) handle);90Py_END_ALLOW_THREADS9192if (ret)93return PyErr_SetExcFromWindowsErr(PyExc_OSError, WSAGetLastError());94Py_RETURN_NONE;95}9697/*[clinic input]98_multiprocessing.recv99100handle: HANDLE101size: int102/103104[clinic start generated code]*/105106static PyObject *107_multiprocessing_recv_impl(PyObject *module, HANDLE handle, int size)108/*[clinic end generated code: output=92322781ba9ff598 input=6a5b0834372cee5b]*/109{110int nread;111PyObject *buf;112113buf = PyBytes_FromStringAndSize(NULL, size);114if (!buf)115return NULL;116117Py_BEGIN_ALLOW_THREADS118nread = recv((SOCKET) handle, PyBytes_AS_STRING(buf), size, 0);119Py_END_ALLOW_THREADS120121if (nread < 0) {122Py_DECREF(buf);123return PyErr_SetExcFromWindowsErr(PyExc_OSError, WSAGetLastError());124}125_PyBytes_Resize(&buf, nread);126return buf;127}128129/*[clinic input]130_multiprocessing.send131132handle: HANDLE133buf: Py_buffer134/135136[clinic start generated code]*/137138static PyObject *139_multiprocessing_send_impl(PyObject *module, HANDLE handle, Py_buffer *buf)140/*[clinic end generated code: output=52d7df0519c596cb input=41dce742f98d2210]*/141{142int ret, length;143144length = (int)Py_MIN(buf->len, INT_MAX);145146Py_BEGIN_ALLOW_THREADS147ret = send((SOCKET) handle, buf->buf, length, 0);148Py_END_ALLOW_THREADS149150if (ret < 0)151return PyErr_SetExcFromWindowsErr(PyExc_OSError, WSAGetLastError());152return PyLong_FromLong(ret);153}154155#endif156157/*[clinic input]158_multiprocessing.sem_unlink159160name: str161/162163[clinic start generated code]*/164165static PyObject *166_multiprocessing_sem_unlink_impl(PyObject *module, const char *name)167/*[clinic end generated code: output=fcbfeb1ed255e647 input=bf939aff9564f1d5]*/168{169return _PyMp_sem_unlink(name);170}171172/*173* Function table174*/175176static PyMethodDef module_methods[] = {177#ifdef MS_WINDOWS178_MULTIPROCESSING_CLOSESOCKET_METHODDEF179_MULTIPROCESSING_RECV_METHODDEF180_MULTIPROCESSING_SEND_METHODDEF181#endif182#if !defined(POSIX_SEMAPHORES_NOT_ENABLED) && !defined(__ANDROID__)183_MULTIPROCESSING_SEM_UNLINK_METHODDEF184#endif185{NULL}186};187188189/*190* Initialize191*/192193static int194multiprocessing_exec(PyObject *module)195{196#ifdef HAVE_MP_SEMAPHORE197198PyTypeObject *semlock_type = (PyTypeObject *)PyType_FromModuleAndSpec(199module, &_PyMp_SemLockType_spec, NULL);200201if (semlock_type == NULL) {202return -1;203}204int rc = PyModule_AddType(module, semlock_type);205Py_DECREF(semlock_type);206if (rc < 0) {207return -1;208}209210PyObject *py_sem_value_max;211/* Some systems define SEM_VALUE_MAX as an unsigned value that212* causes it to be negative when used as an int (NetBSD).213*214* Issue #28152: Use (0) instead of 0 to fix a warning on dead code215* when using clang -Wunreachable-code. */216if ((int)(SEM_VALUE_MAX) < (0)) {217py_sem_value_max = PyLong_FromLong(INT_MAX);218}219else {220py_sem_value_max = PyLong_FromLong(SEM_VALUE_MAX);221}222if (py_sem_value_max == NULL) {223return -1;224}225if (PyDict_SetItemString(semlock_type->tp_dict, "SEM_VALUE_MAX",226py_sem_value_max) < 0) {227Py_DECREF(py_sem_value_max);228return -1;229}230Py_DECREF(py_sem_value_max);231232#endif233234/* Add configuration macros */235PyObject *flags = PyDict_New();236if (!flags) {237return -1;238}239240#define ADD_FLAG(name) \241do { \242PyObject *value = PyLong_FromLong(name); \243if (value == NULL) { \244Py_DECREF(flags); \245return -1; \246} \247if (PyDict_SetItemString(flags, #name, value) < 0) { \248Py_DECREF(flags); \249Py_DECREF(value); \250return -1; \251} \252Py_DECREF(value); \253} while (0)254255#if defined(HAVE_SEM_OPEN) && !defined(POSIX_SEMAPHORES_NOT_ENABLED)256ADD_FLAG(HAVE_SEM_OPEN);257#endif258#ifdef HAVE_SEM_TIMEDWAIT259ADD_FLAG(HAVE_SEM_TIMEDWAIT);260#endif261#ifdef HAVE_BROKEN_SEM_GETVALUE262ADD_FLAG(HAVE_BROKEN_SEM_GETVALUE);263#endif264#ifdef HAVE_BROKEN_SEM_UNLINK265ADD_FLAG(HAVE_BROKEN_SEM_UNLINK);266#endif267268if (PyModule_AddObject(module, "flags", flags) < 0) {269Py_DECREF(flags);270return -1;271}272273return 0;274}275276static PyModuleDef_Slot multiprocessing_slots[] = {277{Py_mod_exec, multiprocessing_exec},278{Py_mod_multiple_interpreters, Py_MOD_PER_INTERPRETER_GIL_SUPPORTED},279{0, NULL}280};281282static struct PyModuleDef multiprocessing_module = {283PyModuleDef_HEAD_INIT,284.m_name = "_multiprocessing",285.m_size = 0,286.m_methods = module_methods,287.m_slots = multiprocessing_slots,288};289290PyMODINIT_FUNC291PyInit__multiprocessing(void)292{293return PyModuleDef_Init(&multiprocessing_module);294}295296297