Revision: 3360 http://trac.macosforge.org/projects/ruby/changeset/3360 Author: ernest.prabhakar@gmail.com Date: 2010-01-27 16:11:05 -0800 (Wed, 27 Jan 2010) Log Message: ----------- Moved from syslog to rudimentary ASL for exception handling Modified Paths: -------------- MacRuby/trunk/gcd.c Modified: MacRuby/trunk/gcd.c =================================================================== --- MacRuby/trunk/gcd.c 2010-01-27 22:12:51 UTC (rev 3359) +++ MacRuby/trunk/gcd.c 2010-01-28 00:11:05 UTC (rev 3360) @@ -21,14 +21,15 @@ #include "id.h" #include "vm.h" #include <libkern/OSAtomic.h> -#include <syslog.h> -#include <stdarg.h> +#include <asl.h> // TODO: These structures need to be wrapped in a Data struct, // otherwise there are crashes when one tries to add an instance // variable to a queue. (Not that that is a good idea.) static SEL selClose; +static aslmsg gcd_msg = NULL; +#define GCD_DEBUG(text) asl_log(NULL, gcd_msg, ASL_LEVEL_DEBUG, "%s", text) typedef struct { struct RBasic basic; @@ -312,7 +313,7 @@ { OSSpinLockLock(&_suspensionLock); while (queue->suspension_count > 0) { - syslog(LOG_WARNING, "Finalizing a suspended queue."); + GCD_DEBUG("Finalizing a suspended queue."); queue->suspension_count--; dispatch_resume(queue->queue); } @@ -328,6 +329,14 @@ } static VALUE +rb_block_rescue(VALUE data) +{ + char *text = (char *)data; + GCD_DEBUG(text); + return Qnil; +} + +static VALUE rb_block_release_eval(VALUE data) { GC_RELEASE(data); @@ -339,7 +348,7 @@ rb_block_dispatcher(void *data) { assert(data != NULL); - rb_rescue(rb_block_release_eval, (VALUE)data, NULL, 0); + rb_rescue(rb_block_release_eval, (VALUE)data, rb_block_rescue, (VALUE)"gcd.c: Exception in rb_block_dispatcher"); } static rb_vm_block_t * @@ -353,10 +362,10 @@ #if GCD_BLOCKS_COPY_DVARS block = rb_vm_dup_block(block); for (int i = 0; i < block->dvars_size; i++) { - VALUE *slot = block->dvars[i]; - VALUE *new_slot = xmalloc(sizeof(VALUE)); - GC_WB(new_slot, *slot); - GC_WB(&block->dvars[i], new_slot); + VALUE *slot = block->dvars[i]; + VALUE *new_slot = xmalloc(sizeof(VALUE)); + GC_WB(new_slot, *slot); + GC_WB(&block->dvars[i], new_slot); } #else rb_vm_block_make_detachable_proc(block); @@ -468,7 +477,7 @@ VALUE args[2]; args[0] = (VALUE)block; args[1] = param; - rb_rescue(rb_block_arg_eval, (VALUE) args, NULL, 0); + rb_rescue(rb_block_arg_eval, (VALUE) args, rb_block_rescue, (VALUE)"gcd.c: Exception in rb_block_arg_dispatcher"); } static void @@ -998,7 +1007,7 @@ if (src->source != NULL) { OSSpinLockLock(&_suspensionLock); while (src->suspension_count > 0) { - syslog(LOG_WARNING, "Finalizing a suspended source."); + GCD_DEBUG("Finalizing a suspended source."); src->suspension_count--; dispatch_resume(src->source); } @@ -1117,7 +1126,7 @@ dispatch_semaphore_signal(RSemaphore(rcv)->sem); } if (is_unbalanced == true) { - syslog(LOG_WARNING, "Finalizing a waiting Dispatch::Semaphore."); + GCD_DEBUG("Finalizing a waiting Dispatch::Semaphore."); } dispatch_release(RSemaphore(rcv)->sem); } @@ -1343,8 +1352,8 @@ /* Constants for future reference */ selClose = sel_registerName("close"); assert(selClose != NULL); - - openlog("macruby.gcd", LOG_PERROR, 0); // 0, 0); + gcd_msg = asl_new(ASL_TYPE_MSG); + asl_set(gcd_msg, ASL_KEY_FACILITY, "org.macruby.gcd"); }