/*
 * call-seq:
 *    mutex.try_lock  => true or false
 *
 * Attempts to obtain the lock and returns immediately. Returns +true+ if the
 * lock was granted.
 */
VALUE
rb_mutex_trylock(VALUE self)
{
    mutex_t *mutex;
    VALUE locked = Qfalse;
    GetMutexPtr(self, mutex);

    if (mutex->th == GET_THREAD()) {
        rb_raise(rb_eThreadError, "deadlock; recursive locking");
    }

    native_mutex_lock(&mutex->lock);
    if (mutex->th == 0) {
        mutex->th = GET_THREAD();
        locked = Qtrue;
    }
    native_mutex_unlock(&mutex->lock);

    return locked;
}