2019-02-02 04:52:23 +00:00
|
|
|
/*
|
2019-02-24 04:08:16 +00:00
|
|
|
posixshmem - A Python extension that provides shm_open() and shm_unlink()
|
2019-02-02 04:52:23 +00:00
|
|
|
*/
|
|
|
|
|
|
|
|
#define PY_SSIZE_T_CLEAN
|
|
|
|
|
|
|
|
#include <Python.h>
|
|
|
|
|
2019-02-24 04:08:16 +00:00
|
|
|
// for shm_open() and shm_unlink()
|
|
|
|
#ifdef HAVE_SYS_MMAN_H
|
2019-02-02 04:52:23 +00:00
|
|
|
#include <sys/mman.h>
|
|
|
|
#endif
|
|
|
|
|
2019-02-24 04:08:16 +00:00
|
|
|
/*[clinic input]
|
|
|
|
module _posixshmem
|
|
|
|
[clinic start generated code]*/
|
|
|
|
/*[clinic end generated code: output=da39a3ee5e6b4b0d input=a416734e49164bf8]*/
|
2019-02-02 04:52:23 +00:00
|
|
|
|
|
|
|
/*
|
2019-02-24 04:08:16 +00:00
|
|
|
*
|
|
|
|
* Module-level functions & meta stuff
|
|
|
|
*
|
|
|
|
*/
|
2019-02-02 04:52:23 +00:00
|
|
|
|
2019-02-24 04:08:16 +00:00
|
|
|
#ifdef HAVE_SHM_OPEN
|
|
|
|
/*[clinic input]
|
|
|
|
_posixshmem.shm_open -> int
|
|
|
|
path: unicode
|
|
|
|
flags: int
|
|
|
|
mode: int = 0o777
|
2019-02-02 04:52:23 +00:00
|
|
|
|
2019-02-24 04:08:16 +00:00
|
|
|
# "shm_open(path, flags, mode=0o777)\n\n\
|
2019-02-02 04:52:23 +00:00
|
|
|
|
2019-02-24 04:08:16 +00:00
|
|
|
Open a shared memory object. Returns a file descriptor (integer).
|
2019-02-02 04:52:23 +00:00
|
|
|
|
2019-02-24 04:08:16 +00:00
|
|
|
[clinic start generated code]*/
|
2019-02-02 04:52:23 +00:00
|
|
|
|
|
|
|
static int
|
2019-02-24 04:08:16 +00:00
|
|
|
_posixshmem_shm_open_impl(PyObject *module, PyObject *path, int flags,
|
|
|
|
int mode)
|
|
|
|
/*[clinic end generated code: output=8d110171a4fa20df input=e83b58fa802fac25]*/
|
|
|
|
{
|
|
|
|
int fd;
|
|
|
|
int async_err = 0;
|
2024-02-25 11:12:07 +00:00
|
|
|
Py_ssize_t name_size;
|
|
|
|
const char *name = PyUnicode_AsUTF8AndSize(path, &name_size);
|
2019-02-24 04:08:16 +00:00
|
|
|
if (name == NULL) {
|
|
|
|
return -1;
|
2019-02-02 04:52:23 +00:00
|
|
|
}
|
2024-02-25 11:12:07 +00:00
|
|
|
if (strlen(name) != (size_t)name_size) {
|
|
|
|
PyErr_SetString(PyExc_ValueError, "embedded null character");
|
|
|
|
return -1;
|
|
|
|
}
|
2019-02-24 04:08:16 +00:00
|
|
|
do {
|
|
|
|
Py_BEGIN_ALLOW_THREADS
|
|
|
|
fd = shm_open(name, flags, mode);
|
|
|
|
Py_END_ALLOW_THREADS
|
|
|
|
} while (fd < 0 && errno == EINTR && !(async_err = PyErr_CheckSignals()));
|
|
|
|
|
|
|
|
if (fd < 0) {
|
|
|
|
if (!async_err)
|
|
|
|
PyErr_SetFromErrnoWithFilenameObject(PyExc_OSError, path);
|
|
|
|
return -1;
|
2019-02-02 04:52:23 +00:00
|
|
|
}
|
|
|
|
|
2019-02-24 04:08:16 +00:00
|
|
|
return fd;
|
2019-02-02 04:52:23 +00:00
|
|
|
}
|
2019-02-24 04:08:16 +00:00
|
|
|
#endif /* HAVE_SHM_OPEN */
|
2019-02-02 04:52:23 +00:00
|
|
|
|
2019-02-24 04:08:16 +00:00
|
|
|
#ifdef HAVE_SHM_UNLINK
|
|
|
|
/*[clinic input]
|
|
|
|
_posixshmem.shm_unlink
|
|
|
|
path: unicode
|
2019-02-02 04:52:23 +00:00
|
|
|
|
2019-02-24 04:08:16 +00:00
|
|
|
Remove a shared memory object (similar to unlink()).
|
2019-02-02 04:52:23 +00:00
|
|
|
|
2019-02-24 04:08:16 +00:00
|
|
|
Remove a shared memory object name, and, once all processes have unmapped
|
|
|
|
the object, de-allocates and destroys the contents of the associated memory
|
|
|
|
region.
|
2019-02-02 04:52:23 +00:00
|
|
|
|
2019-02-24 04:08:16 +00:00
|
|
|
[clinic start generated code]*/
|
2019-02-02 04:52:23 +00:00
|
|
|
|
|
|
|
static PyObject *
|
2019-02-24 04:08:16 +00:00
|
|
|
_posixshmem_shm_unlink_impl(PyObject *module, PyObject *path)
|
|
|
|
/*[clinic end generated code: output=42f8b23d134b9ff5 input=8dc0f87143e3b300]*/
|
|
|
|
{
|
|
|
|
int rv;
|
|
|
|
int async_err = 0;
|
2024-02-25 11:12:07 +00:00
|
|
|
Py_ssize_t name_size;
|
|
|
|
const char *name = PyUnicode_AsUTF8AndSize(path, &name_size);
|
2019-02-24 04:08:16 +00:00
|
|
|
if (name == NULL) {
|
|
|
|
return NULL;
|
2019-02-02 04:52:23 +00:00
|
|
|
}
|
2024-02-25 11:12:07 +00:00
|
|
|
if (strlen(name) != (size_t)name_size) {
|
|
|
|
PyErr_SetString(PyExc_ValueError, "embedded null character");
|
|
|
|
return NULL;
|
|
|
|
}
|
2019-02-24 04:08:16 +00:00
|
|
|
do {
|
|
|
|
Py_BEGIN_ALLOW_THREADS
|
|
|
|
rv = shm_unlink(name);
|
|
|
|
Py_END_ALLOW_THREADS
|
|
|
|
} while (rv < 0 && errno == EINTR && !(async_err = PyErr_CheckSignals()));
|
|
|
|
|
|
|
|
if (rv < 0) {
|
|
|
|
if (!async_err)
|
|
|
|
PyErr_SetFromErrnoWithFilenameObject(PyExc_OSError, path);
|
|
|
|
return NULL;
|
2019-02-02 04:52:23 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
Py_RETURN_NONE;
|
|
|
|
}
|
2019-02-24 04:08:16 +00:00
|
|
|
#endif /* HAVE_SHM_UNLINK */
|
2019-02-02 04:52:23 +00:00
|
|
|
|
2019-02-24 04:08:16 +00:00
|
|
|
#include "clinic/posixshmem.c.h"
|
2019-02-02 04:52:23 +00:00
|
|
|
|
|
|
|
static PyMethodDef module_methods[ ] = {
|
2019-02-24 04:08:16 +00:00
|
|
|
_POSIXSHMEM_SHM_OPEN_METHODDEF
|
|
|
|
_POSIXSHMEM_SHM_UNLINK_METHODDEF
|
2019-02-02 04:52:23 +00:00
|
|
|
{NULL} /* Sentinel */
|
|
|
|
};
|
|
|
|
|
|
|
|
|
2020-11-19 15:20:42 +00:00
|
|
|
static struct PyModuleDef _posixshmemmodule = {
|
|
|
|
PyModuleDef_HEAD_INIT,
|
|
|
|
.m_name = "_posixshmem",
|
|
|
|
.m_doc = "POSIX shared memory module",
|
|
|
|
.m_size = 0,
|
|
|
|
.m_methods = module_methods,
|
2019-02-02 04:52:23 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
/* Module init function */
|
|
|
|
PyMODINIT_FUNC
|
2020-11-19 15:20:42 +00:00
|
|
|
PyInit__posixshmem(void)
|
|
|
|
{
|
|
|
|
return PyModuleDef_Init(&_posixshmemmodule);
|
2019-02-02 04:52:23 +00:00
|
|
|
}
|