码迷,mamicode.com
首页 > 其他好文 > 详细

wait_event()函数集合详解

时间:2014-10-23 06:55:07      阅读:222      评论:0      收藏:0      [点我收藏+]

标签: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;)

wait_event()函数集合详解

标签:wait_event()函数集合

原文地址:http://weiguozhihui.blog.51cto.com/3060615/1566955

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!