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 是没有什么问题的.


已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 技术黑板 设计师:CSDN官方博客 返回首页