[pypy-svn] r51504 - pypy/dist/pypy/rlib

pedronis at codespeak.net pedronis at codespeak.net
Fri Feb 15 10:03:36 CET 2008


Author: pedronis
Date: Fri Feb 15 10:03:35 2008
New Revision: 51504

Modified:
   pypy/dist/pypy/rlib/libffi.py
Log:
userdata needs to be raw allocated too, it stored away by ffi in places a movable gc cannot see



Modified: pypy/dist/pypy/rlib/libffi.py
==============================================================================
--- pypy/dist/pypy/rlib/libffi.py	(original)
+++ pypy/dist/pypy/rlib/libffi.py	Fri Feb 15 10:03:35 2008
@@ -176,6 +176,17 @@
     buf[0] = arg
 push_arg_as_ffiptr._annspecialcase_ = 'specialize:argtype(1)'
 
+
+# type defs for callback and closure userdata
+USERDATA_P = lltype.Ptr(lltype.ForwardReference())
+CALLBACK_TP = lltype.Ptr(lltype.FuncType([rffi.VOIDPP, rffi.VOIDP, USERDATA_P],
+                                         lltype.Void))
+USERDATA_P.TO.become(lltype.Struct('userdata',
+                                   ('callback', CALLBACK_TP),
+                                   ('addarg', rffi.INT),
+                                   hints={'callback':True}))
+
+
 def ll_callback(ffi_cif, ll_res, ll_args, ll_userdata):
     """ Callback specification.
     ffi_cif - something ffi specific, don't care
@@ -214,24 +225,18 @@
             lltype.free(self.ll_argtypes, flavor='raw')
             self.ll_argtypes = lltype.nullptr(FFI_TYPE_PP.TO)
 
-USERDATA_P = lltype.Ptr(lltype.GcForwardReference())
-CALLBACK_TP = lltype.Ptr(lltype.FuncType([rffi.VOIDPP, rffi.VOIDP, USERDATA_P],
-                                         lltype.Void))
-USERDATA_P.TO.become(lltype.GcStruct('userdata',
-                                     ('callback', CALLBACK_TP),
-                                     ('addarg', rffi.INT),
-                                     hints={'callback':True}))
-
 # as long as CallbackFuncPtr is kept alive, the underlaying userdata
 # is kept alive as well
 class CallbackFuncPtr(AbstractFuncPtr):
     ll_closure = lltype.nullptr(FFI_CLOSUREP.TO)
     ll_userdata = lltype.nullptr(USERDATA_P.TO)
 
+    # additional_arg should really be a non-heap type like a integer,
+    # it cannot be any kind of movable gc reference
     def __init__(self, argtypes, restype, func, additional_arg=0):
         AbstractFuncPtr.__init__(self, "callback", argtypes, restype)
         self.ll_closure = lltype.malloc(FFI_CLOSUREP.TO, flavor='raw')
-        self.ll_userdata = lltype.malloc(USERDATA_P.TO)
+        self.ll_userdata = lltype.malloc(USERDATA_P.TO, flavor='raw')
         self.ll_userdata.callback = rffi.llhelper(CALLBACK_TP, func)
         self.ll_userdata.addarg = additional_arg
         res = c_ffi_prep_closure(self.ll_closure, self.ll_cif,
@@ -245,8 +250,8 @@
         if self.ll_closure:
             lltype.free(self.ll_closure, flavor='raw')
             self.ll_closure = lltype.nullptr(FFI_CLOSUREP.TO)
-        # note that ll_userdata is a GC object and therefore does not need to
-        # be explicitely freed
+            lltype.free(self.ll_userdata, flavor='raw')
+            self.ll_userdata = lltype.nullptr(USERDATA_P.TO)
 
 class RawFuncPtr(AbstractFuncPtr):
 



More information about the Pypy-commit mailing list