一. 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);#elseDEFINE_SEMAPHORE(reveive_sem);#endif