/*
* 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
frt_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;
}