summaryrefslogtreecommitdiff
path: root/smmap/mman.py
diff options
context:
space:
mode:
Diffstat (limited to 'smmap/mman.py')
-rw-r--r--smmap/mman.py20
1 files changed, 15 insertions, 5 deletions
diff --git a/smmap/mman.py b/smmap/mman.py
index c5a3887..27904f5 100644
--- a/smmap/mman.py
+++ b/smmap/mman.py
@@ -7,6 +7,7 @@ import sys
import mmap
from mmap import PAGESIZE
+from sys import getrefcount
#{ Utilities
@@ -71,7 +72,6 @@ class MappedRegion(object):
__slots__ = [
'_b' , # beginning of mapping
'_mf', # mapped memory chunk (as returned by mmap)
- '_nc', # number of clients using this region
'_uc', # total amount of usages
'_ms' # actual size of the mapping
]
@@ -90,24 +90,24 @@ class MappedRegion(object):
allocated the the size automatically adjusted
:raise Exception: if no memory can be allocated"""
self._b = ofs
- self._nc = 0
self._uc = 0
fd = os.open(path, os.O_RDONLY|getattr(os, 'O_BINARY', 0))
try:
kwargs = dict(access=mmap.ACCESS_READ, offset=ofs)
corrected_size = size
+ sizeofs = ofs
if self._need_compat_layer:
del(kwargs['offset'])
corrected_size += ofs
+ sizeofs = 0
# END handle python not supporting offset ! Arg
# have to correct size, otherwise (instead of the c version) it will
# bark that the size is too large ... many extra file accesses because
# if this ... argh !
- self._mf = mmap.mmap(fd, min(os.fstat(fd).st_size, corrected_size), **kwargs)
+ self._mf = mmap.mmap(fd, min(os.fstat(fd).st_size - sizeofs, corrected_size - sizeofs), **kwargs)
- print len(self._mf)
if self._need_compat_layer:
self._mfb = buffer(self._mf, ofs, size)
#END handle buffer wrapping
@@ -133,7 +133,8 @@ class MappedRegion(object):
def client_count(self):
""":return: number of clients currently using this region"""
- return self._nc
+ # -1: self on stack, -1 self in this method, -1 self in getrefcount
+ return getrefcount(self)-3
def adjust_client_count(self, ofs):
"""Adjust the client count by the given positive or negative offset"""
@@ -157,6 +158,15 @@ class MappedRegion(object):
#END handle compat layer
+class Cursor(object):
+ """Pointer into the mapped region of the memory manager, keeping the current window
+ alive until it is destroyed"""
+
+
+class MappedRegionList(list):
+ """List of MappedRegion instances with specific functionality"""
+
+
class MappedMemoryManager(object):
"""Maintains a list of ranges of mapped memory regions in one or more files and allows to easily
obtain additional regions assuring there is no overlap.