  .       -
   wait_queue_head_t.       -
  DECLARE_WAIT_QUEUE_HEAD()     -
     init_waitqueue_head (). 
          -
.   ,    , , -
   ,   .   -
        ,  
    (race).

       ,
   .      -
   :     -
  ,     .    
      . 
         -
 .

/*  q     (   ) ,

       */
DECLARE_WAITQUEUE(wait, current) ;

add_wait_queue(q, Swait);

set_current_state(TASK_INTERRUPTIBLE); /*- TASK_UNINTERRUPTIBLE */
/*  condition   ,

   */
while (!condition)
schedule() ;

set_current_state(TASK_RUNNING) ;

remove_wait_queue(q, Swait) ;

 ,      ,   
  .

        DECLARE_WAITQUEUE ().

         add_wait_queue ().
          -
  ,  ,     -
,  . ,   -     
,    wake_up ()   ,  -
  .

      TASK_INTERRUPTIBLE  TASK
UNINTERRUPTIBLE.                                               -

 ,     .  , 
      . 
,    schedule ().

      ,    -
  .   ,   

82  4