From 6c56dae4b23c5c50e351758538141ca26b9aba40 Mon Sep 17 00:00:00 2001 From: kosaki Date: Mon, 19 Nov 2012 10:22:53 +0000 Subject: [PATCH] * prelude.rb: Moved Mutex#synchronize to * thread.c (rb_mutex_synchronize_m): here. [Bug #4266] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@37724 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ChangeLog | 5 +++++ prelude.rb | 16 ---------------- thread.c | 18 ++++++++++++++++++ 3 files changed, 23 insertions(+), 16 deletions(-) diff --git a/ChangeLog b/ChangeLog index ee3e01e6d5b04d..1fe8beae30e646 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +Tue Nov 20 09:20:49 2012 KOSAKI Motohiro + + * prelude.rb: Moved Mutex#synchronize to + * thread.c (rb_mutex_synchronize_m): here. [Bug #4266] + Tue Nov 20 08:36:15 2012 KOSAKI Motohiro * signal.c (sig_signame): implements Signal.signame method diff --git a/prelude.rb b/prelude.rb index 4b6ab1a6777823..2b371e71340d61 100644 --- a/prelude.rb +++ b/prelude.rb @@ -1,19 +1,3 @@ -class Mutex - # call-seq: - # mutex.synchronize { ... } - # - # Obtains a lock, runs the block, and releases the lock when the - # block completes. See the example under Mutex. - def synchronize - self.lock - begin - yield - ensure - self.unlock rescue nil - end - end -end - class Thread MUTEX_FOR_THREAD_EXCLUSIVE = Mutex.new # :nodoc: diff --git a/thread.c b/thread.c index 4a3aeaa396f1ba..bf5cb9be61e604 100644 --- a/thread.c +++ b/thread.c @@ -4285,6 +4285,23 @@ rb_mutex_synchronize(VALUE mutex, VALUE (*func)(VALUE arg), VALUE arg) return rb_ensure(func, arg, rb_mutex_unlock, mutex); } +/* + * call-seq: + * mutex.synchronize { ... } -> result of the block + * + * Obtains a lock, runs the block, and releases the lock when the block + * completes. See the example under +Mutex+. + */ +static VALUE +rb_mutex_synchronize_m(VALUE self, VALUE args) +{ + if (!rb_block_given_p()) { + rb_raise(rb_eThreadError, "must be called with a block"); + } + + return rb_mutex_synchronize(self, rb_yield, Qnil); +} + /* * Document-class: ThreadShield */ @@ -4740,6 +4757,7 @@ Init_Thread(void) rb_define_method(rb_cMutex, "lock", rb_mutex_lock, 0); rb_define_method(rb_cMutex, "unlock", rb_mutex_unlock, 0); rb_define_method(rb_cMutex, "sleep", mutex_sleep, -1); + rb_define_method(rb_cMutex, "synchronize", rb_mutex_synchronize_m, 0); recursive_key = rb_intern("__recursive_key__"); rb_eThreadError = rb_define_class("ThreadError", rb_eStandardError);