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
Labels
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Commits
Open sidebar
Kirill Smelkov
wendelin.core
Commits
8d15be09
Commit
8d15be09
authored
Dec 17, 2019
by
Kirill Smelkov
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
.
parent
f443ae81
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
72 additions
and
57 deletions
+72
-57
bigfile/_bigfile.c
bigfile/_bigfile.c
+65
-51
bigfile/_bigfile.h
bigfile/_bigfile.h
+6
-6
bigfile/file_zodb.cpp
bigfile/file_zodb.cpp
+1
-0
No files found.
bigfile/_bigfile.c
View file @
8d15be09
...
@@ -43,6 +43,8 @@
...
@@ -43,6 +43,8 @@
#include <wendelin/bug.h>
#include <wendelin/bug.h>
#include <wendelin/compat_py2.h>
#include <wendelin/compat_py2.h>
#include <ccan/container_of/container_of.h>
static
PyObject
*
gcmodule
;
static
PyObject
*
gcmodule
;
static
PyObject
*
pybuf_str
;
static
PyObject
*
pybuf_str
;
...
@@ -110,25 +112,27 @@ static PyObject *FUNC
...
@@ -110,25 +112,27 @@ static PyObject *FUNC
static
Py_ssize_t
static
Py_ssize_t
pyvma_getbuf
(
PyObject
*
pyvma0
,
Py_ssize_t
segment
,
void
**
pptr
)
pyvma_getbuf
(
PyObject
*
pyvma0
,
Py_ssize_t
segment
,
void
**
pptr
)
{
{
PyVMA
*
pyvma
=
upcast
(
PyVMA
*
,
pyvma0
);
PyVMA
*
pyvma
=
container_of
(
pyvma0
,
PyVMA
,
pyobj
);
VMA
*
vma
=
&
pyvma
->
vma
;
if
(
segment
)
{
if
(
segment
)
{
PyErr_SetString
(
PyExc_SystemError
,
"access to non-zero vma segment"
);
PyErr_SetString
(
PyExc_SystemError
,
"access to non-zero vma segment"
);
return
-
1
;
return
-
1
;
}
}
*
pptr
=
(
void
*
)
py
vma
->
addr_start
;
*
pptr
=
(
void
*
)
vma
->
addr_start
;
return
pyvma
->
addr_stop
-
py
vma
->
addr_start
;
return
vma
->
addr_stop
-
vma
->
addr_start
;
}
}
static
Py_ssize_t
static
Py_ssize_t
pyvma_getsegcount
(
PyObject
*
pyvma0
,
Py_ssize_t
*
lenp
)
pyvma_getsegcount
(
PyObject
*
pyvma0
,
Py_ssize_t
*
lenp
)
{
{
PyVMA
*
pyvma
=
upcast
(
PyVMA
*
,
pyvma0
);
PyVMA
*
pyvma
=
container_of
(
pyvma0
,
PyVMA
,
pyobj
);
VMA
*
vma
=
&
pyvma
->
vma
;
if
(
lenp
)
if
(
lenp
)
*
lenp
=
pyvma
->
addr_stop
-
py
vma
->
addr_start
;
*
lenp
=
vma
->
addr_stop
-
vma
->
addr_start
;
return
1
;
return
1
;
}
}
#endif
#endif
...
@@ -137,10 +141,11 @@ pyvma_getsegcount(PyObject *pyvma0, Py_ssize_t *lenp)
...
@@ -137,10 +141,11 @@ pyvma_getsegcount(PyObject *pyvma0, Py_ssize_t *lenp)
static
int
static
int
pyvma_getbuffer
(
PyObject
*
pyvma0
,
Py_buffer
*
view
,
int
flags
)
pyvma_getbuffer
(
PyObject
*
pyvma0
,
Py_buffer
*
view
,
int
flags
)
{
{
PyVMA
*
pyvma
=
upcast
(
PyVMA
*
,
pyvma0
);
PyVMA
*
pyvma
=
container_of
(
pyvma0
,
PyVMA
,
pyobj
);
VMA
*
vma
=
&
pyvma
->
vma
;
return
PyBuffer_FillInfo
(
view
,
pyvma
,
return
PyBuffer_FillInfo
(
view
,
&
pyvma
->
pyobj
,
(
void
*
)
pyvma
->
addr_start
,
pyvma
->
addr_stop
-
py
vma
->
addr_start
,
(
void
*
)
vma
->
addr_start
,
vma
->
addr_stop
-
vma
->
addr_start
,
/*readonly=*/
0
,
flags
);
/*readonly=*/
0
,
flags
);
}
}
...
@@ -149,9 +154,10 @@ pyvma_getbuffer(PyObject *pyvma0, Py_buffer *view, int flags)
...
@@ -149,9 +154,10 @@ pyvma_getbuffer(PyObject *pyvma0, Py_buffer *view, int flags)
static
Py_ssize_t
static
Py_ssize_t
pyvma_len
(
PyObject
*
pyvma0
)
pyvma_len
(
PyObject
*
pyvma0
)
{
{
PyVMA
*
pyvma
=
upcast
(
PyVMA
*
,
pyvma0
);
PyVMA
*
pyvma
=
container_of
(
pyvma0
,
PyVMA
,
pyobj
);
VMA
*
vma
=
&
pyvma
->
vma
;
return
pyvma
->
addr_stop
-
py
vma
->
addr_start
;
return
vma
->
addr_stop
-
vma
->
addr_start
;
}
}
...
@@ -159,7 +165,7 @@ pyvma_len(PyObject *pyvma0)
...
@@ -159,7 +165,7 @@ pyvma_len(PyObject *pyvma0)
static
int
static
int
pyvma_traverse
(
PyObject
*
pyvma0
,
visitproc
visit
,
void
*
arg
)
pyvma_traverse
(
PyObject
*
pyvma0
,
visitproc
visit
,
void
*
arg
)
{
{
PyVMA
*
pyvma
=
upcast
(
PyVMA
*
,
pyvma0
);
PyVMA
*
pyvma
=
container_of
(
pyvma0
,
PyVMA
,
pyobj
);
Py_VISIT
(
pyvma
->
pyuser
);
Py_VISIT
(
pyvma
->
pyuser
);
return
0
;
return
0
;
...
@@ -168,7 +174,7 @@ pyvma_traverse(PyObject *pyvma0, visitproc visit, void *arg)
...
@@ -168,7 +174,7 @@ pyvma_traverse(PyObject *pyvma0, visitproc visit, void *arg)
static
int
static
int
pyvma_clear
(
PyObject
*
pyvma0
)
pyvma_clear
(
PyObject
*
pyvma0
)
{
{
PyVMA
*
pyvma
=
upcast
(
PyVMA
*
,
pyvma0
);
PyVMA
*
pyvma
=
container_of
(
pyvma0
,
PyVMA
,
pyobj
);
Py_CLEAR
(
pyvma
->
pyuser
);
Py_CLEAR
(
pyvma
->
pyuser
);
return
0
;
return
0
;
...
@@ -178,11 +184,12 @@ pyvma_clear(PyObject *pyvma0)
...
@@ -178,11 +184,12 @@ pyvma_clear(PyObject *pyvma0)
PyFunc
(
pyvma_filerange
,
"filerange() -> (pgoffset, pglen) -- file range this vma covers"
)
PyFunc
(
pyvma_filerange
,
"filerange() -> (pgoffset, pglen) -- file range this vma covers"
)
(
PyObject
*
pyvma0
,
PyObject
*
args
)
(
PyObject
*
pyvma0
,
PyObject
*
args
)
{
{
PyVMA
*
pyvma
=
upcast
(
PyVMA
*
,
pyvma0
);
PyVMA
*
pyvma
=
container_of
(
pyvma0
,
PyVMA
,
pyobj
);
VMA
*
vma
=
&
pyvma
->
vma
;
Py_ssize_t
pgoffset
,
pglen
;
// XXX Py_ssize_t vs pgoff_t
Py_ssize_t
pgoffset
,
pglen
;
// XXX Py_ssize_t vs pgoff_t
pgoffset
=
py
vma
->
f_pgoffset
;
pgoffset
=
vma
->
f_pgoffset
;
pglen
=
(
pyvma
->
addr_stop
-
pyvma
->
addr_start
)
/
py
vma
->
fileh
->
ramh
->
ram
->
pagesize
;
pglen
=
(
vma
->
addr_stop
-
vma
->
addr_start
)
/
vma
->
fileh
->
ramh
->
ram
->
pagesize
;
/* NOTE ^^^ addr_stop and addr_start must be page-aligned */
/* NOTE ^^^ addr_stop and addr_start must be page-aligned */
return
Py_BuildValue
(
"(nn)"
,
pgoffset
,
pglen
);
return
Py_BuildValue
(
"(nn)"
,
pgoffset
,
pglen
);
...
@@ -192,8 +199,9 @@ PyFunc(pyvma_filerange, "filerange() -> (pgoffset, pglen) -- file range this vma
...
@@ -192,8 +199,9 @@ PyFunc(pyvma_filerange, "filerange() -> (pgoffset, pglen) -- file range this vma
PyFunc
(
pyvma_pagesize
,
"pagesize() -> pagesize -- page size of RAM underlying this VMA"
)
PyFunc
(
pyvma_pagesize
,
"pagesize() -> pagesize -- page size of RAM underlying this VMA"
)
(
PyObject
*
pyvma0
,
PyObject
*
args
)
(
PyObject
*
pyvma0
,
PyObject
*
args
)
{
{
PyVMA
*
pyvma
=
upcast
(
PyVMA
*
,
pyvma0
);
PyVMA
*
pyvma
=
container_of
(
pyvma0
,
PyVMA
,
pyobj
);
Py_ssize_t
pagesize
=
pyvma
->
fileh
->
ramh
->
ram
->
pagesize
;
VMA
*
vma
=
&
pyvma
->
vma
;
Py_ssize_t
pagesize
=
vma
->
fileh
->
ramh
->
ram
->
pagesize
;
return
Py_BuildValue
(
"n"
,
pagesize
);
return
Py_BuildValue
(
"n"
,
pagesize
);
}
}
...
@@ -209,22 +217,23 @@ pyvma_dealloc(PyObject *pyvma0)
...
@@ -209,22 +217,23 @@ pyvma_dealloc(PyObject *pyvma0)
* See https://bugs.python.org/issue31095 for details */
* See https://bugs.python.org/issue31095 for details */
PyObject_GC_UnTrack
(
pyvma0
);
PyObject_GC_UnTrack
(
pyvma0
);
PyVMA
*
pyvma
=
upcast
(
PyVMA
*
,
pyvma0
);
PyVMA
*
pyvma
=
container_of
(
pyvma0
,
PyVMA
,
pyobj
);
BigFileH
*
fileh
=
pyvma
->
fileh
;
VMA
*
vma
=
&
pyvma
->
vma
;
BigFileH
*
fileh
=
vma
->
fileh
;
if
(
pyvma
->
in_weakreflist
)
if
(
pyvma
->
in_weakreflist
)
PyObject_ClearWeakRefs
(
pyvma
);
PyObject_ClearWeakRefs
(
&
pyvma
->
pyobj
);
/* pyvma->fileh indicates whether vma was yet created (via fileh_mmap()) or not */
/* pyvma->fileh indicates whether vma was yet created (via fileh_mmap()) or not */
if
(
fileh
)
{
if
(
fileh
)
{
vma_unmap
(
py
vma
);
vma_unmap
(
vma
);
PyBigFileH
*
pyfileh
=
upcast
(
PyBigFileH
*
,
fileh
);
PyBigFileH
*
pyfileh
=
container_of
(
fileh
,
PyBigFileH
,
fileh
);
Py_DECREF
(
pyfileh
);
Py_DECREF
(
pyfileh
);
}
}
pyvma_clear
(
pyvma
);
pyvma_clear
(
&
pyvma
->
pyobj
);
pyvma
->
ob_type
->
tp_free
(
pyvma
);
pyvma
->
pyobj
.
ob_type
->
tp_free
(
&
pyvma
->
pyobj
);
}
}
...
@@ -238,7 +247,7 @@ pyvma_new(PyTypeObject *type, PyObject *args, PyObject *kw)
...
@@ -238,7 +247,7 @@ pyvma_new(PyTypeObject *type, PyObject *args, PyObject *kw)
return
NULL
;
return
NULL
;
self
->
in_weakreflist
=
NULL
;
self
->
in_weakreflist
=
NULL
;
return
self
;
return
&
self
->
pyobj
;
}
}
...
@@ -274,8 +283,8 @@ const int _ =
...
@@ -274,8 +283,8 @@ const int _ =
#define T_UINTPTR T_ULONG
#define T_UINTPTR T_ULONG
static
/*const*/
PyMemberDef
pyvma_members
[]
=
{
static
/*const*/
PyMemberDef
pyvma_members
[]
=
{
{
"addr_start"
,
T_UINTPTR
,
offsetof
(
PyVMA
,
addr_start
),
READONLY
,
"vma's start addr"
},
{
"addr_start"
,
T_UINTPTR
,
offsetof
(
PyVMA
,
vma
.
addr_start
),
READONLY
,
"vma's start addr"
},
{
"addr_stop"
,
T_UINTPTR
,
offsetof
(
PyVMA
,
addr_stop
),
READONLY
,
"vma's start addr"
},
{
"addr_stop"
,
T_UINTPTR
,
offsetof
(
PyVMA
,
vma
.
addr_stop
),
READONLY
,
"vma's start addr"
},
// XXX pyuser: restrict to read-only access?
// XXX pyuser: restrict to read-only access?
{
"pyuser"
,
T_OBJECT_EX
,
offsetof
(
PyVMA
,
pyuser
),
0
,
"user of this vma"
},
{
"pyuser"
,
T_OBJECT_EX
,
offsetof
(
PyVMA
,
pyuser
),
0
,
"user of this vma"
},
{
NULL
}
{
NULL
}
...
@@ -308,7 +317,7 @@ static PyTypeObject PyVMA_Type = {
...
@@ -308,7 +317,7 @@ static PyTypeObject PyVMA_Type = {
PyFunc
(
pyfileh_mmap
,
"mmap(pgoffset, pglen) - map fileh part into memory"
)
PyFunc
(
pyfileh_mmap
,
"mmap(pgoffset, pglen) - map fileh part into memory"
)
(
PyObject
*
pyfileh0
,
PyObject
*
args
)
(
PyObject
*
pyfileh0
,
PyObject
*
args
)
{
{
PyBigFileH
*
pyfileh
=
upcast
(
PyBigFileH
*
,
pyfileh0
);
PyBigFileH
*
pyfileh
=
container_of
(
pyfileh0
,
PyBigFileH
,
pyobj
);
Py_ssize_t
pgoffset
,
pglen
;
// XXX Py_ssize_t vs pgoff_t ?
Py_ssize_t
pgoffset
,
pglen
;
// XXX Py_ssize_t vs pgoff_t ?
PyVMA
*
pyvma
;
PyVMA
*
pyvma
;
int
err
;
int
err
;
...
@@ -321,7 +330,7 @@ PyFunc(pyfileh_mmap, "mmap(pgoffset, pglen) - map fileh part into memory")
...
@@ -321,7 +330,7 @@ PyFunc(pyfileh_mmap, "mmap(pgoffset, pglen) - map fileh part into memory")
return
NULL
;
return
NULL
;
Py_INCREF
(
pyfileh
);
Py_INCREF
(
pyfileh
);
err
=
fileh_mmap
(
pyvma
,
py
fileh
,
pgoffset
,
pglen
);
err
=
fileh_mmap
(
&
pyvma
->
vma
,
&
pyfileh
->
fileh
,
pgoffset
,
pglen
);
if
(
err
)
{
if
(
err
)
{
Py_DECREF
(
pyfileh
);
Py_DECREF
(
pyfileh
);
Py_DECREF
(
pyvma
);
Py_DECREF
(
pyvma
);
...
@@ -329,7 +338,7 @@ PyFunc(pyfileh_mmap, "mmap(pgoffset, pglen) - map fileh part into memory")
...
@@ -329,7 +338,7 @@ PyFunc(pyfileh_mmap, "mmap(pgoffset, pglen) - map fileh part into memory")
return
NULL
;
return
NULL
;
}
}
return
pyvma
;
return
&
pyvma
->
pyobj
;
}
}
...
@@ -337,14 +346,15 @@ PyFunc(pyfileh_dirty_writeout,
...
@@ -337,14 +346,15 @@ PyFunc(pyfileh_dirty_writeout,
"dirty_writeout(flags) - write changes made to fileh memory back to file"
)
"dirty_writeout(flags) - write changes made to fileh memory back to file"
)
(
PyObject
*
pyfileh0
,
PyObject
*
args
)
(
PyObject
*
pyfileh0
,
PyObject
*
args
)
{
{
PyBigFileH
*
pyfileh
=
upcast
(
PyBigFileH
*
,
pyfileh0
);
PyBigFileH
*
pyfileh
=
container_of
(
pyfileh0
,
PyBigFileH
,
pyobj
);
BigFileH
*
fileh
=
&
pyfileh
->
fileh
;
long
flags
;
long
flags
;
int
err
;
int
err
;
if
(
!
PyArg_ParseTuple
(
args
,
"l"
,
&
flags
))
if
(
!
PyArg_ParseTuple
(
args
,
"l"
,
&
flags
))
return
NULL
;
return
NULL
;
err
=
fileh_dirty_writeout
(
py
fileh
,
flags
);
err
=
fileh_dirty_writeout
(
fileh
,
flags
);
if
(
err
)
{
if
(
err
)
{
if
(
!
PyErr_Occurred
())
if
(
!
PyErr_Occurred
())
// XXX not very informative
// XXX not very informative
...
@@ -359,12 +369,13 @@ PyFunc(pyfileh_dirty_writeout,
...
@@ -359,12 +369,13 @@ PyFunc(pyfileh_dirty_writeout,
PyFunc
(
pyfileh_dirty_discard
,
"dirty_discard() - discard changes made to fileh memory"
)
PyFunc
(
pyfileh_dirty_discard
,
"dirty_discard() - discard changes made to fileh memory"
)
(
PyObject
*
pyfileh0
,
PyObject
*
args
)
(
PyObject
*
pyfileh0
,
PyObject
*
args
)
{
{
PyBigFileH
*
pyfileh
=
upcast
(
PyBigFileH
*
,
pyfileh0
);
PyBigFileH
*
pyfileh
=
container_of
(
pyfileh0
,
PyBigFileH
,
pyobj
);
BigFileH
*
fileh
=
&
pyfileh
->
fileh
;
if
(
!
PyArg_ParseTuple
(
args
,
""
))
if
(
!
PyArg_ParseTuple
(
args
,
""
))
return
NULL
;
return
NULL
;
fileh_dirty_discard
(
py
fileh
);
fileh_dirty_discard
(
fileh
);
Py_RETURN_NONE
;
Py_RETURN_NONE
;
}
}
...
@@ -372,26 +383,28 @@ PyFunc(pyfileh_dirty_discard, "dirty_discard() - discard changes made to fileh m
...
@@ -372,26 +383,28 @@ PyFunc(pyfileh_dirty_discard, "dirty_discard() - discard changes made to fileh m
PyFunc
(
pyfileh_isdirty
,
"isdirty() - are there any changes to fileh memory at all?"
)
PyFunc
(
pyfileh_isdirty
,
"isdirty() - are there any changes to fileh memory at all?"
)
(
PyObject
*
pyfileh0
,
PyObject
*
args
)
(
PyObject
*
pyfileh0
,
PyObject
*
args
)
{
{
PyBigFileH
*
pyfileh
=
upcast
(
PyBigFileH
*
,
pyfileh0
);
PyBigFileH
*
pyfileh
=
container_of
(
pyfileh0
,
PyBigFileH
,
pyobj
);
BigFileH
*
fileh
=
&
pyfileh
->
fileh
;
if
(
!
PyArg_ParseTuple
(
args
,
""
))
if
(
!
PyArg_ParseTuple
(
args
,
""
))
return
NULL
;
return
NULL
;
/* NOTE not strictly necessary to virt_lock() for checking ->dirty_pages not empty */
/* NOTE not strictly necessary to virt_lock() for checking ->dirty_pages not empty */
return
PyBool_FromLong
(
!
list_empty
(
&
py
fileh
->
dirty_pages
));
return
PyBool_FromLong
(
!
list_empty
(
&
fileh
->
dirty_pages
));
}
}
PyFunc
(
pyfileh_invalidate_page
,
"invalidate_page(pgoffset) - invalidate fileh page"
)
PyFunc
(
pyfileh_invalidate_page
,
"invalidate_page(pgoffset) - invalidate fileh page"
)
(
PyObject
*
pyfileh0
,
PyObject
*
args
)
(
PyObject
*
pyfileh0
,
PyObject
*
args
)
{
{
PyBigFileH
*
pyfileh
=
upcast
(
PyBigFileH
*
,
pyfileh0
);
PyBigFileH
*
pyfileh
=
container_of
(
pyfileh0
,
PyBigFileH
,
pyobj
);
BigFileH
*
fileh
=
&
pyfileh
->
fileh
;
Py_ssize_t
pgoffset
;
// XXX Py_ssize_t vs pgoff_t ?
Py_ssize_t
pgoffset
;
// XXX Py_ssize_t vs pgoff_t ?
if
(
!
PyArg_ParseTuple
(
args
,
"n"
,
&
pgoffset
))
if
(
!
PyArg_ParseTuple
(
args
,
"n"
,
&
pgoffset
))
return
NULL
;
return
NULL
;
fileh_invalidate_page
(
py
fileh
,
pgoffset
);
fileh_invalidate_page
(
fileh
,
pgoffset
);
Py_RETURN_NONE
;
Py_RETURN_NONE
;
}
}
...
@@ -402,22 +415,23 @@ pyfileh_dealloc(PyObject *pyfileh0)
...
@@ -402,22 +415,23 @@ pyfileh_dealloc(PyObject *pyfileh0)
{
{
/* PyBigFileH does not support cyclic GC - no need to PyObject_GC_UnTrack it */
/* PyBigFileH does not support cyclic GC - no need to PyObject_GC_UnTrack it */
PyBigFileH
*
pyfileh
=
upcast
(
PyBigFileH
*
,
pyfileh0
);
PyBigFileH
*
pyfileh
=
container_of
(
pyfileh0
,
PyBigFileH
,
pyobj
);
BigFile
*
file
=
pyfileh
->
file
;
BigFileH
*
fileh
=
&
pyfileh
->
fileh
;
BigFile
*
file
=
fileh
->
file
;
PyBigFile
*
pyfile
;
PyBigFile
*
pyfile
;
if
(
pyfileh
->
in_weakreflist
)
if
(
pyfileh
->
in_weakreflist
)
PyObject_ClearWeakRefs
(
pyfileh
);
PyObject_ClearWeakRefs
(
&
pyfileh
->
pyobj
);
/* pyfileh->file indicates whether fileh was yet opened (via fileh_open()) or not */
/* pyfileh->file indicates whether fileh was yet opened (via fileh_open()) or not */
if
(
file
)
{
if
(
file
)
{
fileh_close
(
py
fileh
);
fileh_close
(
fileh
);
pyfile
=
upcast
(
PyBigFile
*
,
file
);
pyfile
=
container_of
(
file
,
PyBigFile
,
file
);
Py_DECREF
(
pyfile
);
Py_DECREF
(
pyfile
);
}
}
pyfileh
->
ob_type
->
tp_free
(
pyfileh
);
pyfileh
->
pyobj
.
ob_type
->
tp_free
(
&
pyfileh
->
pyobj
);
}
}
...
@@ -431,7 +445,7 @@ pyfileh_new(PyTypeObject *type, PyObject *args, PyObject *kw)
...
@@ -431,7 +445,7 @@ pyfileh_new(PyTypeObject *type, PyObject *args, PyObject *kw)
return
NULL
;
return
NULL
;
self
->
in_weakreflist
=
NULL
;
self
->
in_weakreflist
=
NULL
;
return
self
;
return
&
self
->
pyobj
;
}
}
...
@@ -467,7 +481,7 @@ static /*const*/ PyTypeObject PyBigFileH_Type = {
...
@@ -467,7 +481,7 @@ static /*const*/ PyTypeObject PyBigFileH_Type = {
static
int
pybigfile_loadblk
(
BigFile
*
file
,
blk_t
blk
,
void
*
buf
)
static
int
pybigfile_loadblk
(
BigFile
*
file
,
blk_t
blk
,
void
*
buf
)
{
{
PyBigFile
*
pyfile
=
upcast
(
PyBigFile
*
,
file
);
PyBigFile
*
pyfile
=
container_of
(
file
,
PyBigFile
,
file
);
PyObject
*
pybuf
=
NULL
;
PyObject
*
pybuf
=
NULL
;
PyObject
*
loadret
=
NULL
;
PyObject
*
loadret
=
NULL
;
...
@@ -560,7 +574,7 @@ static int pybigfile_loadblk(BigFile *file, blk_t blk, void *buf)
...
@@ -560,7 +574,7 @@ static int pybigfile_loadblk(BigFile *file, blk_t blk, void *buf)
/* NOTE K = unsigned long long */
/* NOTE K = unsigned long long */
BUILD_ASSERT
(
sizeof
(
blk
)
==
sizeof
(
unsigned
long
long
));
BUILD_ASSERT
(
sizeof
(
blk
)
==
sizeof
(
unsigned
long
long
));
loadret
=
PyObject_CallMethod
(
pyfile
,
"loadblk"
,
"KO"
,
blk
,
pybuf
);
loadret
=
PyObject_CallMethod
(
&
pyfile
->
pyobj
,
"loadblk"
,
"KO"
,
blk
,
pybuf
);
/* python should return to original frame */
/* python should return to original frame */
BUG_ON
(
ts
!=
PyThreadState_GET
());
BUG_ON
(
ts
!=
PyThreadState_GET
());
...
@@ -813,7 +827,7 @@ err:
...
@@ -813,7 +827,7 @@ err:
static
int
pybigfile_storeblk
(
BigFile
*
file
,
blk_t
blk
,
const
void
*
buf
)
static
int
pybigfile_storeblk
(
BigFile
*
file
,
blk_t
blk
,
const
void
*
buf
)
{
{
PyBigFile
*
pyfile
=
upcast
(
PyBigFile
*
,
file
);
PyBigFile
*
pyfile
=
container_of
(
file
,
PyBigFile
,
file
);
PyObject
*
pybuf
;
PyObject
*
pybuf
;
PyObject
*
storeret
=
NULL
;
PyObject
*
storeret
=
NULL
;
...
@@ -838,7 +852,7 @@ static int pybigfile_storeblk(BigFile *file, blk_t blk, const void *buf)
...
@@ -838,7 +852,7 @@ static int pybigfile_storeblk(BigFile *file, blk_t blk, const void *buf)
/* NOTE K = unsigned long long */
/* NOTE K = unsigned long long */
BUILD_ASSERT
(
sizeof
(
blk
)
==
sizeof
(
unsigned
long
long
));
BUILD_ASSERT
(
sizeof
(
blk
)
==
sizeof
(
unsigned
long
long
));
storeret
=
PyObject_CallMethod
(
pyfile
,
"storeblk"
,
"KO"
,
blk
,
pybuf
);
storeret
=
PyObject_CallMethod
(
&
pyfile
->
pyobj
,
"storeblk"
,
"KO"
,
blk
,
pybuf
);
/* we need to know only whether storeret != NULL, decref it now */
/* we need to know only whether storeret != NULL, decref it now */
Py_XDECREF
(
storeret
);
Py_XDECREF
(
storeret
);
...
@@ -896,7 +910,7 @@ static const struct bigfile_ops pybigfile_ops = {
...
@@ -896,7 +910,7 @@ static const struct bigfile_ops pybigfile_ops = {
static
PyObject
*
static
PyObject
*
pyfileh_open
(
PyObject
*
pyfile0
,
PyObject
*
args
)
pyfileh_open
(
PyObject
*
pyfile0
,
PyObject
*
args
)
{
{
PyBigFile
*
pyfile
=
upcast
(
PyBigFile
*
,
pyfile0
);
PyBigFile
*
pyfile
=
container_of
(
pyfile0
,
PyBigFile
,
pyobj
);
PyBigFileH
*
pyfileh
;
PyBigFileH
*
pyfileh
;
/* NOTE no virtmem lock needed - default RAM does not change */
/* NOTE no virtmem lock needed - default RAM does not change */
RAM
*
ram
=
ram_get_default
(
NULL
);
// TODO get ram from args
RAM
*
ram
=
ram_get_default
(
NULL
);
// TODO get ram from args
...
@@ -915,7 +929,7 @@ pyfileh_open(PyObject *pyfile0, PyObject *args)
...
@@ -915,7 +929,7 @@ pyfileh_open(PyObject *pyfile0, PyObject *args)
return
NULL
;
return
NULL
;
Py_INCREF
(
pyfile
);
Py_INCREF
(
pyfile
);
err
=
fileh_open
(
py
fileh
,
pyfile
,
ram
,
DONT_MMAP_OVERLAY
);
// XXX -> MMAP_OVERLAY if requested
err
=
fileh_open
(
&
pyfileh
->
fileh
,
pyfile
,
ram
,
DONT_MMAP_OVERLAY
);
// XXX -> MMAP_OVERLAY if requested
if
(
err
)
{
if
(
err
)
{
XPyErr_SetFromErrno
();
XPyErr_SetFromErrno
();
Py_DECREF
(
pyfile
);
Py_DECREF
(
pyfile
);
...
...
bigfile/_bigfile.h
View file @
8d15be09
...
@@ -46,10 +46,10 @@ extern "C" {
...
@@ -46,10 +46,10 @@ extern "C" {
* .pyuser generic python-level attribute (see below).
* .pyuser generic python-level attribute (see below).
*/
*/
struct
PyVMA
{
struct
PyVMA
{
PyObject
;
PyObject
pyobj
;
PyObject
*
in_weakreflist
;
PyObject
*
in_weakreflist
;
VMA
;
VMA
vma
;
/* python-level user of this VMA.
/* python-level user of this VMA.
*
*
...
@@ -77,10 +77,10 @@ typedef struct PyVMA PyVMA;
...
@@ -77,10 +77,10 @@ typedef struct PyVMA PyVMA;
* .isdirty() for knowing are there any changes at all
* .isdirty() for knowing are there any changes at all
*/
*/
struct
PyBigFileH
{
struct
PyBigFileH
{
PyObject
;
PyObject
pyobj
;
PyObject
*
in_weakreflist
;
PyObject
*
in_weakreflist
;
BigFileH
;
BigFileH
fileh
;
/* if subclass, in addition to .loadblk/.storeblk, defines .mmapper XXX ... */
/* if subclass, in addition to .loadblk/.storeblk, defines .mmapper XXX ... */
PyObject
*
pymmapper
;
// python object returned by .mmaper() that is holding virtmem_mapper pycapsule
PyObject
*
pymmapper
;
// python object returned by .mmaper() that is holding virtmem_mapper pycapsule
...
@@ -96,11 +96,11 @@ typedef struct PyBigFileH PyBigFileH;
...
@@ -96,11 +96,11 @@ typedef struct PyBigFileH PyBigFileH;
* For users .fileh_open() is exposed to get to file handles.
* For users .fileh_open() is exposed to get to file handles.
*/
*/
struct
PyBigFile
{
struct
PyBigFile
{
PyObject
;
PyObject
pyobj
;
/* NOTE no explicit weakref support is needed - this is a base class and python
/* NOTE no explicit weakref support is needed - this is a base class and python
* automatically adds support for weakrefs for in-python defined children */
* automatically adds support for weakrefs for in-python defined children */
BigFile
;
BigFile
file
;
};
};
typedef
struct
PyBigFile
PyBigFile
;
typedef
struct
PyBigFile
PyBigFile
;
...
...
bigfile/file_zodb.cpp
View file @
8d15be09
...
@@ -20,6 +20,7 @@
...
@@ -20,6 +20,7 @@
#include "wcfs/internal/wcfs.h"
#include "wcfs/internal/wcfs.h"
#include "wendelin/bigfile/file.h"
#include "wendelin/bigfile/file.h"
#include "wendelin/bigfile/virtmem.h"
#include "wendelin/bigfile/virtmem.h"
#include "bigfile/_bigfile.h"
#include "bigfile/_file_zodb.h"
#include "bigfile/_file_zodb.h"
void
*
virt_mmap_setup_read
(
VMA
*
vma
,
BigFile
*
file
,
blk_t
blk
,
size_t
blklen
)
{
void
*
virt_mmap_setup_read
(
VMA
*
vma
,
BigFile
*
file
,
blk_t
blk
,
size_t
blklen
)
{
...
...
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