[Python-checkins] CVS: python/dist/src/Modules mmapmodule.c,2.20,2.21
Mark Hammond
python-dev@python.org
Sat, 29 Jul 2000 19:22:46 -0700
Update of /cvsroot/python/python/dist/src/Modules
In directory slayer.i.sourceforge.net:/tmp/cvs-serv4507
Modified Files:
mmapmodule.c
Log Message:
Fixes for Windows (but also tested on Linux). Test suite now completes, and this module should not leak in the face of errors.
Checkin that replaces the INT_PTR types with HANDLEs still TBD (but as that is a "spelling" patch, rather than a functional one, I will commit it seperately.
Index: mmapmodule.c
===================================================================
RCS file: /cvsroot/python/python/dist/src/Modules/mmapmodule.c,v
retrieving revision 2.20
retrieving revision 2.21
diff -C2 -r2.20 -r2.21
*** mmapmodule.c 2000/07/16 12:04:31 2.20
--- mmapmodule.c 2000/07/30 02:22:43 2.21
***************
*** 62,68 ****
{
#ifdef MS_WIN32
! UnmapViewOfFile (m_obj->data);
! CloseHandle (m_obj->map_handle);
! CloseHandle ((HANDLE)m_obj->file_handle);
#endif /* MS_WIN32 */
--- 62,73 ----
{
#ifdef MS_WIN32
! if (m_obj->data != NULL)
! UnmapViewOfFile (m_obj->data);
! if (m_obj->map_handle != INVALID_HANDLE_VALUE)
! CloseHandle (m_obj->map_handle);
! if ((HANDLE)m_obj->file_handle != INVALID_HANDLE_VALUE)
! CloseHandle ((HANDLE)m_obj->file_handle);
! if (m_obj->tagname)
! PyMem_Free(m_obj->tagname);
#endif /* MS_WIN32 */
***************
*** 827,833 ****
m_obj = PyObject_New (mmap_object, &mmap_object_type);
!
if (fh) {
! m_obj->file_handle = fh;
if (!map_size) {
m_obj->size = GetFileSize ((HANDLE)fh, NULL);
--- 832,860 ----
m_obj = PyObject_New (mmap_object, &mmap_object_type);
! if (m_obj==NULL)
! return NULL;
! /* Set every field to an invalid marker, so we can safely
! destruct the object in the face of failure */
! m_obj->data = NULL;
! m_obj->file_handle = (INT_PTR)INVALID_HANDLE_VALUE;
! m_obj->map_handle = INVALID_HANDLE_VALUE;
! m_obj->tagname = NULL;
!
if (fh) {
! /* It is necessary to duplicate the handle, so the
! Python code can close it on us */
! if (!DuplicateHandle(
! GetCurrentProcess(), /* source process handle */
! (HANDLE)fh, /* handle to be duplicated */
! GetCurrentProcess(), /* target proc handle */
! (LPHANDLE)&m_obj->file_handle, /* result */
! 0, /* access - ignored due to options value */
! FALSE, /* inherited by child processes? */
! DUPLICATE_SAME_ACCESS)) { /* options */
! dwErr = GetLastError();
! Py_DECREF(m_obj);
! PyErr_SetFromWindowsErr(dwErr);
! return NULL;
! }
if (!map_size) {
m_obj->size = GetFileSize ((HANDLE)fh, NULL);
***************
*** 837,841 ****
}
else {
- m_obj->file_handle = (INT_PTR) -1;
m_obj->size = map_size;
}
--- 864,867 ----
***************
*** 844,847 ****
--- 870,886 ----
m_obj->pos = (size_t) 0;
+ /* set the tag name */
+ if (tagname != NULL) {
+ m_obj->tagname = PyMem_Malloc(strlen(tagname)+1);
+ if (m_obj->tagname == NULL) {
+ PyErr_NoMemory();
+ Py_DECREF(m_obj);
+ return NULL;
+ }
+ strcpy(m_obj->tagname, tagname);
+ }
+ else
+ m_obj->tagname = NULL;
+
m_obj->map_handle = CreateFileMapping ((HANDLE) m_obj->file_handle,
NULL,
***************
*** 864,867 ****
--- 903,907 ----
dwErr = GetLastError();
}
+ Py_DECREF(m_obj);
PyErr_SetFromWindowsErr(dwErr);
return (NULL);