1 /*[clinic input]
2 preserve
3 [clinic start generated code]*/
4
5 #if defined(Py_BUILD_CORE) && !defined(Py_BUILD_CORE_MODULE)
6 # include "pycore_gc.h" // PyGC_Head
7 # include "pycore_runtime.h" // _Py_ID()
8 #endif
9
10
11 #if defined(HAVE_SHM_OPEN)
12
13 PyDoc_STRVAR(_posixshmem_shm_open__doc__,
14 "shm_open($module, /, path, flags, mode=511)\n"
15 "--\n"
16 "\n"
17 "Open a shared memory object. Returns a file descriptor (integer).");
18
19 #define _POSIXSHMEM_SHM_OPEN_METHODDEF \
20 {"shm_open", _PyCFunction_CAST(_posixshmem_shm_open), METH_FASTCALL|METH_KEYWORDS, _posixshmem_shm_open__doc__},
21
22 static int
23 _posixshmem_shm_open_impl(PyObject *module, PyObject *path, int flags,
24 int mode);
25
26 static PyObject *
27 _posixshmem_shm_open(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
28 {
29 PyObject *return_value = NULL;
30 #if defined(Py_BUILD_CORE) && !defined(Py_BUILD_CORE_MODULE)
31
32 #define NUM_KEYWORDS 3
33 static struct {
34 PyGC_Head _this_is_not_used;
35 PyObject_VAR_HEAD
36 PyObject *ob_item[NUM_KEYWORDS];
37 } _kwtuple = {
38 .ob_base = PyVarObject_HEAD_INIT(&PyTuple_Type, NUM_KEYWORDS)
39 .ob_item = { &_Py_ID(path), &_Py_ID(flags), &_Py_ID(mode), },
40 };
41 #undef NUM_KEYWORDS
42 #define KWTUPLE (&_kwtuple.ob_base.ob_base)
43
44 #else // !Py_BUILD_CORE
45 # define KWTUPLE NULL
46 #endif // !Py_BUILD_CORE
47
48 static const char * const _keywords[] = {"path", "flags", "mode", NULL};
49 static _PyArg_Parser _parser = {
50 .keywords = _keywords,
51 .fname = "shm_open",
52 .kwtuple = KWTUPLE,
53 };
54 #undef KWTUPLE
55 PyObject *argsbuf[3];
56 Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 2;
57 PyObject *path;
58 int flags;
59 int mode = 511;
60 int _return_value;
61
62 args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 2, 3, 0, argsbuf);
63 if (!args) {
64 goto exit;
65 }
66 if (!PyUnicode_Check(args[0])) {
67 _PyArg_BadArgument("shm_open", "argument 'path'", "str", args[0]);
68 goto exit;
69 }
70 if (PyUnicode_READY(args[0]) == -1) {
71 goto exit;
72 }
73 path = args[0];
74 flags = _PyLong_AsInt(args[1]);
75 if (flags == -1 && PyErr_Occurred()) {
76 goto exit;
77 }
78 if (!noptargs) {
79 goto skip_optional_pos;
80 }
81 mode = _PyLong_AsInt(args[2]);
82 if (mode == -1 && PyErr_Occurred()) {
83 goto exit;
84 }
85 skip_optional_pos:
86 _return_value = _posixshmem_shm_open_impl(module, path, flags, mode);
87 if ((_return_value == -1) && PyErr_Occurred()) {
88 goto exit;
89 }
90 return_value = PyLong_FromLong((long)_return_value);
91
92 exit:
93 return return_value;
94 }
95
96 #endif /* defined(HAVE_SHM_OPEN) */
97
98 #if defined(HAVE_SHM_UNLINK)
99
100 PyDoc_STRVAR(_posixshmem_shm_unlink__doc__,
101 "shm_unlink($module, /, path)\n"
102 "--\n"
103 "\n"
104 "Remove a shared memory object (similar to unlink()).\n"
105 "\n"
106 "Remove a shared memory object name, and, once all processes have unmapped\n"
107 "the object, de-allocates and destroys the contents of the associated memory\n"
108 "region.");
109
110 #define _POSIXSHMEM_SHM_UNLINK_METHODDEF \
111 {"shm_unlink", _PyCFunction_CAST(_posixshmem_shm_unlink), METH_FASTCALL|METH_KEYWORDS, _posixshmem_shm_unlink__doc__},
112
113 static PyObject *
114 _posixshmem_shm_unlink_impl(PyObject *module, PyObject *path);
115
116 static PyObject *
117 _posixshmem_shm_unlink(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
118 {
119 PyObject *return_value = NULL;
120 #if defined(Py_BUILD_CORE) && !defined(Py_BUILD_CORE_MODULE)
121
122 #define NUM_KEYWORDS 1
123 static struct {
124 PyGC_Head _this_is_not_used;
125 PyObject_VAR_HEAD
126 PyObject *ob_item[NUM_KEYWORDS];
127 } _kwtuple = {
128 .ob_base = PyVarObject_HEAD_INIT(&PyTuple_Type, NUM_KEYWORDS)
129 .ob_item = { &_Py_ID(path), },
130 };
131 #undef NUM_KEYWORDS
132 #define KWTUPLE (&_kwtuple.ob_base.ob_base)
133
134 #else // !Py_BUILD_CORE
135 # define KWTUPLE NULL
136 #endif // !Py_BUILD_CORE
137
138 static const char * const _keywords[] = {"path", NULL};
139 static _PyArg_Parser _parser = {
140 .keywords = _keywords,
141 .fname = "shm_unlink",
142 .kwtuple = KWTUPLE,
143 };
144 #undef KWTUPLE
145 PyObject *argsbuf[1];
146 PyObject *path;
147
148 args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 1, 0, argsbuf);
149 if (!args) {
150 goto exit;
151 }
152 if (!PyUnicode_Check(args[0])) {
153 _PyArg_BadArgument("shm_unlink", "argument 'path'", "str", args[0]);
154 goto exit;
155 }
156 if (PyUnicode_READY(args[0]) == -1) {
157 goto exit;
158 }
159 path = args[0];
160 return_value = _posixshmem_shm_unlink_impl(module, path);
161
162 exit:
163 return return_value;
164 }
165
166 #endif /* defined(HAVE_SHM_UNLINK) */
167
168 #ifndef _POSIXSHMEM_SHM_OPEN_METHODDEF
169 #define _POSIXSHMEM_SHM_OPEN_METHODDEF
170 #endif /* !defined(_POSIXSHMEM_SHM_OPEN_METHODDEF) */
171
172 #ifndef _POSIXSHMEM_SHM_UNLINK_METHODDEF
173 #define _POSIXSHMEM_SHM_UNLINK_METHODDEF
174 #endif /* !defined(_POSIXSHMEM_SHM_UNLINK_METHODDEF) */
175 /*[clinic end generated code: output=3f6fee283d5fd0e9 input=a9049054013a1b77]*/