[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, ©SizeHigh, FILE_BEGIN);
+ newSize.LowPart, ©SizeHigh, 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