[pypy-svn] r47517 - in pypy/dist/pypy: module/mmap rlib rlib/test

fijal at codespeak.net fijal at codespeak.net
Wed Oct 17 18:33:03 CEST 2007


Author: fijal
Date: Wed Oct 17 18:33:02 2007
New Revision: 47517

Modified:
   pypy/dist/pypy/module/mmap/interp_mmap.py
   pypy/dist/pypy/rlib/rmmap.py
   pypy/dist/pypy/rlib/test/test_rmmap.py
Log:
* Move REnvironmentError -> OSError
* A test for paranoid
* Add implicit close


Modified: pypy/dist/pypy/module/mmap/interp_mmap.py
==============================================================================
--- pypy/dist/pypy/module/mmap/interp_mmap.py	(original)
+++ pypy/dist/pypy/module/mmap/interp_mmap.py	Wed Oct 17 18:33:02 2007
@@ -1,11 +1,11 @@
 from pypy.rpython.tool import rffi_platform
 from pypy.rpython.lltypesystem import rffi, lltype, llmemory
-from pypy.interpreter.error import OperationError
+from pypy.interpreter.error import OperationError, wrap_oserror
 from pypy.interpreter.baseobjspace import W_Root, ObjSpace, Wrappable
 from pypy.interpreter.typedef import TypeDef
 from pypy.interpreter.gateway import interp2app
 from pypy.rlib import rmmap
-from pypy.rlib.rmmap import RValueError, RTypeError, REnvironmentError
+from pypy.rlib.rmmap import RValueError, RTypeError
 import sys
 import os
 import platform
@@ -212,8 +212,8 @@
         try:
             return space.wrap(W_MMap(space, rmmap.mmap(fileno, length,
                                                        flags, prot, access)))
-        except REnvironmentError, e:
-            raise OperationError(space.w_EnvironmentError, space.wrap(e.message))
+        except OSError, e:
+            raise wrap_oserror(space, e, 'w_EnvironmentError')
         except RValueError, e:
             raise OperationError(space.w_ValueError, space.wrap(e.message))
         except RTypeError, e:
@@ -226,8 +226,8 @@
         try:
             return space.wrap(W_MMap(space, rmmap.mmap(fileno, length,
                                                        tagname, access)))
-        except REnvironmentError, e:
-            raise OperationError(space.w_EnvironmentError, space.wrap(e.message))
+        except OSError, e:
+            raise wrap_oserror(space, e, 'w_EnvironmentError')
         except RValueError, e:
             raise OperationError(space.w_ValueError, space.wrap(e.message))
         except RTypeError, e:

Modified: pypy/dist/pypy/rlib/rmmap.py
==============================================================================
--- pypy/dist/pypy/rlib/rmmap.py	(original)
+++ pypy/dist/pypy/rlib/rmmap.py	Wed Oct 17 18:33:02 2007
@@ -16,10 +16,6 @@
     def __init__(self, message):
         self.message = message
 
-class REnvironmentError(Exception):
-    def __init__(self, message):
-        self.message = message
-
 class RTypeError(Exception):
     def __init__(self, message):
         self.message = message    
@@ -114,9 +110,8 @@
 
     _get_page_size = external('getpagesize', [], rffi.INT)
 
-    def _get_error_msg():
-        errno = rffi.get_errno()
-        return os.strerror(errno)
+    def _get_error_no():
+        return rffi.get_errno()
 
 elif _MS_WINDOWS:
 
@@ -207,14 +202,14 @@
             dwErr = GetLastError()
             err = rffi.cast(lltype.Signed, dwErr)
             if low == INVALID_FILE_SIZE and err != NO_ERROR:
-                raise REnvironmentError(os.strerror(err))
+                msg = os.strerror(err)
+                raise OSError(err, msg)
             return low, high
         finally:
             lltype.free(high_ref, flavor='raw')
 
-    def _get_error_msg():
-        errno = rffi.cast(lltype.Signed, GetLastError())
-        return os.strerror(errno)
+    def _get_error_no():
+        return rffi.cast(lltype.Signed, GetLastError())
 
     NULL_HANDLE = rffi.cast(HANDLE, 0)
     INVALID_HANDLE = rffi.cast(HANDLE, -1)
@@ -280,6 +275,8 @@
                 c_munmap(self.getptr(0), self.size)
                 self.setdata(NODATA, 0)
 
