[macruby-changes] [1924] MacRuby/branches/experimental

source_changes at macosforge.org source_changes at macosforge.org
Wed Jun 24 12:13:48 PDT 2009


Revision: 1924
          http://trac.macosforge.org/projects/ruby/changeset/1924
Author:   lsansonetti at apple.com
Date:     2009-06-24 12:13:48 -0700 (Wed, 24 Jun 2009)
Log Message:
-----------
some mutex work

Modified Paths:
--------------
    MacRuby/branches/experimental/include/ruby/intern.h
    MacRuby/branches/experimental/thread.c

Modified: MacRuby/branches/experimental/include/ruby/intern.h
===================================================================
--- MacRuby/branches/experimental/include/ruby/intern.h	2009-06-24 19:12:37 UTC (rev 1923)
+++ MacRuby/branches/experimental/include/ruby/intern.h	2009-06-24 19:13:48 UTC (rev 1924)
@@ -602,13 +602,6 @@
 VALUE rb_thread_blocking_region(rb_blocking_function_t *func, void *data1,
 				rb_unblock_function_t *ubf, void *data2);
 #define RB_UBF_DFL ((rb_unblock_function_t *)-1)
-VALUE rb_mutex_new(void);
-VALUE rb_mutex_locked_p(VALUE mutex);
-VALUE rb_mutex_try_lock(VALUE mutex);
-VALUE rb_mutex_lock(VALUE mutex);
-VALUE rb_mutex_unlock(VALUE mutex);
-VALUE rb_mutex_sleep(VALUE self, VALUE timeout);
-VALUE rb_mutex_synchronize(VALUE self);
 VALUE rb_barrier_new(void);
 VALUE rb_barrier_wait(VALUE self);
 VALUE rb_barrier_release(VALUE self);

Modified: MacRuby/branches/experimental/thread.c
===================================================================
--- MacRuby/branches/experimental/thread.c	2009-06-24 19:12:37 UTC (rev 1923)
+++ MacRuby/branches/experimental/thread.c	2009-06-24 19:13:48 UTC (rev 1924)
@@ -4,6 +4,10 @@
 
 #include <pthread.h>
 
+typedef struct rb_vm_mutex {
+    pthread_mutex_t mutex;
+} rb_vm_mutex_t;
+
 VALUE rb_cThread;
 VALUE rb_cMutex;
 
@@ -1122,18 +1126,31 @@
  *
  *  Creates a new Mutex
  */
+
 static VALUE
-mutex_initialize(VALUE self)
+mutex_s_alloc(VALUE self, SEL sel)
 {
-    // TODO
-    return Qnil;
+    rb_vm_mutex_t *t = (rb_vm_mutex_t *)xmalloc(sizeof(rb_vm_mutex_t));
+    return Data_Wrap_Struct(rb_cMutex, NULL, NULL, t);
 }
 
-VALUE
-rb_mutex_new(void)
+#define GetMutex(obj) (((rb_vm_mutex_t *)DATA_PTR(obj))->mutex)
+
+#define assert_ok(call) \
+    do { \
+	const int __r = call; \
+	if (__r != 0) { \
+	    rb_raise(rb_eRuntimeError, "mutex operation failed: error %d", \
+		    __r); \
+	} \
+    } \
+    while (0)
+
+static VALUE
+mutex_initialize(VALUE self, SEL sel)
 {
-    // TODO
-    return Qnil;
+    assert_ok(pthread_mutex_init(&GetMutex(self), NULL));
+    return self;
 }
 
 /*
@@ -1146,6 +1163,7 @@
 VALUE
 rb_mutex_locked_p(VALUE self)
 {
+    // TODO
     return Qnil;
 }
 
@@ -1157,9 +1175,10 @@
  * lock was granted.
  */
 
-VALUE
-rb_mutex_trylock(VALUE self)
+static VALUE
+rb_mutex_trylock(VALUE self, SEL sel)
 {
+    // TODO
     return Qnil;
 }
 
@@ -1220,9 +1239,11 @@
 static VALUE
 mutex_synchronize(VALUE self, SEL sel)
 {
-    // TODO
-    rb_yield(Qundef);
-    return Qnil;
+    assert_ok(pthread_mutex_lock(&GetMutex(self)));
+    // TODO catch exception
+    VALUE ret = rb_yield(Qundef);
+    assert_ok(pthread_mutex_unlock(&GetMutex(self)));
+    return ret;
 }
 
 VALUE
@@ -1294,7 +1315,8 @@
     rb_define_method(cThGroup, "add", thgroup_add, 1);
 
     rb_cMutex = rb_define_class("Mutex", rb_cObject);
-    rb_define_method(rb_cMutex, "initialize", mutex_initialize, 0);
+    rb_objc_define_method(*(VALUE *)rb_cMutex, "alloc", mutex_s_alloc, 0);
+    rb_objc_define_method(rb_cMutex, "initialize", mutex_initialize, 0);
     rb_define_method(rb_cMutex, "locked?", rb_mutex_locked_p, 0);
     rb_define_method(rb_cMutex, "try_lock", rb_mutex_trylock, 0);
     rb_define_method(rb_cMutex, "lock", rb_mutex_lock, 0);
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/macruby-changes/attachments/20090624/9a0d4201/attachment.html>


More information about the macruby-changes mailing list