[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