+    __del__ = close
+
     def unmapview(self):
         UnmapViewOfFile(self.getptr(0))
     
@@ -439,7 +436,8 @@
 ##                    new_size = size + value & (PAGESIZE - 1)
                 res = c_msync(start, size, MS_SYNC)
                 if res == -1:
-                    raise REnvironmentError(_get_error_msg())
+                    errno = _get_error_no()
+                    raise OSError(errno, os.strerror(errno))
         
         return 0
     
@@ -464,14 +462,10 @@
         
         if _POSIX:
             if not has_mremap:
-                msg = "mmap: resizing not available -- no mremap()"
-                raise REnvironmentError(msg)
+                raise OSError(-11111, "No mremap available")
             
             # resize the underlying file first
-            try:
-                os.ftruncate(self.fd, newsize)
-            except OSError, e:
-                raise REnvironmentError(os.strerror(e.errno))
+            os.ftruncate(self.fd, newsize)
                 
             # now resize the mmap
             newdata = c_mremap(self.getptr(0), self.size, newsize,
@@ -519,7 +513,7 @@
             else:
                 dwErrCode = GetLastError()
             err = rffi.cast(lltype.Signed, dwErrCode)
-            raise REnvironmentError(os.strerror(err))
+            raise OSError(err, os.strerror(err))
     
     def len(self):
         self.check_valid()
@@ -607,14 +601,12 @@
             flags |= MAP_ANONYMOUS
 
         else:
-            try:
-                m.fd = os.dup(fd)
-            except OSError, e:
-                raise REnvironmentError(os.strerror(e.errno))
+            m.fd = os.dup(fd)
 
         res = c_mmap(NULL, map_size, prot, flags, fd, 0)
         if res == rffi.cast(PTR, -1):
-            raise REnvironmentError(_get_error_msg())
+            errno = _get_error_no()
+            raise OSError(errno, os.strerror(errno))
         
         m.setdata(res, map_size)
         return m
@@ -647,7 +639,8 @@
             # parts of the C library use HANDLE, others just ints
             # XXX hack - made _get_osfhandle compatible
             if fh == INVALID_HANDLE:
-                raise REnvironmentError(_get_error_msg())
+                errno = _get_error_no()
+                raise OSError(errno, os.strerror(errno))
             # Win9x appears to need us seeked to zero
             # SEEK_SET = 0
             # libc._lseek(fileno, 0, SEEK_SET)
@@ -669,7 +662,8 @@
                                       False, # inherited by child procs?
                                       DUPLICATE_SAME_ACCESS) # options
                 if not res:
-                    raise REnvironmentError(_get_error_msg())
+                    errno = _get_error_no()
+                    raise OSError(errno, os.strerror(errno))
                 m.file_handle = handle_ref[0]
             finally:
                 lltype.free(handle_ref, flavor='raw')
@@ -712,7 +706,7 @@
         else:
             dwErr = GetLastError()
         err = rffi.cast(lltype.Signed, dwErr)
-        raise REnvironmentError(os.strerror(err))
+        raise OSError(err, os.strerror(err))
 
         
 # register_external here?

Modified: pypy/dist/pypy/rlib/test/test_rmmap.py
==============================================================================
--- pypy/dist/pypy/rlib/test/test_rmmap.py	(original)
+++ pypy/dist/pypy/rlib/test/test_rmmap.py	Wed Oct 17 18:33:02 2007
@@ -2,7 +2,7 @@
 import os
 from pypy.rpython.test.test_llinterp import interpret
 from pypy.rlib import rmmap as mmap
-from pypy.rlib.rmmap import RTypeError, RValueError, REnvironmentError
+from pypy.rlib.rmmap import RTypeError, RValueError
 import sys
 
 class TestMMap:
@@ -358,3 +358,16 @@
 
         interpret(func, [f.fileno()])
         f.close()
+
+    def test_double_close(self):
+        f = open(self.tmpname + "s", "w+")
+        f.write("foobar")
+        f.flush()
+
+        def func(no):
+            m = mmap.mmap(no, 6, access=mmap.ACCESS_WRITE)
+            m.close()
+            m.close() # didn't explode
+
+        interpret(func, [f.fileno()])
+        f.close()



More information about the Pypy-commit mailing list