1. 程式人生 > >DECLARE_WAIT_QUEUE_HEAD(name)使用(linux3.1.0)

DECLARE_WAIT_QUEUE_HEAD(name)使用(linux3.1.0)

目標:初始化一個攝像頭等待佇列頭cam_wait_queue

實現:static  DECLARE_WAIT_QUEUE_HEAD(cam_wait_queue)

使用:wait_event_interruptible(cam_wait_queue,ev_cam);

wait_up_interuptible(&cam_wait_queue);

解釋:

include/linux/wait.h
#define DECLARE_WAIT_QUEUE_HEAD(name) \
	wait_queue_head_t name = __WAIT_QUEUE_HEAD_INITIALIZER(name)

初始化佇列頭name,name結構體:

struct __wait_queue_head {
	spinlock_t lock;
	struct list_head task_list;
};

對結構體的兩個引數初始化:

#define __WAIT_QUEUE_HEAD_INITIALIZER(name) {				\
	.lock		= __SPIN_LOCK_UNLOCKED(name.lock),		\
	.task_list	= { &(name).task_list, &(name).task_list } }

先看第二個引數task_list定義:

struct list_head {
	struct list_head *next, *prev;
};
next=prev,所以name在佇列頭。

這裡lock引數的結構體我簡化了一下,只保留了結構體中的一個引數。

lock結構體:

typedef struct spinlock {
	union {
		struct raw_spinlock rlock;
	};
} spinlock_t;

初始化:

#define __SPIN_LOCK_UNLOCKED(lockname) \
	(spinlock_t ) __SPIN_LOCK_INITIALIZER(lockname)
繼續:
#define __SPIN_LOCK_INITIALIZER(lockname) \
	{ { .rlock = __RAW_SPIN_LOCK_INITIALIZER(lockname) } }
繼續:
#define __RAW_SPIN_LOCK_INITIALIZER(lockname)	\
	{					\
	.raw_lock = __ARCH_SPIN_LOCK_UNLOCKED,	\
	 }

一路追蹤下來,最終

.lock.raw_lock= __ARCH_SPIN_LOCK_UNLOCKED

typedef struct raw_spinlock {
	arch_spinlock_t raw_lock;
} raw_spinlock_t;




相關推薦

DECLARE_WAIT_QUEUE_HEAD(name)使用linux3.1.0

目標:初始化一個攝像頭等待佇列頭cam_wait_queue 實現:static  DECLARE_WAIT_QUEUE_HEAD(cam_wait_queue) 使用:wait_event_interruptible(cam_wait_queue,ev_cam); wai

Egret打包App 修改App名稱和圖標 Egret4.1.0

ring 項目 mil src image val 白色 span value 圖標替換位置在項目res下的drawable這些目錄下,用新圖標覆蓋即可。 這裏我用白色圖片替換了白鷺默認的圖片ic_launcher.png 修改App名字,在res->

霸屏瀏覽器V1.1.0

軟體介紹 霸屏瀏覽器的作用,就是讓客戶機僅提供Web訪問功能,遮蔽其它所有功能,即不允許客戶機退出瀏覽器介面,或者是使用客戶機的其它功能,也不允許關機、重啟命令。 常常用於觸控式螢幕瀏覽器、自助機瀏覽器。 注意:該軟體需要用管理員許可權執行:安裝後右擊桌面的圖示->點屬性-

spring原始碼學習5.1.0——Bean的初始化

目錄 前言 結語 前言 上篇部落格主要介紹了createBean方法,Bean的初始化會有三個主要的方法 createBean:初始化Bean,此時還沒有進行屬性填充 populateBean:進行屬性填充 initializ

angular2v 1.0

step1: 先安裝node,去官網下載,不多提了。 step2: 建立專案根資料夾並建立如下目錄: 其中,node_modules可以先不建立,是由後續命令生成的;systemjs.config.js和tsconfig.json是

spring原始碼閱讀5.1.0——DefaultSingletonBeanRegistry

目錄 前言 程式碼 屬性 總結 前言 看原始碼才知道spring真的是一個大傢伙,之前不注重方法,看的稀裡糊塗的,這裡寫一點自己看框架原始碼的感想,一個框架通常有許多介面定義,繼承體系比較複雜,首先需要了解框架原始碼的組

