Bladeren bron

Fix bus error dumping graph data.

Stefano Cossu 5 jaren geleden
bovenliggende
commit
d01d552963
3 gewijzigde bestanden met toevoegingen van 39 en 18 verwijderingen
  1. 14 7
      lakesuperior/model/graph/graph.pyx
  2. 4 2
      lakesuperior/model/graph/term.pxd
  3. 21 9
      lakesuperior/model/graph/term.pyx

+ 14 - 7
lakesuperior/model/graph/graph.pyx

@@ -347,14 +347,17 @@ cdef class SimpleGraph:
             print('Triple pointer address: {}'.format(<unsigned long>tt))
 
             print('Triple s address: {}'.format(<unsigned long>tt[0].s))
+            print(f'Triple s size: {tt.s.sz}')
             print('triple s: ')
             print((<unsigned char *>tt[0].s.addr)[:tt[0].s.sz])
 
             print('Triple p address: {}'.format(<unsigned long>tt[0].p))
+            print(f'Triple p size: {tt.p.sz}')
             print('triple p: ')
             print((<unsigned char *>tt[0].p.addr)[:tt[0].o.sz])
 
             print('Triple o address: {}'.format(<unsigned long>tt[0].o))
+            print(f'Triple o size: {tt.o.sz}')
             print('triple o: ')
             print((<unsigned char *>tt[0].o.addr)[:tt[0].o.sz])
 
@@ -386,11 +389,13 @@ cdef class SimpleGraph:
             print('Triple s address: {}'.format(<unsigned long>trp[0].s))
             print(f'Triple s size: {trp[0].s.sz}')
             print('Triple s:')
-            print((<unsigned char *>trp[0].p.addr)[:trp[0].p.sz])
+            print((<unsigned char *>trp[0].s.addr)[:trp[0].s.sz])
+
             print('Triple p address: {}'.format(<unsigned long>trp[0].p))
             print(f'Triple p size: {trp[0].p.sz}')
             print('Triple p:')
             print((<unsigned char *>trp[0].p.addr)[:trp[0].p.sz])
+
             print('Triple o address: {}'.format(<unsigned long>trp[0].o))
             print(f'Triple o size: {trp[0].o.sz}')
             print('Triple o:')
@@ -410,20 +415,22 @@ cdef class SimpleGraph:
 
     def add(self, triple):
         """ Add one triple to the graph. """
-        cdef SPOBuffer s_spo
+        cdef:
+            Buffer *ss = <Buffer *>self._pool.alloc(1, sizeof(Buffer))
+            Buffer *sp = <Buffer *>self._pool.alloc(1, sizeof(Buffer))
+            Buffer *so = <Buffer *>self._pool.alloc(1, sizeof(Buffer))
 
-        s_spo = <SPOBuffer>self._pool.alloc(3, sizeof(Buffer))
         s, p, o = triple
 
         #print('Serializing s.')
-        term.serialize_from_rdflib(s, s_spo)
+        term.serialize_from_rdflib(s, ss, self._pool)
         #print('Serializing p.')
-        term.serialize_from_rdflib(p, s_spo + 1)
+        term.serialize_from_rdflib(p, sp, self._pool)
         #print('Serializing o.')
-        term.serialize_from_rdflib(o, s_spo + 2)
+        term.serialize_from_rdflib(o, so, self._pool)
 
         print('Adding triple from rdflib.')
-        self._add_triple(s_spo, s_spo + 1, s_spo + 2)
+        self._add_triple(ss, sp, so)
         print('Added triple from rdflib.')
 
 

+ 4 - 2
lakesuperior/model/graph/term.pxd

@@ -1,3 +1,5 @@
+from cymem.cymem cimport Pool
+
 from lakesuperior.model.base cimport Buffer
 
 ctypedef struct Term:
@@ -10,10 +12,10 @@ cdef:
     # Temporary TPL variable.
     char *_pk
 
-    int serialize(const Term *term, Buffer *sterm) except -1
+    int serialize(const Term *term, Buffer *sterm, Pool pool=*) except -1
     int deserialize(const Buffer *data, Term *term) except -1
     int from_rdflib(term_obj, Term *term) except -1
-    int serialize_from_rdflib(term_obj, Buffer *data) except -1
+    int serialize_from_rdflib(term_obj, Buffer *data, Pool pool=*) except -1
     object deserialize_to_rdflib(const Buffer *data)
     object to_rdflib(const Term *term)
     object to_bytes(const Term *term)

+ 21 - 9
lakesuperior/model/graph/term.pyx

@@ -3,6 +3,9 @@ from rdflib import URIRef, BNode, Literal
 #from cpython.mem cimport PyMem_Malloc, PyMem_Free
 from libc.stdint cimport uint64_t
 from libc.stdlib cimport free
+from libc.string cimport memcpy
+
+from cymem.cymem cimport Pool
 
 from lakesuperior.cy_include cimport cytpl as tpl
 from lakesuperior.model.base cimport Buffer
@@ -15,7 +18,7 @@ DEF LSUP_TERM_PK_FMT = b'csss' # Reflects the Term structure
 DEF LSUP_TERM_STRUCT_PK_FMT = b'S(' + LSUP_TERM_PK_FMT + b')'
 
 
-cdef int serialize(const Term *term, Buffer *sterm) except -1:
+cdef int serialize(const Term *term, Buffer *sterm, Pool pool=None) except -1:
     """
     Serialize a Term into a binary buffer.
 
@@ -25,16 +28,23 @@ cdef int serialize(const Term *term, Buffer *sterm) except -1:
         unsigned char *addr
         size_t sz
 
-    print('Dump members:')
-    print(term[0].type)
-    print(term[0].data if term[0].data is not NULL else 'NULL')
-    print(term[0].datatype if term[0].datatype is not NULL else 'NULL')
-    print(term[0].lang if term[0].lang is not NULL else 'NULL')
+    #print('Dump members:')
+    #print(term[0].type)
+    #print(term[0].data if term[0].data is not NULL else 'NULL')
+    #print(term[0].datatype if term[0].datatype is not NULL else 'NULL')
+    #print(term[0].lang if term[0].lang is not NULL else 'NULL')
     print('Now serializing.')
     tpl.tpl_jot(tpl.TPL_MEM, &addr, &sz, LSUP_TERM_STRUCT_PK_FMT, term)
     print('Serialized.')
-    sterm[0].addr = addr
-    sterm[0].sz = sz
+    if pool is None:
+        sterm.addr = addr
+    else:
+        # addr is within this function scope. Must be copied to the cymem pool.
+        sterm.addr = pool.alloc(sz, 1)
+        if not sterm.addr:
+            raise MemoryError()
+        memcpy(sterm.addr, addr, sz)
+    sterm.sz = sz
     print('Assigned to buffer. Returning.')
 
 
@@ -78,7 +88,9 @@ cdef int from_rdflib(term_obj, Term *term) except -1:
     print(f'term data: {term[0].data}')
 
 
-cdef int serialize_from_rdflib(term_obj, Buffer *data) except -1:
+cdef int serialize_from_rdflib(
+        term_obj, Buffer *data, Pool pool=None
+    ) except -1:
     """
     Return a Buffer struct from a Python/RDFLib term.
     """