8000 bpo-1635741: Port mmap module to multiphase initialization (GH-19459) · python/cpython@3ad52e3 · GitHub
[go: up one dir, main page]

Skip to content

Commit 3ad52e3

Browse files
authored
bpo-1635741: Port mmap module to multiphase initialization (GH-19459)
1 parent e005ead commit 3ad52e3

File tree

2 files changed

+81
-74
lines changed

2 files changed

+81
-74
lines changed
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Port :mod:`mmap` to multiphase initialization.

Modules/mmapmodule.c

Lines changed: 80 additions & 74 deletions
Original file line numberDiff line numberDiff line change
@@ -1509,157 +1509,163 @@ new_mmap_object(PyTypeObject *type, PyObject *args, PyObject *kwdict)
15091509
}
15101510
#endif /* MS_WINDOWS */
15111511

1512-
static void
1513-
setint(PyObject *d, const char *name, long value)
1512+
static int
1513+
mmap_exec(PyObject *module)
15141514
{
1515-
PyObject *o = PyLong_FromLong(value);
1516-
if (o) {
1517-
PyDict_SetItemString(d, name, o);
1518-
Py_DECREF(o);
1515+
if (PyType_Ready(&mmap_object_type) < 0) {
1516+
return -1;
15191517
}
1520-
}
1521-
15221518

1523-
static struct PyModuleDef mmapmodule = {
1524-
PyModuleDef_HEAD_INIT,
1525-
"mmap",
1526-
NULL,
1527 10000 -
-1,
1528-
NULL,
1529-
NULL,
1530-
NULL,
1531-
NULL,
1532-
NULL
1533-
};
1534-
1535-
PyMODINIT_FUNC
1536-
PyInit_mmap(void)
1537-
{
1538-
PyObject *dict, *module;
1519+
Py_INCREF(PyExc_OSError);
1520+
if (PyModule_AddObject(module, "error", PyExc_OSError) < 0) {
1521+
Py_DECREF(PyExc_OSError);
1522+
return -1;
1523+
}
1524+
if (PyModule_AddType(module, &mmap_object_type) < 0) {
1525+
return -1;
1526+
}
15391527

1540-
if (PyType_Ready(&mmap_object_type) < 0)
1541-
return NULL;
1528+
#define ADD_INT_MACRO(module, constant) \
1529+
do { \
1530+
if (PyModule_AddIntConstant(module, #constant, constant) < 0) { \
1531+
return -1; \
1532+
} \
1533+
} while (0)
15421534

1543-
module = PyModule_Create(&mmapmodule);
1544-
if (module == NULL)
1545-
return NULL;
1546-
dict = PyModule_GetDict(module);
1547-
if (!dict)
1548-
return NULL;
1549-
PyDict_SetItemString(dict, "error", PyExc_OSError);
1550-
PyDict_SetItemString(dict, "mmap", (PyObject*) &mmap_object_type);
15511535
#ifdef PROT_EXEC
1552-
setint(dict, "PROT_EXEC", PROT_EXEC);
1536+
ADD_INT_MACRO(module, PROT_EXEC);
15531537
#endif
15541538
#ifdef PROT_READ
1555-
setint(dict, "PROT_READ", PROT_READ);
1539+
ADD_INT_MACRO(module, PROT_READ);
15561540
#endif
15571541
#ifdef PROT_WRITE
1558-
setint(dict, "PROT_WRITE", PROT_WRITE);
1542+
ADD_INT_MACRO(module, PROT_WRITE);
15591543
#endif
15601544

15611545
#ifdef MAP_SHARED
1562-
setint(dict, "MAP_SHARED", MAP_SHARED);
1546+
ADD_INT_MACRO(module, MAP_SHARED);
15631547
#endif
15641548
#ifdef MAP_PRIVATE
1565-
setint(dict, "MAP_PRIVATE", MAP_PRIVATE);
1549+
ADD_INT_MACRO(module, MAP_PRIVATE);
15661550
#endif
15671551
#ifdef MAP_DENYWRITE
1568-
setint(dict, "MAP_DENYWRITE", MAP_DENYWRITE);
1552+
ADD_INT_MACRO(module, MAP_DENYWRITE);
15691553
#endif
15701554
#ifdef MAP_EXECUTABLE
1571-
setint(dict, "MAP_EXECUTABLE", MAP_EXECUTABLE);
1555+
ADD_INT_MACRO(module, MAP_EXECUTABLE);
15721556
#endif
15731557
#ifdef MAP_ANONYMOUS
1574-
setint(dict, "MAP_ANON", MAP_ANONYMOUS);
1575-
setint(dict, "MAP_ANONYMOUS", MAP_ANONYMOUS);
1558+
if (PyModule_AddIntConstant(module, "MAP_ANON", MAP_ANONYMOUS) < 0 ) {
1559+
return -1;
1560+
}
1561+
ADD_INT_MACRO(module, MAP_ANONYMOUS);
15761562
#endif
15771563
#ifdef MAP_POPULATE
1578-
setint(dict, "MAP_POPULATE", MAP_POPULATE);
1564+
ADD_INT_MACRO(module, MAP_POPULATE);
15791565
#endif
1566+
if (PyModule_AddIntConstant(module, "PAGESIZE", (long)my_getpagesize()) < 0 ) {
1567+
return -1;
1568+
}
15801569

1581-
setint(dict, "PAGESIZE", (long)my_getpagesize());
1582-
1583-
setint(dict, "ALLOCATIONGRANULARITY", (long)my_getallocationgranularity());
1570+
if (PyModule_AddIntConstant(module, "ALLOCATIONGRANULARITY", (long)my_getallocationgranularity()) < 0 ) {
1571+
return -1;
1572+
}
15841573

1585-
setint(dict, "ACCESS_DEFAULT", ACCESS_DEFAULT);
1586-
setint(dict, "ACCESS_READ", ACCESS_READ);
1587-
setint(dict, "ACCESS_WRITE", ACCESS_WRITE);
1588-
setint(dict, "ACCESS_COPY", ACCESS_COPY);
1574+
ADD_INT_MACRO(module, ACCESS_DEFAULT);
1575+
ADD_INT_MACRO(module, ACCESS_READ);
1576+
ADD_INT_MACRO(module, ACCESS_WRITE);
1577+
ADD_INT_MACRO(module, ACCESS_COPY);
15891578

15901579
#ifdef HAVE_MADVISE
15911580
// Conventional advice values
15921581
#ifdef MADV_NORMAL
1593-
setint(dict, "MADV_NORMAL", MADV_NORMAL);
1582+
ADD_INT_MACRO(module, MADV_NORMAL);
15941583
#endif
15951584
#ifdef MADV_RANDOM
1596-
setint(dict, "MADV_RANDOM", MADV_RANDOM);
1585+
ADD_INT_MACRO(module, MADV_RANDOM);
15971586
#endif
15981587
#ifdef MADV_SEQUENTIAL
1599-
setint(dict, "MADV_SEQUENTIAL", MADV_SEQUENTIAL);
1588+
ADD_INT_MACRO(module, MADV_SEQUENTIAL);
16001589
#endif
16011590
#ifdef MADV_WILLNEED
1602-
setint(dict, "MADV_WILLNEED", MADV_WILLNEED);
1591+
ADD_INT_MACRO(module, MADV_WILLNEED);
16031592
#endif
16041593
#ifdef MADV_DONTNEED
1605-
setint(dict, "MADV_DONTNEED", MADV_DONTNEED);
1594+
ADD_INT_MACRO(module, MADV_DONTNEED);
16061595
#endif
16071596

16081597
// Linux-specific advice values
16091598
#ifdef MADV_REMOVE
1610-
setint(dict, "MADV_REMOVE", MADV_REMOVE);
1599+
ADD_INT_MACRO(module, MADV_REMOVE);
16111600
#endif
16121601
#ifdef MADV_DONTFORK
1613-
setint(dict, "MADV_DONTFORK", MADV_DONTFORK);
1602+
ADD_INT_MACRO(module, MADV_DONTFORK);
16141603
#endif
16151604
#ifdef MADV_DOFORK
1616-
setint(dict, "MADV_DOFORK", MADV_DOFORK);
1605+
ADD_INT_MACRO(module, MADV_DOFORK);
16171606
#endif
16181607
#ifdef MADV_HWPOISON
1619-
setint(dict, "MADV_HWPOISON", MADV_HWPOISON);
1608+
ADD_INT_MACRO(module, MADV_HWPOISON);
16201609
#endif
16211610
#ifdef MADV_MERGEABLE
1622-
setint(dict, "MADV_MERGEABLE", MADV_MERGEABLE);
1611+
ADD_INT_MACRO(module, MADV_MERGEABLE);
16231612
#endif
16241613
#ifdef MADV_UNMERGEABLE
1625-
setint(dict, "MADV_UNMERGEABLE", MADV_UNMERGEABLE);
1614+
ADD_INT_MACRO(module, MADV_UNMERGEABLE);
16261615
#endif
16271616
#ifdef MADV_SOFT_OFFLINE
1628-
setint(dict, "MADV_SOFT_OFFLINE", MADV_SOFT_OFFLINE);
1617+
ADD_INT_MACRO(module, MADV_SOFT_OFFLINE);
16291618
#endif
16301619
#ifdef MADV_HUGEPAGE
1631-
setint(dict, "MADV_HUGEPAGE", MADV_HUGEPAGE);
1620+
ADD_INT_MACRO(module, MADV_HUGEPAGE);
16321621
#endif
16331622
#ifdef MADV_NOHUGEPAGE
1634-
setint(dict, "MADV_NOHUGEPAGE", MADV_NOHUGEPAGE);
1623+
ADD_INT_MACRO(module, MADV_NOHUGEPAGE);
16351624
#endif
16361625
#ifdef MADV_DONTDUMP
1637-
setint(dict, "MADV_DONTDUMP", MADV_DONTDUMP);
1626+
ADD_INT_MACRO(module, MADV_DONTDUMP);
16381627
#endif
16391628
#ifdef MADV_DODUMP
1640-
setint(dict, "MADV_DODUMP", MADV_DODUMP);
1629+
ADD_INT_MACRO(module, MADV_DODUMP);
16411630
#endif
16421631
#ifdef MADV_FREE // (Also present on FreeBSD and macOS.)
1643-
setint(dict, "MADV_FREE", MADV_FREE);
1632+
ADD_INT_MACRO(module, MADV_FREE);
16441633
#endif
16451634

16461635
// FreeBSD-specific
16471636
#ifdef MADV_NOSYNC
1648-
setint(dict, "MADV_NOSYNC", MADV_NOSYNC);
1637+
ADD_INT_MACRO(module, MADV_NOSYNC);
16491638
#endif
16501639
#ifdef MADV_AUTOSYNC
1651-
setint(dict, "MADV_AUTOSYNC", MADV_AUTOSYNC);
1640+
ADD_INT_MACRO(module, MADV_AUTOSYNC);
16521641
#endif
16531642
#ifdef MADV_NOCORE
1654-
setint(dict, "MADV_NOCORE", MADV_NOCORE);
1643+
ADD_INT_MACRO(module, MADV_NOCORE);
16551644
#endif
16561645
#ifdef MADV_CORE
1657-
setint(dict, "MADV_CORE", MADV_CORE);
1646+
ADD_INT_MACRO(module, MADV_CORE);
16581647
#endif
16591648
#ifdef MADV_PROTECT
1660-
setint(dict, "MADV_PROTECT", MADV_PROTECT);
1649+
ADD_INT_MACRO(module, MADV_PROTECT);
16611650
#endif
16621651
#endif // HAVE_MADVISE
1652+
return 0;
1653+
}
16631654

1664-
return module;
1655+
static PyModuleDef_Slot mmap_slots[] = {
1656+
{Py_mod_exec, mmap_exec},
1657+
{0, NULL}
1658+
};
1659+
1660+
static struct PyModuleDef mmapmodule = {
1661+
PyModuleDef_HEAD_INIT,
1662+
.m_name = "mmap",
1663+
.m_size = 0,
1664+
.m_slots = mmap_slots,
1665+
};
1666+
1667+
PyMODINIT_FUNC
1668+
PyInit_mmap(void)
1669+
{
1670+
return PyModuleDef_Init(&mmapmodule);
16651671
}

0 commit comments

Comments
 (0)
0