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