[Python-checkins] r42429 - python/trunk/Modules/mmapmodule.c

tim.peters python-checkins at python.org
Fri Feb 17 00:46:02 CET 2006


Author: tim.peters
Date: Fri Feb 17 00:46:01 2006
New Revision: 42429

Modified:
   python/trunk/Modules/mmapmodule.c
Log:
new_mmap_object(), Windows flavor.

On a box where sizeof(size_t) == 4, C doesn't define
what happens when a size_t value is shifted right by
32 bits, and this caused test_mmap to fail on Windows
in a debug build.  So use different code to break
the size apart depending on how large size_t actually
is.

This looks like an illusion, since lots of code in this
module still appears to assume sizes can't be more
than 32 bits (e.g., the internal _GetMapSize() still
returns an int), but at least test_mmap passes again.


Modified: python/trunk/Modules/mmapmodule.c
==============================================================================
--- python/trunk/Modules/mmapmodule.c	(original)
+++ python/trunk/Modules/mmapmodule.c	Fri Feb 17 00:46:01 2006
@@ -980,6 +980,8 @@
 	mmap_object *m_obj;
 	PyObject *map_size_obj = NULL;
 	int map_size;
+	DWORD size_hi;	/* upper 32 bits of m_obj->size */
+	DWORD size_lo;	/* lower 32 bits of m_obj->size */
 	char *tagname = "";
 	DWORD dwErr = 0;
 	int fileno;
@@ -1089,11 +1091,23 @@
 		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 then 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)(m_obj->size >> 32);
+	size_lo = (DWORD)(m_obj->size & 0xFFFFFFFF);
+#else
+	size_hi = 0;
+	size_lo = (DWORD)m_obj->size;
+#endif
 	m_obj->map_handle = CreateFileMapping (m_obj->file_handle,
 					       NULL,
 					       flProtect,
-					       (DWORD)(m_obj->size >> 32),
-					       (DWORD)(m_obj->size & 0xFFFFFFFF),
+					       size_hi,
+					       size_lo,
 					       m_obj->tagname);
 	if (m_obj->map_handle != NULL) {
 		m_obj->data = (char *) MapViewOfFile (m_obj->map_handle,


More information about the Python-checkins mailing list