DEFINE_MUTEX
DEFINE_MUTEX宏包含在 include\linux\mutex.h文件中
#ifdef CONFIG_DEBUG_MUTEXES
# include <linux/mutex-debug.h>
#else
# define __DEBUG_MUTEX_INITIALIZER(lockname)
/**
* mutex_init - initialize the mutex
* @mutex: the mutex to be initialized
*
* Initialize the mutex to unlocked state.
*
* It is not allowed to initialize an already locked mutex.
*/
# define mutex_init(mutex) \
do { \
static struct lock_class_key __key; \
\
__mutex_init((mutex), #mutex, &__key); \
} while (0)
# define mutex_destroy(mutex) do { } while (0)
#endif
#ifdef CONFIG_DEBUG_LOCK_ALLOC
# define __DEP_MAP_MUTEX_INITIALIZER(lockname) \
, .dep_map = { .name = #lockname }
#else
# define __DEP_MAP_MUTEX_INITIALIZER(lockname)
#endif
#define __MUTEX_INITIALIZER(lockname) \
{ .count = ATOMIC_INIT(1) \
, .wait_lock = __SPIN_LOCK_UNLOCKED(lockname.wait_lock) \
, .wait_list = LIST_HEAD_INIT(lockname.wait_list) \
__DEBUG_MUTEX_INITIALIZER(lockname) \
__DEP_MAP_MUTEX_INITIALIZER(lockname) }
#define DEFINE_MUTEX(mutexname) \
struct mutex mutexname = __MUTEX_INITIALIZER(mutexname)
mutex的结构如下图:
struct mutex {
/* 1: unlocked, 0: locked, negative: locked, possible waiters */
atomic_t count;
spinlock_t wait_lock;
struct list_head wait_list;
#if defined(CONFIG_DEBUG_MUTEXES) || defined(CONFIG_SMP)
struct thread_info *owner;
#endif
#ifdef CONFIG_DEBUG_MUTEXES
const char *name;
void *magic;
#endif
#ifdef CONFIG_DEBUG_LOCK_ALLOC
struct lockdep_map dep_map;
#endif
};
DEFINE_MUTEX的展开:
struct mutex mutexname = {
.count = ATOMIC_INIT(1),
.wait_lock = __SPIN_LOCK_UNLOCKED(mutexname.wait_lock),
.wait_list = LIST_HEAD_INIT(mutexname.wait_list)}
DEFINE_MUTEX相关推荐
- 学习《Linux设备模型浅析之设备篇》笔记(三)
文件/drivers/base/core.c static struct kobject *get_device_parent(struct device *dev, struct device *p ...
- JDK源码分析 NIO实现
总列表:http://hg.openjdk.java.net/ 小版本:http://hg.openjdk.java.net/jdk8u jdk:http://hg.openjdk.java.net/ ...
- linux检查是否有D进程,Linux内核调试技术——进程D状态死锁检测
Linux的进程存在多种状态,如TASK_RUNNING的运行态.EXIT_DEAD的停止态和 TASK_INTERRUPTIBLE的接收信号的等待状态等等(可在include/linux/sched ...
- linux 同步方法剖析,Linux 同步方法剖析
级别: 中级 M. Tim Jones (), 顾问工程师, Emulex 2007 年 11 月 19 日在 学习 Linux® 的过程中,您也许接触过并发(concurrency).临界段(cri ...
- I.MX6 ar1020 SPI device driver hacking
/************************************************************************************* I.MX6 ar1020 ...
- Linux 内核里的“智能指针”【转】
转自:http://blog.jobbole.com/88279/ 众所周知,C/C++语言本身并不支持垃圾回收机制,虽然语言本身具有极高的灵活性,但是当遇到大型的项目时,繁琐的内存管理往往让人痛苦异 ...
- linux 内核 hook函数介绍
在编写linux内核中的网络模块时,用到了钩子函数也就是hook函数.现在来看看linux是如何实现hook函数的. 先介绍一个结构体: struct nf_hook_ops,这个结构体是实现钩子函数 ...
- 详解神秘Linux内核
在开始步入Linux设备驱动程序的神秘世界之前,让我们从驱动程序开发人员的角度看几个内核构成要素,熟悉一些基本的内核概念. 我们将学习内核定时器.同步机制以及内存分配方法.不过,我们还是得从头开始这次 ...
- 内核同步机制——互斥量
互斥量 数组结构:structmutex. 静态定义: DEFINE_MUTEX(name); 动态初始化: mutex_init(&mutex); 操作: mutex_lock(&m ...
- Linux 内核里的“智能指针”
Linux 内核里的"智能指针" from: http://begeek.cn/post/7889.html?ref=myread 众所周知,C/C++语言本身并不支持垃圾回收机制 ...
最新文章
- Java IO: Buffered和Data
- Oracle 11g R2 RAC 高可用连接特性
- Apache ECharts各种图表页面展示
- linux下安装mysql-5.6.41
- C++ Qt全局异常处理器_QT教程
- ajax请求l类型,jquery 的ajax请求示例和注意事项
- 华为机试——计算字符个数
- 使用Oracle 11g新特性 Active Database Duplication 搭建Dataguard环境
- ubuntu 压缩率最高的软件_[图]Linux六大压缩算法横评:Ubuntu 19.10最终选择LZ4
- 微信小程序获取二维码scene参数报错 41030:invalid page rid: xx-xx-xx
- CSS-线性渐变无畸变-环形普通进度条-环形能量块进度条-局部环形普通进度条
- spine 导出纹理_Spine入门 —— 纹理打包
- 蓦然回首,你想要的就在这里
- 虚拟网卡服务器端软件,不再挤房间!自己动手架设自己的“浩方”对战平台
- 计算机技术服务的增值税税率,咨询系统集成技术服务税率
- 热力图pycharm
- 计算机怎么搜索特定格式文件,win10 查找指定类型文件方法_win10怎么查找指定类型文件-win7之家...
- HTTP协议-get与post请求
- 《外星人入侵》 教程详解
- 弘辽科技:淘宝销量数据从哪查?销量怎么提升?