[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);