Commit 6676a354 authored by Kirill Smelkov's avatar Kirill Smelkov

.

parent 4fca6260
......@@ -146,7 +146,7 @@ def _pinner(wconn, ctx):
continue # blk ∉ mmap
# FIXME check if virtmem did not mapped RW page into this block already
mmap._mmapblk(req.blk, req.at)
mmap._remmapblk(req.blk, req.at)
# update f.pinned
if req.at is None:
......@@ -155,24 +155,6 @@ def _pinner(wconn, ctx):
f.pinned[req.blk] = req.at
# _mmapblk remmaps mapping memory for file[blk] to be viewing database as of @at state.
#
# at=None means unpin to head/ .
# NOTE this does not check wrt virtmem already mapped blk as RW XXX ok?
@func(_Mapping)
def _mmapblk(mmap, blk, at):
assert mmap.blk_start <= blk < mmap.blk_stop
f = mmap.file
if at is None:
fsfile = f.headf
else:
# TODO share @rev fd until wconn is resynced?
fsfile = f.wconn._wc._open("@%s/%s" % (ashex(at), ashex(f.foid)), "rb")
defer(fsfile.close)
mm.mmap_into_ro(mmap.mem[(blk-mmap.blk_start)*blksize:][:blksize], fsfile.fileno(), blk*blksize)
# mmap creates file mapping representing file data as of wconn.at database state.
@func(Conn)
def mmap(wconn, foid, offset, size): # -> Mapping XXX offset, size -> blkoff, blksize ?
......@@ -191,20 +173,39 @@ def mmap(wconn, foid, offset, size): # -> Mapping XXX offset, size -> blko
for blk, rev in f.pinned.items(): # XXX keep f.pinned ↑blk and use binary search?
if not (blk_start <= blk && blk < blk_stop):
continue # blk out of this mapping
mmap._mmapblk(blk, rev)
mmap._remmapblk(blk, rev)
f.mmaps.append(mmap) # XXX keep f.mmaps ↑blk_start
return mmap
# remmap_blk remmapfs file[blk] in its place again.
# _remmapblk remmaps mapping memory for file[blk] to be viewing database as of @at state.
#
# at=None means unpin to head/ .
# NOTE this does not check wrt virtmem already mapped blk as RW XXX ok?
@func(_Mapping)
def _remmapblk(mmap, blk, at):
assert mmap.blk_start <= blk < mmap.blk_stop
f = mmap.file
if at is None:
fsfile = f.headf
else:
# TODO share @rev fd until wconn is resynced?
fsfile = f.wconn._wc._open("@%s/%s" % (ashex(at), ashex(f.foid)), "rb")
defer(fsfile.close)
mm.mmap_into_ro(mmap.mem[(blk-mmap.blk_start)*blksize:][:blksize], fsfile.fileno(), blk*blksize)
# remmap_blk remmaps file[blk] in its place again.
# virtmem calls this to remmap a block after RW dirty page was e.g. discarded.
@func(_Mapping)
def remmap_blk(mmap, blk):
# XXX locking
assert (mmap.blk_start <= blk < mmap.blk_stop)
blkrev = mmap.pinned.get(blk, None) # rev | @head
mmap._mmapblk(blk, blkrev)
mmap._remmapblk(blk, blkrev)
# unmap is removes mapping memory from address space.
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment