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-
-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)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy