wait_event()函数集合详解

在对当前的运行的进程进行阻塞时经常会用到wait_event()这个函数,来看看linux内核中时如何实现wait_event()这个函数的。

   先介绍几个宏定义函数:

   1. #define DEFINE_WAIT_FUNC(name, function) \

          wait_queue_t name = {  \

              .private = current, \

              .func    = function, \

              .task_list = LIST_HEAD_INIT((name).task_list),\

              }

   2. #define DEFINE_WAIT(name) \

        DEFINE_WAIT_FUNC(name, autoremove_wake_function)

   3. #define init_wait(name) \

       do{  \

           (name)->private = current;\

           (name)->func    = autoremove_wake_function; \

           INIT_LIST_HEAD(&name->task_list);

         }while(0)


     因此 DEFINE_WAIT(name)定义了一个wait_queue_t结构体,并且将其与当前正在运行的进程进行挂钩,同时定义了当前这个进程在被唤醒以后所做的处理函数 autoremove_wake_function()。


   wait_event()函数的实现:

  

    #define __wait_event(wq, condition) \

      do{           \

          DEFINE_WAIT(__wait);  \  定义并初始化了一个wait_queue_t

          for(;;)            \

            {     \

              prepare_to_wait(&wq, &__wait, TASK_UNINTERRUPTIBLE);\

              if(condition)  \

                 break;   \  

              schedule(); \

             }

           finish_wait(&wq, &__wait); \

         }while(0)

#define wait_event(wq, condition)     \

       do{    \

             if(condition)       \

                break;            \

             __wait_event(wq, condition);   \

         }while(0)

   wait_event_timeout()函数的实现:

 

   #define __wait_event_timeout(wq,condition,ret) \

     do{              \

         DEFINE_WAIT(__wait);  \

         for(;;) \

         {   \

            prepare_to_wait(&wq,&__wait, TASK_UNINTERRUPTIBLE); \

            if(conditon) \

              break; \

            ret = schedule_timeout(ret); \

            if(!ret)        \

              break;            \

         }

         finish_wait(&wq, &__wait); \

       }while(0)

#define wait_event_timeout(wq, conditon, timeout)  \

       ( long __ret = timeout;\

         if(!condition) \

            __wait_event_timeout(wq, conditon, __ret); \

         __ret;)

时间: 2024-08-17 12:13:59

wait_event()函数集合详解的相关文章

C# 集合详解 (适合新手)

System.Collections 命名空间包含接口和类,这些接口和类定义各种对象(如列表.队列.位数组.哈希表和字典)的集合.System.Collections.Generic 命名空间包含定义泛型集合的接口和类,泛型集合允许用户创建强类型集合,它能提供比非泛型强类型集合更好的类型安全性和性能.System.Collections.Specialized 命名空间包含专用的和强类型的集合,例如,链接的列表词典.位向量以及只包含字符串的集合. 在System.Collections命名空间中

集合详解之 Collection

集合详解之 Collection 先来看看集合的继承关系图,如下图所示: 其中: 外框为虚线的表示接口,边框为实线的表示类: 箭头为虚线的表示实现了接口,箭头为实线的表示继承了类. 为了方便理解,我隐藏了一些与本文内容无关的信息,隐藏的这些内容会在后面的章节中进行详细地介绍. 从图中可以看出,集合的根节点是 Collection,而 Collection 下又提供了两大常用集合,分别是: List:使用最多的有序集合,提供方便的新增.修改.删除的操作: Set:集合不允许有重复的元素,在许多需要

集合详解之 Map

集合详解之 Map + 面试题 集合有两个大接口:Collection 和 Map,本文重点来讲解集合中另一个常用的集合类型 Map. 以下是 Map 的继承关系图: Map 简介 Map 常用的实现类如下: Hashtable:Java 早期提供的一个哈希表实现,它是线程安全的,不支持 null 键和值,因为它的性能不如 ConcurrentHashMap,所以很少被推荐使用. HashMap:最常用的哈希表实现,如果程序中没有多线程的需求,HashMap 是一个很好的选择,支持 null 键

PE文件结构与函数导出表——详解与实例

PE文件结构与函数导出表--详解与实例 随着windows系统从Xp升级到Win7.Win8, 从32位升级到64位,PE文件结构在整体未变的情况下发生了一些小的变动,一方面是推荐的程序装载地址未采用,另一方面,导出函数序号不再是简单的升序,而是一定程度上的进行了乱序.本文首先对PE文件结构进行了详尽的解说,接着介绍了如何得出函数导出表,整个过程采用SysWoW64目录下的wininet.dll实例进行说明.在介绍过程中,明确指出了Win7.Win8等新系统相对Xp带来的区别. 文章链接:htt

Python学习入门教程,字符串函数扩充详解

因有用户反映,在基础文章对字符串函数的讲解太过少,故写一篇文章详细讲解一下常用字符串函数.本文章是对:程序员带你十天快速入门Python,玩转电脑软件开发(三)中字符串函数的详解与扩充. 如果您想学习并参与本教程的完善与写作.请在下方讨论区,回复相关问题.一起完善本文章教程的书写. Python字符串常用函数. 声明字符串变量: str = ‘关注做全栈攻城狮,写代码也要读书,爱全栈,更爱生活.’ 下面所有字符串函数函数,是对变量str进行操作: 求字符串长度: 函数使用: 运行结果: 值得注意

自写函数VB6 STUFF函数 和 VB.net 2010 STUFF函数 详解

'*************************************************************************'**模 块 名:自写函数VB6 STUFF函数 和 VB.net 2010 STUFF函数 详解'**说    明:蓝凤凰设计商城 浴火凤凰-郭卫 | 蓝凤凰-魔灵 | 郭卫-icecept'**创 建 人:浴火凤凰-郭卫'**日    期:2015年10月10日  23:13:55'**修 改 人:浴火凤凰-郭卫'**日    期:'**描   

ThinkPHP源码阅读2-----C函数配置文件详解

ThinkPHP的配置非常灵活,可自定义加载.大概看了一下,一共有这几个地方会加载配置文件,方便以后的读取 /** * 获取和设置配置参数 支持批量定义 * * @param string|array $name * 配置变量 * @param mixed $value * 配置值 * @return mixed */ function C($name = null, $value = null) { static $_config = array (); // 无参数时获取所有 if (emp

wp_list_categories函数用法详解

本以为写完新手教程之后,可以不写新手应用方面的文章了的,可今天又有朋友在群里问如何显示每个分类下文章数量这个基础性问题,看来Wordpress中文化还有很长的一段路要走,我们任重而道远啊!好,解决你的问题先:正如标题所说,Wordpress是用wp_list_categories这个函数来显示分类的,其用法是:< ?php wp_list_categories('arguments'); ?>arguments即参数,默认参数设置为: $defaults = array('show_optio

setInterval()函数用法详解

setInterval()函数用法详解:此函数用途相当广泛,在滚动代码或者焦点图片等等效果中都有应用,下面就通过实例简单介绍一下此函数的用法.setInterval()函数可以规定在按照指定的周期来执行一段函数,也就是说每隔一定事件就开始执行一次指定的函数.语法如下: setInterval(code,interval) 此函数具有两个参数,第一个参数规定要执行的函数,第二个参数规定函数两次执行之间的间隔,单位是毫秒(1秒=1000毫秒).代码实例如下: <!DOCTYPE HTML> <