[macruby-changes] [3958] MacRuby/trunk

source_changes at macosforge.org source_changes at macosforge.org
Thu Apr 22 17:49:35 PDT 2010


Revision: 3958
          http://trac.macosforge.org/projects/ruby/changeset/3958
Author:   lsansonetti at apple.com
Date:     2010-04-22 17:49:34 -0700 (Thu, 22 Apr 2010)
Log Message:
-----------
the VM is now multithreaded-aware by default

Modified Paths:
--------------
    MacRuby/trunk/gc.c
    MacRuby/trunk/gcd.c
    MacRuby/trunk/vm.cpp
    MacRuby/trunk/vm.h

Modified: MacRuby/trunk/gc.c
===================================================================
--- MacRuby/trunk/gc.c	2010-04-22 07:50:59 UTC (rev 3957)
+++ MacRuby/trunk/gc.c	2010-04-23 00:49:34 UTC (rev 3958)
@@ -748,7 +748,6 @@
 rb_objc_finalizer_finalize(void *rcv, SEL sel)
 {
     rb_vm_finalizer_t *f = (rb_vm_finalizer_t *)rcv;
-    rb_vm_set_multithreaded(true);
     rb_vm_call_finalizer(f);
     rb_vm_unregister_finalizer(f); 
     if (rb_objc_finalizer_finalize_super != NULL) {

Modified: MacRuby/trunk/gcd.c
===================================================================
--- MacRuby/trunk/gcd.c	2010-04-22 07:50:59 UTC (rev 3957)
+++ MacRuby/trunk/gcd.c	2010-04-23 00:49:34 UTC (rev 3958)
@@ -362,7 +362,6 @@
     if (block == NULL) {
         rb_raise(rb_eArgError, "block not given");
     }
-    rb_vm_set_multithreaded(true);
 #if GCD_BLOCKS_COPY_DVARS
     block = rb_vm_dup_block(block);
     for (int i = 0; i < block->dvars_size; i++) {
@@ -1150,7 +1149,7 @@
 rb_dispatch_begin_thread(void)
 {
     if (old_dispatch_begin_thread_4GC != NULL) {
-	    (*old_dispatch_begin_thread_4GC)();
+	(*old_dispatch_begin_thread_4GC)();
     }
     rb_vm_register_current_alien_thread();
 }
@@ -1159,7 +1158,7 @@
 rb_dispatch_end_thread(void)
 {
     if (old_dispatch_end_thread_4GC != NULL) {
-	    (*old_dispatch_end_thread_4GC)();
+	(*old_dispatch_end_thread_4GC)();
     }
     rb_vm_unregister_current_alien_thread();
 }
@@ -1173,7 +1172,6 @@
     dispatch_end_thread_4GC = rb_dispatch_end_thread;
 }
 
-
 void
 Init_Dispatch(void)
 {

Modified: MacRuby/trunk/vm.cpp
===================================================================
--- MacRuby/trunk/vm.cpp	2010-04-22 07:50:59 UTC (rev 3957)
+++ MacRuby/trunk/vm.cpp	2010-04-23 00:49:34 UTC (rev 3958)
@@ -298,7 +298,6 @@
 RoxorCore::RoxorCore(void)
 {
     running = false;
-    multithreaded = false;
     abort_on_exception = false;
 
     pthread_assert(pthread_mutex_init(&gl, 0));
@@ -4455,26 +4454,10 @@
 void *
 rb_vm_create_vm(void)
 {
-    GET_CORE()->set_multithreaded(true);
-
     return (void *)new RoxorVM(*GET_VM());
 }
 
-extern "C"
-bool
-rb_vm_is_multithreaded(void)
-{
-    return GET_CORE()->get_multithreaded();
-}
-
-extern "C"
 void
-rb_vm_set_multithreaded(bool flag)
-{
-    GET_CORE()->set_multithreaded(flag);
-}
-
-void
 RoxorCore::register_thread(VALUE thread)
 {
     RoxorCoreLock lock;
@@ -4988,6 +4971,8 @@
     RoxorVM::main = new RoxorVM();
 
     pthread_assert(pthread_key_create(&RoxorVM::vm_thread_key, NULL));
+    pthread_assert(pthread_setspecific(RoxorVM::vm_thread_key,
+		(void *)RoxorVM::main));
 
     setup_builtin_stubs();
 
@@ -5109,7 +5094,7 @@
 void
 RoxorVM::setup_from_current_thread(void)
 {
-    pthread_setspecific(RoxorVM::vm_thread_key, (void *)this);
+    pthread_assert(pthread_setspecific(RoxorVM::vm_thread_key, (void *)this));
 
     rb_vm_thread_t *t = (rb_vm_thread_t *)xmalloc(sizeof(rb_vm_thread_t));
     rb_vm_thread_pre_init(t, NULL, 0, NULL, (void *)this);
@@ -5124,10 +5109,10 @@
 void
 rb_vm_register_current_alien_thread(void)
 {
-    // This callback is not used, we prefer to create RoxorVM objects
-    // lazily (in RoxorVM::current()), for performance reasons, because the
-    // callback is called *a lot* and most of the time from various parts of
-    // the system which will never ask us to execute Ruby code.
+    // The creation of RoxorVM objects is done lazily (in RoxorVM::current())
+    // for performance reason, because the callback is called *a lot* and most
+    // of the time from various parts of the system which will never ask us to
+    // execute Ruby code.
 #if 0
     if (GET_CORE()->get_running()) {
 	printf("registered alien thread %p\n", pthread_self());
@@ -5141,9 +5126,18 @@
 void
 rb_vm_unregister_current_alien_thread(void)
 {
+    if (!GET_CORE()->get_running()) {
+	return;
+    }
+
+    pthread_t self = pthread_self();
+    if (GetThreadPtr(RoxorVM::main->get_thread())->thread == self) {
+	// Do not unregister the main thread.
+	return;
+    }
+
     // Check if the current pthread has been registered.
     RoxorCoreLock lock;
-    pthread_t self = pthread_self();
     VALUE ary = GET_CORE()->get_threads();
     bool need_to_unregister = false;
     for (int i = 0; i < RARRAY_LEN(ary); i++) {

Modified: MacRuby/trunk/vm.h
===================================================================
--- MacRuby/trunk/vm.h	2010-04-22 07:50:59 UTC (rev 3957)
+++ MacRuby/trunk/vm.h	2010-04-23 00:49:34 UTC (rev 3958)
@@ -425,9 +425,6 @@
 Class rb_vm_set_current_class(Class klass);
 Class rb_vm_get_current_class(void);
 
-bool rb_vm_is_multithreaded(void);
-void rb_vm_set_multithreaded(bool flag);
-
 bool rb_vm_aot_feature_load(const char *name);
 
 static inline VALUE
@@ -620,7 +617,6 @@
 
 	// State.
 	bool running;
-	bool multithreaded;
 	bool abort_on_exception;
 	VALUE loaded_features;
 	VALUE load_path;
@@ -689,7 +685,6 @@
 	~RoxorCore(void);
 
 	ACCESSOR(running, bool);
-	ACCESSOR(multithreaded, bool);
 	ACCESSOR(abort_on_exception, bool);
 	ACCESSOR(default_random, VALUE);
 	READER(loaded_features, VALUE);
@@ -706,14 +701,10 @@
 	int trap_level_for_signal(int signal);
 
 	void lock(void) { 
-	    if (multithreaded) {
-		assert(pthread_mutex_lock(&gl) == 0);
-	    }
+	    assert(pthread_mutex_lock(&gl) == 0);
 	}
 	void unlock(void) {
-	    if (multithreaded) {
-		assert(pthread_mutex_unlock(&gl) == 0);
-	    }
+	    assert(pthread_mutex_unlock(&gl) == 0);
 	}
 
 	void register_thread(VALUE thread);
@@ -894,21 +885,17 @@
 	static pthread_key_t vm_thread_key;
 
 	static force_inline RoxorVM *current(void) {
-	    if (GET_CORE()->get_multithreaded()) {
-		void *vm = pthread_getspecific(vm_thread_key);
-		if (vm == NULL) {
-		    // The value does not exist yet, which means we are called
-		    // from a thread that was not created by MacRuby directly
-		    // (potentially the GC thread or Cocoa). In this case, we
-		    // create a new VM object just for this thread.
-		    // XXX the VM object is never detroyed.
-		    RoxorVM *new_vm = new RoxorVM();
-		    new_vm->setup_from_current_thread();
-		    return new_vm;
-		}
-		return (RoxorVM *)vm;
+	    void *vm = pthread_getspecific(vm_thread_key);
+	    if (vm == NULL) {
+		// The value does not exist yet, which means we are called
+		// from a thread that was not created by MacRuby directly
+		// (potentially the GC thread or Cocoa). In this case, we
+		// create a new VM object just for this thread.
+		RoxorVM *new_vm = new RoxorVM();
+		new_vm->setup_from_current_thread();
+		return new_vm;
 	    }
-	    return RoxorVM::main;
+	    return (RoxorVM *)vm;
 	}
 
     private:
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/macruby-changes/attachments/20100422/573dc9bc/attachment.html>


More information about the macruby-changes mailing list