From: espen Date: Thu, 2 Feb 2006 18:37:46 +0000 (+0000) Subject: Objects can now be cached with strong references X-Git-Tag: clg-0-92~107 X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~mdw/git/clg/commitdiff_plain/a2bc0f3aa2ece7e32955ea25559ccb084649cf57?ds=sidebyside Objects can now be cached with strong references --- diff --git a/glib/proxy.lisp b/glib/proxy.lisp index 67c7e0b..a96e246 100644 --- a/glib/proxy.lisp +++ b/glib/proxy.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: proxy.lisp,v 1.21 2005/04/24 13:26:40 espen Exp $ +;; $Id: proxy.lisp,v 1.22 2006/02/02 18:37:46 espen Exp $ (in-package "GLIB") @@ -226,15 +226,19 @@ (defmethod validate-superclass (internal *instance-cache*) (defvar *instance-cache* (make-hash-table :test #'eql)) -(defun cache-instance (instance) +(defun cache-instance (instance &optional (weak-ref t)) (setf (gethash (sap-int (proxy-location instance)) *instance-cache*) - (make-weak-pointer instance))) + (if weak-ref + (make-weak-pointer instance) + instance))) (defun find-cached-instance (location) (let ((ref (gethash (sap-int location) *instance-cache*))) (when ref - (weak-pointer-value ref)))) + (if (weak-pointer-p ref) + (weak-pointer-value ref) + ref)))) (defun instance-cached-p (location) (gethash (sap-int location) *instance-cache*)) @@ -243,11 +247,11 @@ (defun remove-cached-instance (location) (remhash (sap-int location) *instance-cache*)) ;; For debuging -(defun cached-instances () +(defun list-cached-instances () (let ((instances ())) (maphash #'(lambda (location ref) (declare (ignore location)) - (push (weak-pointer-value ref) instances)) + (push ref instances)) *instance-cache*) instances)) @@ -258,7 +262,6 @@ (defun cached-instances () (defclass proxy () ((location :reader proxy-location :type system-area-pointer))) -(defgeneric initialize-proxy (object &rest initargs)) (defgeneric instance-finalizer (object)) (defgeneric reference-foreign (class location)) (defgeneric unreference-foreign (class location))