X-Git-Url: https://git.distorted.org.uk/~mdw/clg/blobdiff_plain/e2ebafb115b201d38b16f2ee7064b8514ea6b2e3..09f6e23711ab7b3b8f713f0cabdaeffcc7c4ac20:/glib/gobject.lisp diff --git a/glib/gobject.lisp b/glib/gobject.lisp index 43a8da7..b1c4351 100644 --- a/glib/gobject.lisp +++ b/glib/gobject.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: gobject.lisp,v 1.38 2006-02-02 22:35:12 espen Exp $ +;; $Id: gobject.lisp,v 1.42 2006-02-04 12:15:32 espen Exp $ (in-package "GLIB") @@ -61,33 +61,44 @@ (defbinding %object-unref () nil (location pointer)) -(defcallback toggle-ref-callback (nil (data pointer) (location pointer) (last-ref-p boolean)) - (if last-ref-p - (cache-instance (find-cached-instance location) t) - (cache-instance (find-cached-instance location) nil))) - -(defbinding %object-add-toggle-ref () pointer - (location pointer) - ((callback toggle-ref-callback) pointer) - (nil null)) - -(defbinding %object-remove-toggle-ref () pointer - (location pointer) - ((callback toggle-ref-callback) pointer) - (nil null)) +#+glib2.8 +(progn + (defcallback toggle-ref-callback (nil (data pointer) (location pointer) (last-ref-p boolean)) + #+debug-ref-counting + (if last-ref-p + (format t "Object at 0x~8,'0X has no foreign references~%" (sap-int location)) + (format t "Foreign reference added to object at 0x~8,'0X~%" (sap-int location))) + (if last-ref-p + (cache-instance (find-cached-instance location) t) + (cache-instance (find-cached-instance location) nil))) + + (defbinding %object-add-toggle-ref () pointer + (location pointer) + ((callback toggle-ref-callback) pointer) + (nil null)) + + (defbinding %object-remove-toggle-ref () pointer + (location pointer) + ((callback toggle-ref-callback) pointer) + (nil null))) (defmethod reference-foreign ((class gobject-class) location) (declare (ignore class)) - (if (slot-value class 'instance-slots-p) - (%object-add-toggle-ref location) - (%object-ref location))) + (%object-ref location)) (defmethod unreference-foreign ((class gobject-class) location) (declare (ignore class)) - (error "Should never be called on a GOBJECT-CLASS (if this is ever needed some redesigning would have to be done)") -; (%object-unref location) -) + (%object-unref location)) +#+debug-ref-counting +(progn + (defcallback weak-ref-callback (nil (data pointer) (location pointer)) + (format t "Object at 0x~8,'0X being finalized~%" (sap-int location))) + + (defbinding %object-weak-ref () pointer + (location pointer) + ((callback weak-ref-callback) pointer) + (nil null))) ; (defbinding object-class-install-param () nil @@ -213,6 +224,17 @@ initargs key pkey)) +(defmethod initialize-instance :around ((object gobject) &rest initargs) + (declare (ignore initargs)) + (call-next-method) + #+debug-ref-counting(%object-weak-ref (foreign-location object)) + #+glib2.8 + (when (slot-value (class-of object) 'instance-slots-p) + (with-slots (location) object + (%object-add-toggle-ref location) + (%object-unref location)))) + + (defmethod initialize-instance ((object gobject) &rest initargs) (unless (slot-boundp object 'location) ;; Extract initargs which we should pass directly to the GObject @@ -263,14 +285,23 @@ (defmethod instance-finalizer ((instance gobject)) - (let ((location (proxy-location instance))) + (let ((location (foreign-location instance))) + #+glib2.8 (if (slot-value (class-of instance) 'instance-slots-p) #'(lambda () + #+debug-ref-counting + (format t "Finalizing proxy for 0x~8,'0X~%" (sap-int location)) (remove-cached-instance location) (%object-remove-toggle-ref location)) #'(lambda () + #+debug-ref-counting + (format t "Finalizing proxy for 0x~8,'0X~%" (sap-int location)) (remove-cached-instance location) - (%object-unref location))))) + (%object-unref location))) + #-glib2.8 + #'(lambda () + (remove-cached-instance location) + (%object-unref location)))) (defbinding (%gobject-new "g_object_new") () pointer @@ -499,7 +530,7 @@ (let ((instance (make-symbol "INSTANCE"))) `(let ((,instance ,(from-alien-form form type))) (when ,instance - (%object-unref (proxy-location ,instance))) + (%object-unref (foreign-location ,instance))) ,instance)) (error "~A is not a subclass of GOBJECT" type))))