]> gitweb.factorcode.org Git - factor.git/commitdiff
vm: update callback stub machine code at the end of compaction to prevent it from...
authorSlava Pestov <slava@slava-pestovs-macbook-pro.local>
Wed, 2 Dec 2009 09:31:57 +0000 (03:31 -0600)
committerSlava Pestov <slava@slava-pestovs-macbook-pro.local>
Wed, 2 Dec 2009 09:31:57 +0000 (03:31 -0600)
vm/callbacks.cpp
vm/callbacks.hpp
vm/compaction.cpp
vm/slot_visitor.hpp

index 36efbad4502089337526fdfb5f9501b18c28be81..e0ebbd1402e6f5101ec76bc9fd600a2885e4de8d 100644 (file)
@@ -62,6 +62,23 @@ code_block *callback_heap::add(cell owner)
        return stub;
 }
 
+struct callback_updater {
+       callback_heap *callbacks;
+
+       explicit callback_updater(callback_heap *callbacks_) : callbacks(callbacks_) {}
+
+       void operator()(code_block *stub)
+       {
+               callbacks->update(stub);
+       }
+};
+
+void callback_heap::update()
+{
+       callback_updater updater(this);
+       each_callback(updater);
+}
+
 void factor_vm::primitive_callback()
 {
        tagged<word> w(dpop());
index c5900f4618a0055ae1d11052c659bfc0351bde1e..8662d3ccbb337af7bd2461c73ead46fae800bd68 100644 (file)
@@ -41,6 +41,8 @@ struct callback_heap {
        void update(code_block *stub);
        code_block *add(cell owner);
 
+       void update();
+
        code_block *next(code_block *stub)
        {
                return (code_block *)((cell)stub + stub->size());
index 999e909fa128fc8118c5f36e5e017095e763c763..ecc3eb8bbad4e7fe9d0c377fadcb904fbbab8f70 100644 (file)
@@ -206,6 +206,7 @@ void factor_vm::collect_compact_impl(bool trace_contexts_p)
        }
 
        update_code_roots_for_compaction();
+       callbacks->update();
 
        current_gc->event->ended_compaction();
 }
@@ -252,6 +253,7 @@ void factor_vm::collect_compact_code_impl(bool trace_contexts_p)
        code->allocator->compact(code_block_updater,code_block_sizer);
 
        update_code_roots_for_compaction();
+       callbacks->update();
 }
 
 void factor_vm::collect_compact(bool trace_contexts_p)
index a423d74a54385bed87ba7a38cf7690cccacd103e..dab9e22a1fe6e1d7c60aaefebe4985157aeaf808 100644 (file)
@@ -120,7 +120,6 @@ struct callback_slot_visitor {
        void operator()(code_block *stub)
        {
                visitor->visit_handle(&stub->owner);
-               callbacks->update(stub);
        }
 };