diff dwt/dwthelper/WeakHashMap.d @ 226:6da025bf255e

some fixes
author Frank Benoit <benoit@tionex.de>
date Fri, 11 Apr 2008 17:50:39 +0200
parents d0081b1505da
children 695802b523c0
line wrap: on
line diff
--- a/dwt/dwthelper/WeakHashMap.d	Fri Apr 11 01:26:04 2008 +0200
+++ b/dwt/dwthelper/WeakHashMap.d	Fri Apr 11 17:50:39 2008 +0200
@@ -1,6 +1,13 @@
 module dwt.dwthelper.WeakHashMap;
 
 
+private {
+    alias void delegate(Object) DisposeEvt;
+    extern (C) void  rt_attachDisposeEvent( Object obj, DisposeEvt evt );
+    extern (C) void  rt_detachDisposeEvent( Object obj, DisposeEvt evt );
+}
+
+
 /+
     Is not yet 'weak'
 +/
@@ -11,17 +18,45 @@
         this(Object k){
             ptr = cast(size_t)cast(void*)k;
         }
+        override hash_t toHash(){
+            return cast(hash_t)ptr;
+        }
+        override int opEquals( Object o ){
+            if( auto other = cast(Ref)o ){
+                return ptr is other.ptr;
+            }
+            return false;
+        }
+    }
+
+    private Ref unhookKey;
+
+    private void unhook(Object o) {
+        unhookKey.ptr = cast(size_t)cast(void*)o;
+        if( auto p = unhookKey in data ){
+            rt_detachDisposeEvent(o, &unhook);
+            data.remove( unhookKey );
+        }
     }
 
     Object[ Ref ] data;
+    ClassInfo gcLock;
+    this(){
+        unhookKey = new Ref(null);
+        gcLock = ClassInfo.find( "gcx.GCLock" );
+    }
 
     public void add (Object key, Object element){
         auto k = new Ref(key);
+        rt_attachDisposeEvent(key, &unhook);
         data[ k ] = element;
     }
     public void removeKey (Object key){
         scope k = new Ref(key);
-        data.remove( k );
+        if( auto p = k in data ){
+            data.remove( k );
+            rt_detachDisposeEvent(key, &unhook);
+        }
     }
     public Object get(Object key){
         scope k = new Ref(key);