| 
									
										
										
										
											2019-02-01 22:52:23 -06:00
										 |  |  | /*
 | 
					
						
							| 
									
										
										
										
											2019-02-23 22:08:16 -06:00
										 |  |  | posixshmem - A Python extension that provides shm_open() and shm_unlink() | 
					
						
							| 
									
										
										
										
											2019-02-01 22:52:23 -06:00
										 |  |  | */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #define PY_SSIZE_T_CLEAN
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include <Python.h>
 | 
					
						
							|  |  |  | #include "structmember.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-02-23 22:08:16 -06:00
										 |  |  | // for shm_open() and shm_unlink()
 | 
					
						
							|  |  |  | #ifdef HAVE_SYS_MMAN_H
 | 
					
						
							| 
									
										
										
										
											2019-02-01 22:52:23 -06:00
										 |  |  | #include <sys/mman.h>
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-02-23 22:08:16 -06:00
										 |  |  | /*[clinic input]
 | 
					
						
							|  |  |  | module _posixshmem | 
					
						
							|  |  |  | [clinic start generated code]*/ | 
					
						
							|  |  |  | /*[clinic end generated code: output=da39a3ee5e6b4b0d input=a416734e49164bf8]*/ | 
					
						
							| 
									
										
										
										
											2019-02-01 22:52:23 -06:00
										 |  |  | 
 | 
					
						
							|  |  |  | /*
 | 
					
						
							| 
									
										
										
										
											2019-02-23 22:08:16 -06:00
										 |  |  |  * | 
					
						
							|  |  |  |  * Module-level functions & meta stuff | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  */ | 
					
						
							| 
									
										
										
										
											2019-02-01 22:52:23 -06:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-02-23 22:08:16 -06:00
										 |  |  | #ifdef HAVE_SHM_OPEN
 | 
					
						
							|  |  |  | /*[clinic input]
 | 
					
						
							|  |  |  | _posixshmem.shm_open -> int | 
					
						
							|  |  |  |     path: unicode | 
					
						
							|  |  |  |     flags: int | 
					
						
							|  |  |  |     mode: int = 0o777 | 
					
						
							| 
									
										
										
										
											2019-02-01 22:52:23 -06:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-02-23 22:08:16 -06:00
										 |  |  | # "shm_open(path, flags, mode=0o777)\n\n\
 | 
					
						
							| 
									
										
										
										
											2019-02-01 22:52:23 -06:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-02-23 22:08:16 -06:00
										 |  |  | Open a shared memory object.  Returns a file descriptor (integer). | 
					
						
							| 
									
										
										
										
											2019-02-01 22:52:23 -06:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-02-23 22:08:16 -06:00
										 |  |  | [clinic start generated code]*/ | 
					
						
							| 
									
										
										
										
											2019-02-01 22:52:23 -06:00
										 |  |  | 
 | 
					
						
							|  |  |  | static int | 
					
						
							| 
									
										
										
										
											2019-02-23 22:08:16 -06: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; | 
					
						
							|  |  |  |     const char *name = PyUnicode_AsUTF8(path); | 
					
						
							|  |  |  |     if (name == NULL) { | 
					
						
							|  |  |  |         return -1; | 
					
						
							| 
									
										
										
										
											2019-02-01 22:52:23 -06:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2019-02-23 22:08:16 -06: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-01 22:52:23 -06:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-02-23 22:08:16 -06:00
										 |  |  |     return fd; | 
					
						
							| 
									
										
										
										
											2019-02-01 22:52:23 -06:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2019-02-23 22:08:16 -06:00
										 |  |  | #endif /* HAVE_SHM_OPEN */
 | 
					
						
							| 
									
										
										
										
											2019-02-01 22:52:23 -06:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-02-23 22:08:16 -06:00
										 |  |  | #ifdef HAVE_SHM_UNLINK
 | 
					
						
							|  |  |  | /*[clinic input]
 | 
					
						
							|  |  |  | _posixshmem.shm_unlink | 
					
						
							|  |  |  |     path: unicode | 
					
						
							| 
									
										
										
										
											2019-02-01 22:52:23 -06:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-02-23 22:08:16 -06:00
										 |  |  | Remove a shared memory object (similar to unlink()). | 
					
						
							| 
									
										
										
										
											2019-02-01 22:52:23 -06:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-02-23 22:08:16 -06: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-01 22:52:23 -06:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-02-23 22:08:16 -06:00
										 |  |  | [clinic start generated code]*/ | 
					
						
							| 
									
										
										
										
											2019-02-01 22:52:23 -06:00
										 |  |  | 
 | 
					
						
							|  |  |  | static PyObject * | 
					
						
							| 
									
										
										
										
											2019-02-23 22:08:16 -06:00
										 |  |  | _posixshmem_shm_unlink_impl(PyObject *module, PyObject *path) | 
					
						
							|  |  |  | /*[clinic end generated code: output=42f8b23d134b9ff5 input=8dc0f87143e3b300]*/ | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     int rv; | 
					
						
							|  |  |  |     int async_err = 0; | 
					
						
							|  |  |  |     const char *name = PyUnicode_AsUTF8(path); | 
					
						
							|  |  |  |     if (name == NULL) { | 
					
						
							|  |  |  |         return NULL; | 
					
						
							| 
									
										
										
										
											2019-02-01 22:52:23 -06:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2019-02-23 22:08:16 -06: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-01 22:52:23 -06:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     Py_RETURN_NONE; | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2019-02-23 22:08:16 -06:00
										 |  |  | #endif /* HAVE_SHM_UNLINK */
 | 
					
						
							| 
									
										
										
										
											2019-02-01 22:52:23 -06:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-02-23 22:08:16 -06:00
										 |  |  | #include "clinic/posixshmem.c.h"
 | 
					
						
							| 
									
										
										
										
											2019-02-01 22:52:23 -06:00
										 |  |  | 
 | 
					
						
							|  |  |  | static PyMethodDef module_methods[ ] = { | 
					
						
							| 
									
										
										
										
											2019-02-23 22:08:16 -06:00
										 |  |  |     _POSIXSHMEM_SHM_OPEN_METHODDEF | 
					
						
							|  |  |  |     _POSIXSHMEM_SHM_UNLINK_METHODDEF | 
					
						
							| 
									
										
										
										
											2019-02-01 22:52:23 -06:00
										 |  |  |     {NULL} /* Sentinel */ | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static struct PyModuleDef this_module = { | 
					
						
							|  |  |  |     PyModuleDef_HEAD_INIT,  // m_base
 | 
					
						
							|  |  |  |     "_posixshmem",          // m_name
 | 
					
						
							|  |  |  |     "POSIX shared memory module",     // m_doc
 | 
					
						
							|  |  |  |     -1,                     // m_size (space allocated for module globals)
 | 
					
						
							|  |  |  |     module_methods,         // m_methods
 | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* Module init function */ | 
					
						
							|  |  |  | PyMODINIT_FUNC | 
					
						
							|  |  |  | PyInit__posixshmem(void) { | 
					
						
							|  |  |  |     PyObject *module; | 
					
						
							|  |  |  |     module = PyModule_Create(&this_module); | 
					
						
							| 
									
										
										
										
											2019-02-23 22:08:16 -06:00
										 |  |  |     if (!module) { | 
					
						
							|  |  |  |         return NULL; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2019-02-01 22:52:23 -06:00
										 |  |  |     return module; | 
					
						
							|  |  |  | } |