Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
W
wendelin.core
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Joshua
wendelin.core
Commits
89a69226
Commit
89a69226
authored
Jun 24, 2019
by
Kirill Smelkov
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
.
parent
ea6a66e4
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
47 additions
and
8 deletions
+47
-8
wcfs/internal/mm.pyx
wcfs/internal/mm.pyx
+25
-5
wcfs/internal/wcfs_test.pyx
wcfs/internal/wcfs_test.pyx
+13
-0
wcfs/wcfs_test.py
wcfs/wcfs_test.py
+9
-3
No files found.
wcfs/internal/mm.pyx
View file @
89a69226
...
...
@@ -40,6 +40,12 @@ cpdef enum:
MADV_SEQUENTIAL
=
mman
.
MADV_SEQUENTIAL
MADV_WILLNEED
=
mman
.
MADV_WILLNEED
MADV_DONTNEED
=
mman
.
MADV_DONTNEED
MADV_FREE
=
mman
.
MADV_FREE
MADV_REMOVE
=
mman
.
MADV_REMOVE
MS_ASYNC
=
mman
.
MS_ASYNC
MS_SYNC
=
mman
.
MS_SYNC
MS_INVALIDATE
=
mman
.
MS_INVALIDATE
# incore returns bytearray vector indicating whether page of mem is in core or not.
#
...
...
@@ -78,7 +84,7 @@ def lock(const unsigned char[::1] mem not None, int flags):
if
err
:
PyErr_SetFromErrno
(
OSError
)
return
# ok
return
# unlock unlocks mem pages from being pinned in RAM.
...
...
@@ -90,7 +96,7 @@ def unlock(const unsigned char[::1] mem not None):
if
err
:
PyErr_SetFromErrno
(
OSError
)
return
# ok
return
from
posix.types
cimport
off_t
...
...
@@ -114,7 +120,7 @@ def map_into_ro(unsigned char[::1] mem not None, int fd, off_t offset):
if
addr
==
mman
.
MAP_FAILED
:
PyErr_SetFromErrno
(
OSError
)
return
# ok
return
# unmap unmaps memory covered by mem.
def
unmap
(
const
unsigned
char
[::
1
]
mem
not
None
):
...
...
@@ -125,7 +131,7 @@ def unmap(const unsigned char[::1] mem not None):
if
err
:
PyErr_SetFromErrno
(
OSError
)
return
# ok
return
# advise advises kernel about use of mem's memory.
...
...
@@ -139,4 +145,18 @@ def advise(const unsigned char[::1] mem not None, int advice):
if
err
:
PyErr_SetFromErrno
(
OSError
)
return
# ok
return
# sync asks the kernel to synchronize the file with a memory map.
#
# see msync(2) for details.
def
sync
(
const
unsigned
char
[::
1
]
mem
not
None
,
int
flags
):
cdef
const
void
*
addr
=
&
mem
[
0
]
cdef
size_t
size
=
mem
.
shape
[
0
]
cdef
err
=
mman
.
msync
(
<
void
*>
addr
,
size
,
flags
)
if
err
:
PyErr_SetFromErrno
(
OSError
)
return
wcfs/internal/wcfs_test.pyx
View file @
89a69226
...
...
@@ -26,6 +26,7 @@ from libc.signal cimport SIGBUS
from
libc.stdlib
cimport
abort
from
libc.string
cimport
strlen
from
posix.unistd
cimport
write
,
sleep
from
posix.types
cimport
off_t
from
cpython.exc
cimport
PyErr_SetFromErrno
from
cpython.pystate
cimport
PyGILState_Ensure
,
PyGILState_Release
,
PyGILState_STATE
...
...
@@ -43,6 +44,18 @@ def read_nogil(const unsigned char[::1] mem not None) -> bytes:
return
bytes
(
bytearray
([
b
]))
cdef
extern
from
"<fcntl.h>"
nogil
:
int
posix_fadvise
(
int
fd
,
off_t
offset
,
off_t
len
,
int
advice
);
enum
:
POSIX_FADV_DONTNEED
# fadvise_dontneed teels the kernel that file<fd>[offset +len) is not needed.
#
# see fadvise(2) for details.
def
fadvise_dontneed
(
int
fd
,
off_t
offset
,
off_t
len
):
cdef
int
err
=
posix_fadvise
(
fd
,
offset
,
len
,
POSIX_FADV_DONTNEED
)
if
err
:
PyErr_SetFromErrno
(
OSError
)
# ---- signal handling ----
# XXX -> golang.signal ?
...
...
wcfs/wcfs_test.py
View file @
89a69226
...
...
@@ -42,7 +42,7 @@ from zodbtools.util import ashex as h, fromhex
from
pytest
import
raises
from
six
import
reraise
from
.internal
import
mm
from
.internal.wcfs_test
import
read_nogil
,
install_sigbus_trap
from
.internal.wcfs_test
import
read_nogil
,
install_sigbus_trap
,
fadvise_dontneed
# setup:
# - create test database, compute zurl and mountpoint for wcfs
...
...
@@ -1553,11 +1553,17 @@ def test_wcfs_no_pin_twice():
assert
w
.
pinned
==
{
2
:
at1
}
# drop file[blk] from cache, access again -> no pin message sent the second time
print
(
'
\
n
\
n
\
n
\
n
\
n
ABCDEF
\
n
\
n
\
n
'
)
#
# ( we need both madvise(DONTNEED) and fadvise(DONTNEED) - given only one of
# those the kernel won't release the page from pagecache; madvise does
# not work without munlock. )
mm
.
unlock
(
f
.
_blk
(
2
))
mm
.
advise
(
f
.
_blk
(
2
),
mm
.
MADV_DONTNEED
)
fadvise_dontneed
(
f
.
f
.
fileno
(),
2
*
blksize
,
1
*
blksize
)
f
.
assertCache
([
0
,
0
,
0
])
# XXX
f
.
assertBlk
(
2
,
'c2'
,
{
wl
:
{}})
f
.
assertCache
([
0
,
0
,
1
])
# verify watching for 2 files over single watch link.
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment