[Python-checkins] r69973 - sandbox/trunk/mmap/Modules/mmapmodule.c

hirokazu.yamamoto python-checkins at python.org
Wed Feb 25 20:24:37 CET 2009


Author: hirokazu.yamamoto
Date: Wed Feb 25 20:24:37 2009
New Revision: 69973

Log:
Refactored code by using ULARGE_INTEGER.

Modified:
   sandbox/trunk/mmap/Modules/mmapmodule.c

Modified: sandbox/trunk/mmap/Modules/mmapmodule.c
==============================================================================
--- sandbox/trunk/mmap/Modules/mmapmodule.c	(original)
+++ sandbox/trunk/mmap/Modules/mmapmodule.c	Wed Feb 25 20:24:37 2009
@@ -384,20 +384,18 @@
 
 #ifdef MS_WINDOWS
 	if (self->file_handle != INVALID_HANDLE_VALUE) {
-		DWORD low,high;
-		PY_LONG_LONG size;
-		low = GetFileSize(self->file_handle, &high);
-		if (low == INVALID_FILE_SIZE) {
+		ULARGE_INTEGER size;
+		size.LowPart = GetFileSize(self->file_handle, &size.HighPart);
+		if (size.LowPart == INVALID_FILE_SIZE) {
 			/* It might be that the function appears to have failed,
 			   when indeed its size equals INVALID_FILE_SIZE */
 			DWORD error = GetLastError();
 			if (error != NO_ERROR)
 				return PyErr_SetFromWindowsErr(error);
 		}
-		if (!high && low < LONG_MAX)
-			return PyInt_FromLong((long)low);
-		size = (((PY_LONG_LONG)high)<<32) + low;
-		return PyLong_FromLongLong(size);
+		if (!size.HighPart && size.LowPart < LONG_MAX)
+			return PyInt_FromLong((long)size.LowPart);
+		return PyLong_FromUnsignedLongLong(size.QuadPart);
 	} else {
 		return PyInt_FromSsize_t(self->size);
 	}
@@ -436,7 +434,7 @@
 #ifdef MS_WINDOWS
 	} else {
 		DWORD dwErrCode = 0;
-		DWORD off_hi, off_lo, newSizeLow, newSizeHigh;
+		ULARGE_INTEGER off, newSize;
 		HANDLE map_handle;
 		/* First, unmap the file view */
 		UnmapViewOfFile(self->data);
@@ -445,22 +443,13 @@
 		CloseHandle(self->map_handle);
 		self->map_handle = INVALID_HANDLE_VALUE;
 		/* Move to the desired EOF position */
-#if SIZEOF_SIZE_T > 4
-		newSizeHigh = (DWORD)((self->offset + new_size) >> 32);
-		newSizeLow = (DWORD)((self->offset + new_size) & 0xFFFFFFFF);
-		off_hi = (DWORD)(self->offset >> 32);
-		off_lo = (DWORD)(self->offset & 0xFFFFFFFF);
-#else
-		newSizeHigh = 0;
-		newSizeLow = (DWORD)(self->offset + new_size);
-		off_hi = 0;
-		off_lo = (DWORD)self->offset;
-#endif
+		newSize.QuadPart = ((ULONGLONG)self->offset) + new_size;
+		off.QuadPart = self->offset;
 		/* XXX: Is anonymous map really resizable? */
 		if (self->file_handle != INVALID_HANDLE_VALUE) {
-			DWORD copySizeHigh = newSizeHigh;
+			DWORD copySizeHigh = newSize.HighPart;
 			SetFilePointer(self->file_handle,
-				       newSizeLow, &copySizeHigh, FILE_BEGIN);
+				       newSize.LowPart, &copySizeHigh, FILE_BEGIN);
 			/* Change the size of the file */
 			SetEndOfFile(self->file_handle);
 		}
@@ -469,14 +458,14 @@
 			self->file_handle,
 			NULL,
 			PAGE_READWRITE,
