[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