mirror of
				https://github.com/python/cpython.git
				synced 2025-10-30 21:21:22 +00:00 
			
		
		
		
	 e895de3e7f
			
		
	
	
		e895de3e7f
		
			
		
	
	
	
	
		
			
			* Added tests for shared_memory submodule. * Added tests for ShareableList. * Fix bug in allocationn size during creation of empty ShareableList illuminated by existing test run on Linux. * Initial set of docs for shared_memory module. * Added docs for ShareableList, added doctree entry for shared_memory submodule, name refactoring for greater clarity. * Added examples to SharedMemoryManager docs, for ease of documentation switched away from exclusively registered functions to some explicit methods on SharedMemoryManager. * Wording tweaks to docs. * Fix test failures on Windows. * Added tests around SharedMemoryManager. * Documentation tweaks. * Fix inappropriate test on Windows. * Further documentation tweaks. * Fix bare exception. * Removed __copyright__. * Fixed typo in doc, removed comment. * Updated SharedMemoryManager preliminary tests to reflect change of not supporting all registered functions on SyncManager. * Added Sphinx doctest run controls. * CloseHandle should be in a finally block in case MapViewOfFile fails. * Missed opportunity to use with statement. * Switch to self.addCleanup to spare long try/finally blocks and save one indentation, change to use decorator to skip test instead. * Simplify the posixshmem extension module. Provide shm_open() and shm_unlink() functions. Move other functionality into the shared_memory.py module. * Added to doc around size parameter of SharedMemory. * Changed PosixSharedMemory.size to use os.fstat. * Change SharedMemory.buf to a read-only property as well as NamedSharedMemory.size. * Marked as provisional per PEP411 in docstring. * Changed SharedMemoryTracker to be private. * Removed registered Proxy Objects from SharedMemoryManager. * Removed shareable_wrap(). * Removed shareable_wrap() and dangling references to it. * For consistency added __reduce__ to key classes. * Fix for potential race condition on Windows for O_CREX. * Remove unused imports. * Update access to kernel32 on Windows per feedback from eryksun. * Moved kernel32 calls to _winapi. * Removed ShareableList.copy as redundant. * Changes to _winapi use from eryksun feedback. * Adopt simpler SharedMemory API, collapsing PosixSharedMemory and WindowsNamedSharedMemory into one. * Fix missing docstring on class, add test for ignoring size when attaching. * Moved SharedMemoryManager to managers module, tweak to fragile test. * Tweak to exception in OpenFileMapping suggested by eryksun. * Mark a few dangling bits as private as suggested by Giampaolo.
		
			
				
	
	
		
			131 lines
		
	
	
	
		
			3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			131 lines
		
	
	
	
		
			3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /*
 | |
| posixshmem - A Python extension that provides shm_open() and shm_unlink()
 | |
| */
 | |
| 
 | |
| #define PY_SSIZE_T_CLEAN
 | |
| 
 | |
| #include <Python.h>
 | |
| #include "structmember.h"
 | |
| 
 | |
| // for shm_open() and shm_unlink()
 | |
| #ifdef HAVE_SYS_MMAN_H
 | |
| #include <sys/mman.h>
 | |
| #endif
 | |
| 
 | |
| /*[clinic input]
 | |
| module _posixshmem
 | |
| [clinic start generated code]*/
 | |
| /*[clinic end generated code: output=da39a3ee5e6b4b0d input=a416734e49164bf8]*/
 | |
| 
 | |
| /*
 | |
|  *
 | |
|  * Module-level functions & meta stuff
 | |
|  *
 | |
|  */
 | |
| 
 | |
| #ifdef HAVE_SHM_OPEN
 | |
| /*[clinic input]
 | |
| _posixshmem.shm_open -> int
 | |
|     path: unicode
 | |
|     flags: int
 | |
|     mode: int = 0o777
 | |
| 
 | |
| # "shm_open(path, flags, mode=0o777)\n\n\
 | |
| 
 | |
| Open a shared memory object.  Returns a file descriptor (integer).
 | |
| 
 | |
| [clinic start generated code]*/
 | |
| 
 | |
| static int
 | |
| _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;
 | |
|     }
 | |
|     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;
 | |
|     }
 | |
| 
 | |
|     return fd;
 | |
| }
 | |
| #endif /* HAVE_SHM_OPEN */
 | |
| 
 | |
| #ifdef HAVE_SHM_UNLINK
 | |
| /*[clinic input]
 | |
| _posixshmem.shm_unlink
 | |
|     path: unicode
 | |
| 
 | |
| Remove a shared memory object (similar to unlink()).
 | |
| 
 | |
| 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.
 | |
| 
 | |
| [clinic start generated code]*/
 | |
| 
 | |
| static PyObject *
 | |
| _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;
 | |
|     }
 | |
|     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;
 | |
|     }
 | |
| 
 | |
|     Py_RETURN_NONE;
 | |
| }
 | |
| #endif /* HAVE_SHM_UNLINK */
 | |
| 
 | |
| #include "clinic/posixshmem.c.h"
 | |
| 
 | |
| static PyMethodDef module_methods[ ] = {
 | |
|     _POSIXSHMEM_SHM_OPEN_METHODDEF
 | |
|     _POSIXSHMEM_SHM_UNLINK_METHODDEF
 | |
|     {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);
 | |
|     if (!module) {
 | |
|         return NULL;
 | |
|     }
 | |
|     return module;
 | |
| }
 |