-			newSizeHigh,
-			newSizeLow,
+			newSize.HighPart,
+			newSize.LowPart,
 			self->tagname);
 		if (map_handle != NULL) {
 			self->data = (char *) MapViewOfFile(map_handle,
 							    FILE_MAP_WRITE,
-							    off_hi,
-							    off_lo,
+							    off.HighPart,
+							    off.LowPart,
 							    new_size);
 			if (self->data != NULL) {
 				self->map_handle = map_handle;
@@ -1214,10 +1203,7 @@
 	mmap_object *m_obj;
 	PyObject *map_size_obj = NULL, *offset_obj = NULL;
 	Py_ssize_t map_size, offset;
-	DWORD off_hi;	/* upper 32 bits of offset */
-	DWORD off_lo;	/* lower 32 bits of offset */
-	DWORD size_hi;	/* upper 32 bits of size */
-	DWORD size_lo;	/* lower 32 bits of size */
+	ULARGE_INTEGER off, size;
 	char *tagname = "";
 	DWORD dwErr = 0;
 	int fileno;
@@ -1306,24 +1292,25 @@
 			return NULL;
 		}
 		if (!map_size) {
-			DWORD low,high;
-			low = GetFileSize(fh, &high);
+			ULARGE_INTEGER size;
+			size.LowPart = GetFileSize(fh, &size.HighPart);
 			/* low might just happen to have the value INVALID_FILE_SIZE;
     			   so we need to check the last error also. */
-			if (low == INVALID_FILE_SIZE &&
+			if (size.LowPart == INVALID_FILE_SIZE &&
 			    (dwErr = GetLastError()) != NO_ERROR) {
 				Py_DECREF(m_obj);
 				return PyErr_SetFromWindowsErr(dwErr);
-			}	
-				    
-#if SIZEOF_SIZE_T > 4
-			m_obj->size = (((size_t)high)<<32) + low;
+			}
+
+#if SIZEOF_SIZE_T >= SIZEOF_LONG_LONG
+			m_obj->size = size.QuadPart;
 #else
-			if (high)
+			if (size.QuadPart > (ULONGLONG)(size_t)-1)
 				/* File is too large to map completely */
+				/* XXX: shouldn't raise error? */
 				m_obj->size = (size_t)-1;
 			else
-				m_obj->size = low;
+				m_obj->size = Py_SAFE_DOWNCAST(size.QuadPart, ULONGLONG, size_t);
 #endif
 		} else {
 			m_obj->size = map_size;
@@ -1350,35 +1337,22 @@
 		m_obj->tagname = NULL;
 
 	m_obj->access = (access_mode)access;
-	/* DWORD is a 4-byte int.  If we're on a box where size_t consumes
-	 * more than 4 bytes, we need to break it apart.  Else (size_t
-	 * consumes 4 bytes), C doesn't define what happens if we shift
-	 * right by 32, so we need different code.
-	 */
-#if SIZEOF_SIZE_T > 4
-	size_hi = (DWORD)((offset + m_obj->size) >> 32);
-	size_lo = (DWORD)((offset + m_obj->size) & 0xFFFFFFFF);
-	off_hi = (DWORD)(offset >> 32);
-	off_lo = (DWORD)(offset & 0xFFFFFFFF);
-#else
-	size_hi = 0;
-	size_lo = (DWORD)(offset + m_obj->size);
-	off_hi = 0;
-	off_lo = (DWORD)offset;
-#endif
+
+	size.QuadPart = ((ULONGLONG)offset) + m_obj->size;
+	off.QuadPart = offset;
 	/* For files, it would be sufficient to pass 0 as size.
 	   For anonymous maps, we have to pass the size explicitly. */
 	map_handle = CreateFileMapping(m_obj->file_handle,
 				       NULL,
 				       flProtect,
-				       size_hi,
-				       size_lo,
+				       size.HighPart,
+				       size.LowPart,
 				       m_obj->tagname);
 	if (map_handle != NULL) {
 		m_obj->data = (char *) MapViewOfFile(map_handle,
 						     dwDesiredAccess,
-						     off_hi,
-						     off_lo,
+						     off.HighPart,
+						     off.LowPart,
 						     m_obj->size);
 		if (m_obj->data != NULL) {
 			m_obj->map_handle = map_handle;


More information about the Python-checkins mailing list