[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