summaryrefslogtreecommitdiffstats
path: root/contrib/tools/python3/src/Modules/mmapmodule.c
diff options
context:
space:
mode:
authorshadchin <[email protected]>2022-04-18 12:39:32 +0300
committershadchin <[email protected]>2022-04-18 12:39:32 +0300
commitd4be68e361f4258cf0848fc70018dfe37a2acc24 (patch)
tree153e294cd97ac8b5d7a989612704a0c1f58e8ad4 /contrib/tools/python3/src/Modules/mmapmodule.c
parent260c02f5ccf242d9d9b8a873afaf6588c00237d6 (diff)
IGNIETFERRO-1816 Update Python 3 from 3.9.12 to 3.10.4
ref:9f96be6d02ee8044fdd6f124b799b270c20ce641
Diffstat (limited to 'contrib/tools/python3/src/Modules/mmapmodule.c')
-rw-r--r--contrib/tools/python3/src/Modules/mmapmodule.c322
1 files changed, 183 insertions, 139 deletions
diff --git a/contrib/tools/python3/src/Modules/mmapmodule.c b/contrib/tools/python3/src/Modules/mmapmodule.c
index a3e22d0a511..6397b0d4b81 100644
--- a/contrib/tools/python3/src/Modules/mmapmodule.c
+++ b/contrib/tools/python3/src/Modules/mmapmodule.c
@@ -20,6 +20,7 @@
#define PY_SSIZE_T_CLEAN
#include <Python.h>
+#include "structmember.h" // PyMemberDef
#include <stddef.h> // offsetof()
#ifndef MS_WINDOWS
@@ -113,10 +114,31 @@ typedef struct {
access_mode access;
} mmap_object;
+typedef struct {
+ PyTypeObject *mmap_object_type;
+} mmap_state;
+
+static mmap_state *
+get_mmap_state(PyObject *module)
+{
+ mmap_state *state = PyModule_GetState(module);
+ assert(state);
+ return state;
+}
+
+static int
+mmap_object_traverse(mmap_object *m_obj, visitproc visit, void *arg)
+{
+ Py_VISIT(Py_TYPE(m_obj));
+ return 0;
+}
static void
mmap_object_dealloc(mmap_object *m_obj)
{
+ PyTypeObject *tp = Py_TYPE(m_obj);
+ PyObject_GC_UnTrack(m_obj);
+
#ifdef MS_WINDOWS
Py_BEGIN_ALLOW_THREADS
if (m_obj->data != NULL)
@@ -142,7 +164,9 @@ mmap_object_dealloc(mmap_object *m_obj)
if (m_obj->weakreflist != NULL)
PyObject_ClearWeakRefs((PyObject *) m_obj);
- Py_TYPE(m_obj)->tp_free((PyObject*)m_obj);
+
+ tp->tp_free(m_obj);
+ Py_DECREF(tp);
}
static PyObject *
@@ -793,6 +817,11 @@ mmap_madvise_method(mmap_object *self, PyObject *args)
}
#endif // HAVE_MADVISE
+static struct PyMemberDef mmap_object_members[] = {
+ {"__weaklistoffset__", T_PYSSIZET, offsetof(mmap_object, weakreflist), READONLY},
+ {NULL},
+};
+
static struct PyMethodDef mmap_object_methods[] = {
{"close", (PyCFunction) mmap_close_method, METH_NOARGS},
{"find", (PyCFunction) mmap_find_method, METH_VARARGS},
@@ -1035,27 +1064,6 @@ mmap_ass_subscript(mmap_object *self, PyObject *item, PyObject *value)
}
}
-static PySequenceMethods mmap_as_sequence = {
- (lenfunc)mmap_length, /*sq_length*/
- 0, /*sq_concat*/
- 0, /*sq_repeat*/
- (ssizeargfunc)mmap_item, /*sq_item*/
- 0, /*sq_slice*/
- (ssizeobjargproc)mmap_ass_item, /*sq_ass_item*/
- 0, /*sq_ass_slice*/
-};
-
-static PyMappingMethods mmap_as_mapping = {
- (lenfunc)mmap_length,
- (binaryfunc)mmap_subscript,
- (objobjargproc)mmap_ass_subscript,
-};
-
-static PyBufferProcs mmap_as_buffer = {
- (getbufferproc)mmap_buffer_getbuf,
- (releasebufferproc)mmap_buffer_releasebuf,
-};
-
static PyObject *
new_mmap_object(PyTypeObject *type, PyObject *args, PyObject *kwdict);
@@ -1083,47 +1091,39 @@ The default value is MAP_SHARED.\n\
To map anonymous memory, pass -1 as the fileno (both versions).");
-static PyTypeObject mmap_object_type = {
- PyVarObject_HEAD_INIT(NULL, 0)
- "mmap.mmap", /* tp_name */
- sizeof(mmap_object), /* tp_basicsize */
- 0, /* tp_itemsize */
- /* methods */
- (destructor)mmap_object_dealloc, /* tp_dealloc */
- 0, /* tp_vectorcall_offset */
- 0, /* tp_getattr */
- 0, /* tp_setattr */
- 0, /* tp_as_async */
- (reprfunc)mmap__repr__method, /* tp_repr */
- 0, /* tp_as_number */
- &mmap_as_sequence, /* tp_as_sequence */
- &mmap_as_mapping, /* tp_as_mapping */
- 0, /* tp_hash */
- 0, /* tp_call */
- 0, /* tp_str */
- PyObject_GenericGetAttr, /* tp_getattro */
- 0, /* tp_setattro */
- &mmap_as_buffer, /* tp_as_buffer */
- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
- mmap_doc, /* tp_doc */
- 0, /* tp_traverse */
- 0, /* tp_clear */
- 0, /* tp_richcompare */
- offsetof(mmap_object, weakreflist), /* tp_weaklistoffset */
- 0, /* tp_iter */
- 0, /* tp_iternext */
- mmap_object_methods, /* tp_methods */
- 0, /* tp_members */
- mmap_object_getset, /* tp_getset */
- 0, /* tp_base */
- 0, /* tp_dict */
- 0, /* tp_descr_get */
- 0, /* tp_descr_set */
- 0, /* tp_dictoffset */
- 0, /* tp_init */
- PyType_GenericAlloc, /* tp_alloc */
- new_mmap_object, /* tp_new */
- PyObject_Del, /* tp_free */
+static PyType_Slot mmap_object_slots[] = {
+ {Py_tp_new, new_mmap_object},
+ {Py_tp_dealloc, mmap_object_dealloc},
+ {Py_tp_repr, mmap__repr__method},
+ {Py_tp_doc, (void *)mmap_doc},
+ {Py_tp_methods, mmap_object_methods},
+ {Py_tp_members, mmap_object_members},
+ {Py_tp_getset, mmap_object_getset},
+ {Py_tp_getattro, PyObject_GenericGetAttr},
+ {Py_tp_traverse, mmap_object_traverse},
+
+ /* as sequence */
+ {Py_sq_length, mmap_length},
+ {Py_sq_item, mmap_item},
+ {Py_sq_ass_item, mmap_ass_item},
+
+ /* as mapping */
+ {Py_mp_length, mmap_length},
+ {Py_mp_subscript, mmap_subscript},
+ {Py_mp_ass_subscript, mmap_ass_subscript},
+
+ /* as buffer */
+ {Py_bf_getbuffer, mmap_buffer_getbuf},
+ {Py_bf_releasebuffer, mmap_buffer_releasebuf},
+ {0, NULL},
+};
+
+static PyType_Spec mmap_object_spec = {
+ .name = "mmap.mmap",
+ .basicsize = sizeof(mmap_object),
+ .flags = (Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE |
+ Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_IMMUTABLETYPE),
+ .slots = mmap_object_slots,
};
@@ -1378,13 +1378,10 @@ new_mmap_object(PyTypeObject *type, PyObject *args, PyObject *kwdict)
*/
if (fileno != -1 && fileno != 0) {
/* Ensure that fileno is within the CRT's valid range */
- _Py_BEGIN_SUPPRESS_IPH
- fh = (HANDLE)_get_osfhandle(fileno);
- _Py_END_SUPPRESS_IPH
- if (fh==(HANDLE)-1) {
- PyErr_SetFromErrno(PyExc_OSError);
+ fh = _Py_get_osfhandle(fileno);
+ if (fh == INVALID_HANDLE_VALUE)
return NULL;
- }
+
/* Win9x appears to need us seeked to zero */
lseek(fileno, 0, SEEK_SET);
}
@@ -1509,154 +1506,201 @@ new_mmap_object(PyTypeObject *type, PyObject *args, PyObject *kwdict)
}
#endif /* MS_WINDOWS */
-static void
-setint(PyObject *d, const char *name, long value)
+static int
+mmap_traverse(PyObject *module, visitproc visit, void *arg)
{
- PyObject *o = PyLong_FromLong(value);
- if (o) {
- PyDict_SetItemString(d, name, o);
- Py_DECREF(o);
- }
+ mmap_state *state = get_mmap_state(module);
+ Py_VISIT(state->mmap_object_type);
+ return 0;
}
+static int
+mmap_clear(PyObject *module)
+{
+ mmap_state *state = get_mmap_state(module);
+ Py_CLEAR(state->mmap_object_type);
+ return 0;
+}
-static struct PyModuleDef mmapmodule = {
- PyModuleDef_HEAD_INIT,
- "mmap",
- NULL,
- -1,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL
-};
+static void
+mmap_free(void *module)
+{
+ mmap_clear((PyObject *)module);
+}
-PyMODINIT_FUNC
-PyInit_mmap(void)
+static int
+mmap_exec(PyObject *module)
{
- PyObject *dict, *module;
+ mmap_state *state = get_mmap_state(module);
- if (PyType_Ready(&mmap_object_type) < 0)
- return NULL;
+ Py_INCREF(PyExc_OSError);
+ if (PyModule_AddObject(module, "error", PyExc_OSError) < 0) {
+ Py_DECREF(PyExc_OSError);
+ return -1;
+ }
+
+ state->mmap_object_type = (PyTypeObject *)PyType_FromModuleAndSpec(module,
+ &mmap_object_spec,
+ NULL);
+ if (state->mmap_object_type == NULL) {
+ return -1;
+ }
+ if (PyModule_AddType(module, state->mmap_object_type) < 0) {
+ return -1;
+ }
+
+#define ADD_INT_MACRO(module, constant) \
+ do { \
+ if (PyModule_AddIntConstant(module, #constant, constant) < 0) { \
+ return -1; \
+ } \
+ } while (0)
- module = PyModule_Create(&mmapmodule);
- if (module == NULL)
- return NULL;
- dict = PyModule_GetDict(module);
- if (!dict)
- return NULL;
- PyDict_SetItemString(dict, "error", PyExc_OSError);
- PyDict_SetItemString(dict, "mmap", (PyObject*) &mmap_object_type);
#ifdef PROT_EXEC
- setint(dict, "PROT_EXEC", PROT_EXEC);
+ ADD_INT_MACRO(module, PROT_EXEC);
#endif
#ifdef PROT_READ
- setint(dict, "PROT_READ", PROT_READ);
+ ADD_INT_MACRO(module, PROT_READ);
#endif
#ifdef PROT_WRITE
- setint(dict, "PROT_WRITE", PROT_WRITE);
+ ADD_INT_MACRO(module, PROT_WRITE);
#endif
#ifdef MAP_SHARED
- setint(dict, "MAP_SHARED", MAP_SHARED);
+ ADD_INT_MACRO(module, MAP_SHARED);
#endif
#ifdef MAP_PRIVATE
- setint(dict, "MAP_PRIVATE", MAP_PRIVATE);
+ ADD_INT_MACRO(module, MAP_PRIVATE);
#endif
#ifdef MAP_DENYWRITE
- setint(dict, "MAP_DENYWRITE", MAP_DENYWRITE);
+ ADD_INT_MACRO(module, MAP_DENYWRITE);
#endif
#ifdef MAP_EXECUTABLE
- setint(dict, "MAP_EXECUTABLE", MAP_EXECUTABLE);
+ ADD_INT_MACRO(module, MAP_EXECUTABLE);
#endif
#ifdef MAP_ANONYMOUS
- setint(dict, "MAP_ANON", MAP_ANONYMOUS);
- setint(dict, "MAP_ANONYMOUS", MAP_ANONYMOUS);
+ if (PyModule_AddIntConstant(module, "MAP_ANON", MAP_ANONYMOUS) < 0 ) {
+ return -1;
+ }
+ ADD_INT_MACRO(module, MAP_ANONYMOUS);
#endif
+#ifdef MAP_POPULATE
+ ADD_INT_MACRO(module, MAP_POPULATE);
+#endif
+ if (PyModule_AddIntConstant(module, "PAGESIZE", (long)my_getpagesize()) < 0 ) {
+ return -1;
+ }
- setint(dict, "PAGESIZE", (long)my_getpagesize());
-
- setint(dict, "ALLOCATIONGRANULARITY", (long)my_getallocationgranularity());
+ if (PyModule_AddIntConstant(module, "ALLOCATIONGRANULARITY", (long)my_getallocationgranularity()) < 0 ) {
+ return -1;
+ }
- setint(dict, "ACCESS_DEFAULT", ACCESS_DEFAULT);
- setint(dict, "ACCESS_READ", ACCESS_READ);
- setint(dict, "ACCESS_WRITE", ACCESS_WRITE);
- setint(dict, "ACCESS_COPY", ACCESS_COPY);
+ ADD_INT_MACRO(module, ACCESS_DEFAULT);
+ ADD_INT_MACRO(module, ACCESS_READ);
+ ADD_INT_MACRO(module, ACCESS_WRITE);
+ ADD_INT_MACRO(module, ACCESS_COPY);
#ifdef HAVE_MADVISE
// Conventional advice values
#ifdef MADV_NORMAL
- setint(dict, "MADV_NORMAL", MADV_NORMAL);
+ ADD_INT_MACRO(module, MADV_NORMAL);
#endif
#ifdef MADV_RANDOM
- setint(dict, "MADV_RANDOM", MADV_RANDOM);
+ ADD_INT_MACRO(module, MADV_RANDOM);
#endif
#ifdef MADV_SEQUENTIAL
- setint(dict, "MADV_SEQUENTIAL", MADV_SEQUENTIAL);
+ ADD_INT_MACRO(module, MADV_SEQUENTIAL);
#endif
#ifdef MADV_WILLNEED
- setint(dict, "MADV_WILLNEED", MADV_WILLNEED);
+ ADD_INT_MACRO(module, MADV_WILLNEED);
#endif
#ifdef MADV_DONTNEED
- setint(dict, "MADV_DONTNEED", MADV_DONTNEED);
+ ADD_INT_MACRO(module, MADV_DONTNEED);
#endif
// Linux-specific advice values
#ifdef MADV_REMOVE
- setint(dict, "MADV_REMOVE", MADV_REMOVE);
+ ADD_INT_MACRO(module, MADV_REMOVE);
#endif
#ifdef MADV_DONTFORK
- setint(dict, "MADV_DONTFORK", MADV_DONTFORK);
+ ADD_INT_MACRO(module, MADV_DONTFORK);
#endif
#ifdef MADV_DOFORK
- setint(dict, "MADV_DOFORK", MADV_DOFORK);
+ ADD_INT_MACRO(module, MADV_DOFORK);
#endif
#ifdef MADV_HWPOISON
- setint(dict, "MADV_HWPOISON", MADV_HWPOISON);
+ ADD_INT_MACRO(module, MADV_HWPOISON);
#endif
#ifdef MADV_MERGEABLE
- setint(dict, "MADV_MERGEABLE", MADV_MERGEABLE);
+ ADD_INT_MACRO(module, MADV_MERGEABLE);
#endif
#ifdef MADV_UNMERGEABLE
- setint(dict, "MADV_UNMERGEABLE", MADV_UNMERGEABLE);
+ ADD_INT_MACRO(module, MADV_UNMERGEABLE);
#endif
#ifdef MADV_SOFT_OFFLINE
- setint(dict, "MADV_SOFT_OFFLINE", MADV_SOFT_OFFLINE);
+ ADD_INT_MACRO(module, MADV_SOFT_OFFLINE);
#endif
#ifdef MADV_HUGEPAGE
- setint(dict, "MADV_HUGEPAGE", MADV_HUGEPAGE);
+ ADD_INT_MACRO(module, MADV_HUGEPAGE);
#endif
#ifdef MADV_NOHUGEPAGE
- setint(dict, "MADV_NOHUGEPAGE", MADV_NOHUGEPAGE);
+ ADD_INT_MACRO(module, MADV_NOHUGEPAGE);
#endif
#ifdef MADV_DONTDUMP
- setint(dict, "MADV_DONTDUMP", MADV_DONTDUMP);
+ ADD_INT_MACRO(module, MADV_DONTDUMP);
#endif
#ifdef MADV_DODUMP
- setint(dict, "MADV_DODUMP", MADV_DODUMP);
+ ADD_INT_MACRO(module, MADV_DODUMP);
#endif
#ifdef MADV_FREE // (Also present on FreeBSD and macOS.)
- setint(dict, "MADV_FREE", MADV_FREE);
+ ADD_INT_MACRO(module, MADV_FREE);
#endif
// FreeBSD-specific
#ifdef MADV_NOSYNC
- setint(dict, "MADV_NOSYNC", MADV_NOSYNC);
+ ADD_INT_MACRO(module, MADV_NOSYNC);
#endif
#ifdef MADV_AUTOSYNC
- setint(dict, "MADV_AUTOSYNC", MADV_AUTOSYNC);
+ ADD_INT_MACRO(module, MADV_AUTOSYNC);
#endif
#ifdef MADV_NOCORE
- setint(dict, "MADV_NOCORE", MADV_NOCORE);
+ ADD_INT_MACRO(module, MADV_NOCORE);
#endif
#ifdef MADV_CORE
- setint(dict, "MADV_CORE", MADV_CORE);
+ ADD_INT_MACRO(module, MADV_CORE);
#endif
#ifdef MADV_PROTECT
- setint(dict, "MADV_PROTECT", MADV_PROTECT);
+ ADD_INT_MACRO(module, MADV_PROTECT);
+#endif
+
+ // Darwin-specific
+#ifdef MADV_FREE_REUSABLE // (As MADV_FREE but reclaims more faithful for task_info/Activity Monitor...)
+ ADD_INT_MACRO(module, MADV_FREE_REUSABLE);
+#endif
+#ifdef MADV_FREE_REUSE // (Reuse pages previously tagged as reusable)
+ ADD_INT_MACRO(module, MADV_FREE_REUSE);
#endif
#endif // HAVE_MADVISE
+ return 0;
+}
- return module;
+static PyModuleDef_Slot mmap_slots[] = {
+ {Py_mod_exec, mmap_exec},
+ {0, NULL}
+};
+
+static struct PyModuleDef mmapmodule = {
+ PyModuleDef_HEAD_INIT,
+ .m_name = "mmap",
+ .m_size = sizeof(mmap_state),
+ .m_slots = mmap_slots,
+ .m_traverse = mmap_traverse,
+ .m_clear = mmap_clear,
+ .m_free = mmap_free,
+};
+
+PyMODINIT_FUNC
+PyInit_mmap(void)
+{
+ return PyModuleDef_Init(&mmapmodule);
}