/* * call-seq: * lock.while_locked(timeout = 1) { do_something() } -> bool * * Run the code in a block while a lock is obtained, automatically releasing * the lock when the block returns. * * See Lock#obtain for more information on lock timeout. * * timeout:: seconds to wait to obtain lock before timing out and returning * false * return:: true if lock was successfully obtained. Raises a * Lock::LockError otherwise. */ static VALUE frb_lock_while_locked(int argc, VALUE *argv, VALUE self) { VALUE rtimeout; int timeout = 1; Lock *lock; GET_LOCK(lock, self); if (rb_scan_args(argc, argv, "01", &rtimeout) > 0) { timeout = FIX2INT(rtimeout); } if (!lock->obtain(lock)) { rb_raise(cLockError, "could not obtain lock: #%s", lock->name); } rb_yield(Qnil); lock->release(lock); return Qtrue; }