From 832df308727989ce3b1a0572d5742f1f3017f362 Mon Sep 17 00:00:00 2001 Message-Id: <832df308727989ce3b1a0572d5742f1f3017f362.1714207216.git.mdw@distorted.org.uk> From: Mark Wooding Date: Mon, 6 Feb 2006 11:56:22 +0000 Subject: [PATCH] Proxies for non reference counted foreign objects passed as arguments to signal handlers are invalidated when the handlers are exiting Organization: Straylight/Edgeware From: espen --- glib/gcallback.lisp | 19 +++++++++++++------ glib/gparam.lisp | 8 ++++++-- 2 files changed, 19 insertions(+), 8 deletions(-) diff --git a/glib/gcallback.lisp b/glib/gcallback.lisp index e8d7ca4..6a5cbab 100644 --- a/glib/gcallback.lisp +++ b/glib/gcallback.lisp @@ -20,7 +20,7 @@ ;; TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE ;; SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -;; $Id: gcallback.lisp,v 1.26 2006-02-01 14:18:49 espen Exp $ +;; $Id: gcallback.lisp,v 1.27 2006-02-06 11:56:22 espen Exp $ (in-package "GLIB") @@ -58,10 +58,17 @@ (defun callback-trampoline (callback-id n-params param-values &optional (gvalue-type return-value))) (args (loop for n from 0 below n-params - collect (gvalue-get (sap+ param-values (* n +gvalue-size+)))))) - (let ((result (apply #'invoke-callback callback-id return-type args))) - (when return-type - (gvalue-set return-value result))))) + for offset from 0 by +gvalue-size+ + collect (gvalue-weak-get (sap+ param-values offset))))) + (unwind-protect + (let ((result (apply #'invoke-callback callback-id return-type args))) + (when return-type + (gvalue-set return-value result))) + (loop + for arg in args + when (typep arg 'proxy) + do (invalidate-instance arg))))) + (defun invoke-callback (callback-id return-type &rest args) (restart-case @@ -212,7 +219,7 @@ (defbinding %signal-chain-from-overridden () nil (args pointer) (return-value (or null gvalue))) - +;; TODO: implement same semantics as CALL-NEXT-METHOD (defun %call-next-handler (n-params types args defaults return-type) (let ((params (allocate-memory (* n-params +gvalue-size+)))) (loop diff --git a/glib/gparam.lisp b/glib/gparam.lisp index d706580..7c1ab5e 100644 --- a/glib/gparam.lisp +++ b/glib/gparam.lisp @@ -20,7 +20,7 @@ ;; TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE ;; SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -;; $Id: gparam.lisp,v 1.17 2005-04-23 16:48:51 espen Exp $ +;; $Id: gparam.lisp,v 1.18 2006-02-06 11:56:22 espen Exp $ (in-package "GLIB") @@ -64,10 +64,14 @@ (defun gvalue-free (gvalue &optional (unset-p t)) (defun gvalue-type (gvalue) (type-from-number (sap-ref-32 gvalue 0))) -(defun gvalue-get (gvalue) +(defun gvalue-get (gvalue) (funcall (reader-function (gvalue-type gvalue)) gvalue +gvalue-value-offset+)) +(defun gvalue-weak-get (gvalue) + (funcall (weak-reader-function (gvalue-type gvalue)) + gvalue +gvalue-value-offset+)) + (defun gvalue-set (gvalue value) (funcall (writer-function (gvalue-type gvalue)) value gvalue +gvalue-value-offset+) -- [mdw]