配置YOLO2ubuntu16.04+cuda8.0+opencv3.1.0

href seconds make fun put ges jre 成功 下載 要求已經安裝好了CUDA 8.0 以及OpenCV3.1.0 YOLO官方網站 配置darknet git clone https://github.com/pjreddie/dark

Storm的StreamID使用樣例版本1.0.2

alt constant rate fields olt topology next blog for 隨手嘗試了一下StreamID的的用法。留個筆記。 ==數據樣例== { "Address": "小橋鎮小橋中學對面", "CityCode": "

Oracle 12c12.1.0.5OEM server agent 安裝配置

stat oem www 忽略 符號 cin .com 至少 打開 註意: 此文檔為生產上操作文檔,省略了IP,oracle用戶server,agent 端至少需要sudo,ping,ssh,創建目錄權限。 一、安裝要求 1.1. 系統情況一覽 IP 數據庫

C# 語言歷史版本特性C# 1.0到C# 8.0匯總

fun github mat 發的 初始 The locks urn 線圖 原文:C# 語言歷史版本特性(C# 1.0到C# 8.0匯總)歷史版本 C#作為微軟2000年以後.NET平臺開發的當家語言,發展至今具有17年的歷史,語言本身具有豐富的特性,微軟對其更新支持

CCF-棋局評估 201803-04版本 2.0------之前寫了一個臃腫的1.0版 ,還沾沾自喜 233

核心 color namespace ace for play class 一個 while 核心 : 博弈搜索樹    雙方得分互為相反數    dfs (x,y,player): 玩家player下完(x,y)之後的得分最大值 易錯: 先判斷輸贏,再判斷

Windows下編譯Yolov3CUDA9.1+cudnn7.0+OpenCV 3.1.0

按照官網給出CUDA9.1+cudnn7.0+OpenCV 3.1.0的版本安裝 1 安裝CUDA 9.1 預設位置安裝後發現環境變數自動加入了path   2 安裝cudnn 7.0.5 for cuda 9.1 下載地址:https://dev

各個 C# 版本的主要特性、釋出日期和釋出方式C# 1.0 - 7.3

原文 各個 C# 版本的主要特性、釋出日期和釋出方式(C# 1.0 - 7.3) 本文收集各個 C# 版本的主要特性、釋出日期和釋出方式。 C# 8.0 尚在預覽版本 C# 7.3 2018 年 5 月 隨 Visual Studio 2017 v15.7 釋出 C#

TensorFlow版本更新1.0升到1.8,查詢版本

先設定pip下載優先選擇清華映象,這樣下載快很多 pip install pip -U pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple 安裝命令: 對於 GPU 版本: (也可以用pip3)

spring原始碼學習5.1.0版本——Bean的初始化

目錄   前言 createBean 有自定義TargetSource代理類的生成 resolveBeforeInstantiation applyBeanPostProcessorsBeforeInstantiation postProcessBeforeIn

spring原始碼學習5.1.0版本——Bean的初始化

目錄   前言 源頭 preInstantiateSingletons方法 getBean(String beanName) doGetBean getObjectForBeanInstance getObjectFromFactoryBean doGe

HBase叢集的搭建版本:2.1.0

(004)HBase是一個在HDFS上開發的面向列的分散式資料庫。如果需要實時地隨機訪問超大規模資料集,就可以使用HBase這一Hadoop應用了 HBase叢集的搭建 前提條件 Hadoop叢集 ZooKeeper叢集 JDK 原料 h

自己動手實現一個簡單的Mybatis初級版本1.0

手寫Mybatis-v1.0 原始碼連結(包括v1.0與v2.0): https://github.com/staticLin/customMyBatis.git 從上一個文章 ---Mybatis概述中瞭解到了Mybatis的主要架構與底層原理流程,結尾給出了一個巨集觀流程圖,可

vue.js篩選功能基於1.0版本

<!DOCTYPE html> <html lang="zh">     <head>         <meta charset="UTF-8" />         <meta name="viewport" con

MySQL---高可用修改版1.0

MySQL高可用 因為主從複製是由Master伺服器負責寫操作,因而會存在單點失敗的隱患,所以需要提高HA高可用性 本文介紹了以下方法實現MySQL的高可用性 一、MHA高可用(Master High Availability) 原理:建立一個Manager管理者,它