[macruby-changes] [3332] MacRuby/trunk/gcd.c
source_changes at macosforge.org
source_changes at macosforge.org
Mon Jan 25 14:19:26 PST 2010
Revision: 3332
http://trac.macosforge.org/projects/ruby/changeset/3332
Author: ernest.prabhakar at gmail.com
Date: 2010-01-25 14:19:23 -0800 (Mon, 25 Jan 2010)
Log Message:
-----------
Use serial queue around Dispatch::Queue/Source suspension_count
Modified Paths:
--------------
MacRuby/trunk/gcd.c
Modified: MacRuby/trunk/gcd.c
===================================================================
--- MacRuby/trunk/gcd.c 2010-01-25 20:27:07 UTC (rev 3331)
+++ MacRuby/trunk/gcd.c 2010-01-25 22:19:23 UTC (rev 3332)
@@ -85,6 +85,8 @@
#define RSemaphore(val) ((rb_semaphore_t*)val)
+static dispatch_queue_t q_suspender;
+
static VALUE mDispatch;
// queue stuff
@@ -289,7 +291,6 @@
StringValue(name);
rb_queue_t *queue = RQueue(self);
- queue->suspension_count = 0;
queue->should_release_queue = 1;
queue->queue = dispatch_queue_create(RSTRING_PTR(name), NULL);
assert(queue->queue != NULL);
@@ -303,14 +304,16 @@
rb_queue_finalize(void *rcv, SEL sel)
{
rb_queue_t *queue = RQueue(rcv);
- while (queue->suspension_count < 0) {
- dispatch_resume(queue->queue);
- queue->suspension_count--;
- }
- if (queue->should_release_queue) {
- dispatch_release(queue->queue);
- queue->should_release_queue = 0;
- }
+ 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;
+ }
+ });
if (rb_queue_finalize_super != NULL) {
((void(*)(void *, SEL))rb_queue_finalize_super)(rcv, sel);
}
@@ -528,7 +531,7 @@
rb_dispatch_suspend(VALUE self, SEL sel)
{
rb_dispatch_obj_t *dobj = RDispatch(self);
- dobj->suspension_count++;
+ dispatch_sync(q_suspender, ^{ dobj->suspension_count++; });
dispatch_suspend(dobj->obj);
return Qnil;
}
@@ -552,10 +555,12 @@
rb_dispatch_resume(VALUE self, SEL sel)
{
rb_dispatch_obj_t *dobj = RDispatch(self);
- if (dobj->suspension_count > 0) {
- dobj->suspension_count--;
- dispatch_resume(dobj->obj);
- }
+ dispatch_sync(q_suspender, ^{
+ if (dobj->suspension_count > 0) {
+ dobj->suspension_count--;
+ dispatch_resume(dobj->obj);
+ }
+ };
return Qnil;
}
@@ -963,13 +968,14 @@
rb_source_finalize(void *rcv, SEL sel)
{
rb_source_t *src = RSource(rcv);
- if (src->source != NULL) {
- while (src->suspension_count < 0) {
+ assert(src->source != NULL);
+ dispatch_sync(q_suspender, ^{
+ while (src->suspension_count > 0) {
+ src->suspension_count--;
dispatch_resume(src->source);
- src->suspension_count--;
}
dispatch_release(src->source);
- }
+ });
if (rb_source_finalize_super != NULL) {
((void(*)(void *, SEL))rb_source_finalize_super)(rcv, sel);
}
@@ -1297,6 +1303,9 @@
/* 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/4de234a6/attachment-0001.html>
More information about the macruby-changes
mailing list