[macruby-changes] [3333] MacRuby/trunk/gcd.c

source_changes at macosforge.org source_changes at macosforge.org
Mon Jan 25 14:19:26 PST 2010


Revision: 3333
          http://trac.macosforge.org/projects/ruby/changeset/3333
Author:   ernest.prabhakar at gmail.com
Date:     2010-01-25 14:19:24 -0800 (Mon, 25 Jan 2010)
Log Message:
-----------
Added SpinLock to protect Dispatch suspension_count

Modified Paths:
--------------
    MacRuby/trunk/gcd.c

Modified: MacRuby/trunk/gcd.c
===================================================================
--- MacRuby/trunk/gcd.c	2010-01-25 22:19:23 UTC (rev 3332)
+++ MacRuby/trunk/gcd.c	2010-01-25 22:19:24 UTC (rev 3333)
@@ -20,6 +20,7 @@
 #include "objc.h"
 #include "id.h"
 #include "vm.h"
+#include <libkern/OSAtomic.h>
 
 // TODO: These structures need to be wrapped in a Data struct,
 // otherwise there are crashes when one tries to add an instance
@@ -85,7 +86,7 @@
 
 #define RSemaphore(val) ((rb_semaphore_t*)val)
 
-static dispatch_queue_t q_suspender;
+static OSSpinLock _suspensionLock = 0;
 
 static VALUE mDispatch;
 
@@ -304,16 +305,16 @@
 rb_queue_finalize(void *rcv, SEL sel)
 {
     rb_queue_t *queue = RQueue(rcv);
-    dispatch_sync(q_suspender, ^{
-        while (queue->suspension_count > 0) {
-            queue->suspension_count--;
-            dispatch_resume(queue->queue);
-        }
-        if (queue->should_release_queue) {
-            dispatch_release(queue->queue);
-            queue->should_release_queue = 0;
-        }
-    });
+    OSSpinLockLock(&_suspensionLock);
+    while (queue->suspension_count > 0) {
+        queue->suspension_count--;
+        dispatch_resume(queue->queue);
+    }
+    if (queue->should_release_queue) {
+        dispatch_release(queue->queue);
+        queue->should_release_queue = 0;
+    }
+    OSSpinLockUnlock(&_suspensionLock);
     if (rb_queue_finalize_super != NULL) {
         ((void(*)(void *, SEL))rb_queue_finalize_super)(rcv, sel);
     }
@@ -531,7 +532,9 @@
 rb_dispatch_suspend(VALUE self, SEL sel)
 {
     rb_dispatch_obj_t *dobj = RDispatch(self);
-    dispatch_sync(q_suspender, ^{ dobj->suspension_count++; });
+    OSSpinLockLock(&_suspensionLock);
+    dobj->suspension_count++;
+    OSSpinLockUnlock(&_suspensionLock);    
     dispatch_suspend(dobj->obj);
     return Qnil;
 }
@@ -555,12 +558,12 @@
 rb_dispatch_resume(VALUE self, SEL sel)
 {
     rb_dispatch_obj_t *dobj = RDispatch(self);
-    dispatch_sync(q_suspender, ^{    
-        if (dobj->suspension_count > 0) {
-            dobj->suspension_count--;
-            dispatch_resume(dobj->obj);
-        }
-    };
+    OSSpinLockLock(&_suspensionLock);
+    if (dobj->suspension_count > 0) {
+        dobj->suspension_count--;
+        dispatch_resume(dobj->obj);
+    }
+    OSSpinLockUnlock(&_suspensionLock);    
     return Qnil;
 }
 
@@ -969,13 +972,13 @@
 {
     rb_source_t *src = RSource(rcv);
     assert(src->source != NULL);
-    dispatch_sync(q_suspender, ^{
-        while (src->suspension_count > 0) {
-            src->suspension_count--;
-            dispatch_resume(src->source);
-        }
-        dispatch_release(src->source);
-    });
+    OSSpinLockLock(&_suspensionLock);    
+    while (src->suspension_count > 0) {
+        src->suspension_count--;
+        dispatch_resume(src->source);
+    }
+    dispatch_release(src->source);
+    OSSpinLockUnlock(&_suspensionLock);    
     if (rb_source_finalize_super != NULL) {
         ((void(*)(void *, SEL))rb_source_finalize_super)(rcv, sel);
     }
@@ -1303,9 +1306,6 @@
 /* Constants for future reference */
     selClose = sel_registerName("close");
     assert(selClose != NULL);
-    
-    q_suspender = dispatch_queue_create("macruby.gcd.suspension_count", NULL);
-    assert(q_suspender != NULL);
 }
 
 
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/macruby-changes/attachments/20100125/dc10588a/attachment-0001.html>


More information about the macruby-changes mailing list