为什么Linux内核的rwlock_t的锁定字段是unsigned int

时间:2015-11-23 05:01:59

标签: linux rwlock

在Linux 2.6.11.12中,rwlock_t的定义如下:

typedef struct {
    volatile unsigned int lock;
#ifdef CONFIG_DEBUG_SPINLOCK
    unsigned magic;
#endif
#ifdef CONFIG_PREEMPT
    unsigned int break_lock;
#endif
} rwlock_t;

rwlock_t的定义中,lock字段为unsigned int。当我们想要获取读锁定时,read_lock()最终会调用_raw_read_trylock()

static inline int _raw_read_trylock(rwlock_t *lock)
{
    atomic_t *count = (atomic_t *)lock;
    atomic_dec(count);
    if (atomic_read(count) >= 0)
        return 1;
    atomic_inc(count);
    return 0;
}

在此函数中,我们调用atomic_dec()来减少lock并检查它是否大于或等于零。但是,因为lockunsigned intlock总是大于0!也就是说,此函数将始终返回1.

我猜测atomic_read()会将结果转换为int,但在i386 arch中,它被定义为

#define atomic_read(v)      ((v)->counter)

我不知道unsigned int lock是如何运作的。

0 个答案:

没有答案