init_MUTEX被废除(解决error: implicit declaration of function ‘init_MUTEX’)

CSDNGitHub
init_MUTEX被废除
解决error: implicit declaration of function ‘init_MUTEX’
LDD/problem/port/init_MUTEX


知识共享许可协议
本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可, 转载请注明出处

1 问题


近期在移植驱动的时候, 提示了如下错误

error: implicit declaration of function ‘init_MUTEX’ [-Werror=implicit-function-declaration]

2 原因分析


2.6.37 之后的 Linux 内核中, init_mutex 已经被废除了, 新版本使用 sema_init 函数

查了一下早期版本的定义, 参见include/linux/semaphore.h, version 2.6.36.4, line 42

static inline void sema_init(struct semaphore *sem, int val)
{
    static struct lock_class_key __key;
    *sem = (struct semaphore) __SEMAPHORE_INITIALIZER(*sem, val);
    lockdep_init_map(&sem->lock.dep_map, "semaphore->lock", &__key, 0);
}

#define init_MUTEX(sem)     sema_init(sem, 1)
#define init_MUTEX_LOCKED(sem)  sema_init(sem, 0)

3 解决方案


修改 init_MUTEXsema_init即可, 也可以在驱动中定义 init_MUTEX

  • 修改 init_MUTEXsema_init
#if LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 36) && !defined(init_MUTEX)
    sema_init(&sem, 1);
#else
    init_MUTEX(&sem);
#endif
  • 定义 init_MUTEXsema_init
#if LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 36) && !defined(init_MUTEX)
#define init_MUTEX(sem)     sema_init(sem, 1)
#endif

其实早期的内核中, 定义了 sema_init, 因此其实可以不需要添加 #if #endif 宏, 直接修改 init_MUTEXsema_init 是没有什么问题的.


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值