天天看點

Linux kernel 之 rwlock_t semaphore初始化一. rwlock_t 二. semaphore

一. rwlock_t

一直都以這種方式初始化讀寫鎖

rwlock_t my_rwlock = RW_LOCK_UNLOCKED
           

但是在核心 2.6.30 上不行了 ....

error: ‘RW_LOCK_UNLOCKED’ undeclared (first use in this function)

error: (Each undeclared identifier is reported only once

error: for each function it appears in.)

貌似是高版本核心不支援這種初始化方式了

需要:

rwlock_t mylock;
rwlock_init(&mylock);
           

或者直接定義并初始化:

DEFINE_RWLOCK(x)
           

二. semaphore

另外,高版本核心信号量的初始化方式也發生了變化

原來的初始化 DECLARE_MUTEX(receive_sem);

會出現:

warning: data definition has no type or storage class

warning: type defaults to ‘int’ in declaration of ‘DECLARE_MUTEX’

warning: parameter names (without types) in function declaration

原來在 include/linux/semaphore.h 中,先前的

#define __SEMAPHORE_INITIALIZER(name, n)                \
{                                   \
    .lock       = __SPIN_LOCK_UNLOCKED((name).lock),        \
    .count      = n,                        \
    .wait_list  = LIST_HEAD_INIT((name).wait_list),     \
}

#define DECLARE_MUTEX(name) \
    struct semaphore name = __SEMAPHORE_INITIALIZER(name, 1)
           

變成了現在的

#define __SEMAPHORE_INITIALIZER(name, n)                                \
{                                                                       \
        .lock           = __SPIN_LOCK_UNLOCKED((name).lock),            \
        .count          = n,                                            \
        .wait_list      = LIST_HEAD_INIT((name).wait_list),             \
}

#define DEFINE_SEMAPHORE(name)  \
        struct semaphore name = __SEMAPHORE_INITIALIZER(name, 1)
           

最後做了如下修改, 之後warning就消失了

#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,36)
DECLARE_MUTEX(receive_sem);
#else
DEFINE_SEMAPHORE(reveive_sem);
#endif