]> gitweb.factorcode.org Git - factor.git/blobdiff - core/destructors/destructors.factor
Disposables are now registered in a global disposables set. To take advantage of...
[factor.git] / core / destructors / destructors.factor
index 9a470d53c141f93d3761753965afb7452cee922b..39f0e9f2b9652871a945ebcfdad3dc6ed82c02ed 100644 (file)
@@ -1,10 +1,30 @@
-! Copyright (C) 2007, 2008 Doug Coleman, Slava Pestov.
+! Copyright (C) 2007, 2009 Doug Coleman, Slava Pestov.
 ! See http://factorcode.org/license.txt for BSD license.
 USING: accessors continuations kernel namespaces make
-sequences vectors ;
+sequences vectors sets assocs init ;
 IN: destructors
 
-TUPLE: disposable disposed ;
+SYMBOL: disposables
+
+[ H{ } clone disposables set-global ] "destructors" add-init-hook
+
+<PRIVATE
+
+: register-disposable ( obj -- )
+    disposables get conjoin ;
+
+: unregister-disposable ( obj -- )
+    disposables get delete-at ;
+
+PRIVATE>
+
+TUPLE: disposable < identity-tuple disposed id ;
+
+M: disposable hashcode* nip id>> ;
+
+: new-disposable ( class -- disposable )
+    new \ disposable counter >>id
+    dup register-disposable ; inline
 
 GENERIC: dispose* ( disposable -- )
 
@@ -18,6 +38,9 @@ GENERIC: dispose ( disposable -- )
 M: object dispose
     dup disposed>> [ drop ] [ t >>disposed dispose* ] if ;
 
+M: disposable dispose
+    [ unregister-disposable ] [ call-next-method ] bi ;
+
 : dispose-each ( seq -- )
     [
         [ [ dispose ] curry [ , ] recover ] each