lock.hロックオブジェクトの定義 [詳細]
 
このグラフは、どのファイルから直接、間接的にインクルードされているかを示しています。  
ソースコードを見る。 
 説明
ロックオブジェクトの定義 
ロックオブジェクトは,ロック構造を指すポインタと,ロックを取るため のワークエリア,ロックを操作する関数群からなる.ロックを操作する関 数群には,以下の2つの操作が含まれる. 
acquire_lockは,ロックの取得に成功した場合に FALSE, ロック待ちの間に割込みが発生した場合に TRUE を返す. 
acquire_lock ロックを取得する release_lock ロックを解放する 
 
 lock.h で定義されています。 
 マクロ定義
 
  
    
      
        
          | #define ACQUIRE_LOCK           | 
          (  | 
          lockobj  | 
                     | 
           )  | 
             ((lockobj).lock_ops.acquire_lock(&(lockobj))) | 
         
       
     | 
   
 
 
  
    
      
        
          | #define I_ACQUIRE_LOCK           | 
          (  | 
          lockobj  | 
                     | 
           )  | 
           | 
         
       
     | 
   
 
  
    | 
       
     | 
    
 
値: {                       \
    i_lock_cpu();                                       \
    if ((lockobj).lock_ops.acquire_lock(&(lockobj))) {  \
        goto retry;                                     \
    }                                                   \
}
 
 lock.h の 210 行で定義されています。      | 
   
 
 
  
    
      
        
          | #define I_ACQUIRE_NESTED_LOCK           | 
          (  | 
          lockobj,          |  
           | 
           | 
          lockobj1  | 
                     | 
           )  | 
           | 
         
       
     | 
   
 
  
    | 
       
     | 
    
 
値: {           \
    if ((lockobj).lock_ops.acquire_lock(&(lockobj))) {      \
        (lockobj1).lock_ops.release_lock(&(lockobj1));      \
        i_unlock_cpu();                                     \
        goto retry;                                         \
    }                                                       \
}
 
 lock.h の 217 行で定義されています。      | 
   
 
 
  
    
      
        
          | #define I_RELEASE_LOCK           | 
          (  | 
          lockobj  | 
                     | 
           )  | 
           | 
         
       
     | 
   
 
 
  
    
      
        
          | #define I_RELEASE_NESTED_LOCK           | 
          (  | 
          lockobj,          |  
           | 
           | 
          lockobj1  | 
                     | 
           )  | 
           | 
         
       
     | 
   
 
  
    | 
       
     | 
    
 
値: {   \
    (lockobj).lock_ops.release_lock(&(lockobj));    \
}
 
 lock.h の 230 行で定義されています。      | 
   
 
 
  
    
      
        
          | #define LOCKOPS_LOCAL_ACQUIRE_LOCK   local_acquire_lock           | 
         
       
     | 
   
 
 
  
    
      
        
          | #define LOCKOPS_LOCAL_RELEASE_LOCK   local_release_lock           | 
         
       
     | 
   
 
 
  
    
      
        
          | #define LOCKOPS_MY_LOCAL_ACQUIRE_LOCK   my_local_acquire_lock           | 
         
       
     | 
   
 
 
  
    
      
        
          | #define LOCKOPS_MY_LOCAL_RELEASE_LOCK   my_local_release_lock           | 
         
       
     | 
   
 
 
  
    
      
        
          | #define RELEASE_LOCK           | 
          (  | 
          lockobj  | 
                     | 
           )  | 
             ((lockobj).lock_ops.release_lock(&(lockobj))) | 
         
       
     | 
   
 
 
  
    
      
        
          | #define RELEASE_LOCK_AND_DISPATCH           | 
          (  | 
          lockobj,          |  
           | 
           | 
          dspreq  | 
                     | 
           )  | 
           | 
         
       
     | 
   
 
  
    | 
       
     | 
    
 
値: {   \
    (lockobj).lock_ops.release_lock(&(lockobj));        \
    if (dspreq == TRUE){                                \
        dispatch();                                     \
    }                                                   \
}
 
 lock.h の 88 行で定義されています。      | 
   
 
 
  
    
      
        
          | #define T_ACQUIRE_LOCK           | 
          (  | 
          lockobj  | 
                     | 
           )  | 
           | 
         
       
     | 
   
 
  
    | 
       
     | 
    
 
値: {                           \
    t_lock_cpu();                                           \
    if ((lockobj).lock_ops.acquire_lock(&(lockobj))) {      \
        t_unlock_cpu();                                     \
        goto retry;                                         \
    }                                                       \
}
 ロック取得マクロ 
ロックが取得できない場合,その間の割り込み要求に備えて一度CPU ロックを放す 
 
 lock.h の 101 行で定義されています。      | 
   
 
 
  
    
      
        
          | #define T_ACQUIRE_LOCK_AND_CHECK_RUNNABLE           | 
          (  | 
 
                     | 
           )  | 
           | 
         
       
     | 
   
 
  
    | 
       
     | 
    
 
値: ロック取得マクロ 
ロックが取得できない場合,その間の割り込み要求に備えて一度CPU ロックを放す.また,CPUロック後,ロック取得するまでの間に自タ スクの状態がRUNNABLE以外に変更されていないかチェックする. タスクの状態が変化していれば,一度ロックを全て開放してリトライ する. 本マクロの使用は,自タスクのロックに対する操作の場合のみである ため,引数はとらず,runccbに対して操作を行う. 
 
 lock.h の 120 行で定義されています。      | 
   
 
 
  
    
      
        
          | #define T_ACQUIRE_NESTED_LOCK           | 
          (  | 
          lockobj,          |  
           | 
           | 
          lockobj1  | 
                     | 
           )  | 
           | 
         
       
     | 
   
 
  
    | 
       
     | 
    
 
値: {           \
    if ((lockobj).lock_ops.acquire_lock(&(lockobj))) {      \
        (lockobj1).lock_ops.release_lock(&(lockobj1));      \
        t_unlock_cpu();                                     \
        goto retry;                                         \
    }                                                       \
}
 二段目のロック取得マクロ 
ロックが取得できない場合,その間の割り込み要求に備えて一度CPU ロックと外側のロックをはずす 
 
 lock.h の 139 行で定義されています。      | 
   
 
 
  
    
      
        
          | #define T_ACQUIRE_NESTED_LOCK_AND_CHECK_RUNNABLE           | 
          (  | 
          lockobj1  | 
                     | 
           )  | 
           | 
         
       
     | 
   
 
  
    | 
       
     | 
    
 
値: {\
    if ((runccb->tsk_lock).lock_ops.acquire_lock(&(runccb->tsk_lock))) {\
        (lockobj1).lock_ops.release_lock(&(lockobj1));      \
        t_unlock_cpu();                                     \
        goto retry;                                         \
    }                                                       \
    else if(!TSTAT_RUNNABLE(runtsk->tstat)){                \
        (runccb->tsk_lock).lock_ops.release_lock(&(runccb->tsk_lock));\
        (lockobj1).lock_ops.release_lock(&(lockobj1));      \
        t_unlock_cpu();                                     \
        goto retry;                                         \
    }                                                       \
}
 二段目のロック取得マクロ 
ロックが取得できない場合,その間の割り込み要求に備えて一度CPU ロックを放す.また,CPUロック後,ロック取得するまでの間に自タ スクの状態がRUNNABLE以外に変更されていないかチェックする. タスクの状態が変化していれば,一度ロックを全て開放してリトライ する 本マクロの使用は,自タスクのロックに対する操作の場合のみである ため,タスクロックオブジェクトは引数としてとらず,runccbに対し て操作を行う. 
 
 lock.h の 159 行で定義されています。      | 
   
 
 
  
    
      
        
          | #define T_RELEASE_LOCK           | 
          (  | 
          lockobj  | 
                     | 
           )  | 
           | 
         
       
     | 
   
 
  
    | 
       
     | 
    
 
値: {                   \
    (lockobj).lock_ops.release_lock(&(lockobj));    \
    t_unlock_cpu();                                 \
}
 ロック解放マクロ 
dispatchする前に,lockを解放させることが必要 従って,dispatch()の前に以下のマクロを発行すること 
 
 lock.h の 179 行で定義されています。      | 
   
 
 
  
    
      
        
          | #define T_RELEASE_LOCK_AND_DISPATCH           | 
          (  | 
          lockobj,          |  
           | 
           | 
          dspreq  | 
                     | 
           )  | 
           | 
         
       
     | 
   
 
  
    | 
       
     | 
    
 
値: {   \
    (lockobj).lock_ops.release_lock(&(lockobj));        \
    if (dspreq) {                                       \
        dispatch();                                     \
    }                                                   \
    t_unlock_cpu();                                     \
}
 ロック解放&ディスパッチマクロ 
ロック解放後ディスパッチリクエストがあればディスパッチャー を呼び出す 
 
 lock.h の 199 行で定義されています。      | 
   
 
 
  
    
      
        
          | #define T_RELEASE_NESTED_LOCK           | 
          (  | 
          lockobj,          |  
           | 
           | 
          lockobj1  | 
                     | 
           )  | 
           | 
         
       
     | 
   
 
  
    | 
       
     | 
    
 
値: {   \
    (lockobj).lock_ops.release_lock(&(lockobj));    \
}
 ロック解放マクロ 
両方のロックを同時に解放するものではない. 
 
 lock.h の 189 行で定義されています。      | 
   
 
 型定義
 
 
 関数
 
 
  
    
      
        
          | void local_release_lock            | 
          (  | 
          LOCKOBJ *  | 
           lockobj           | 
           )  | 
           | 
         
       
     | 
   
 
 
 
  
    
      
        
          | void my_local_release_lock            | 
          (  | 
          LOCKOBJ *  | 
           lockobj           | 
           )  | 
           | 
         
       
     | 
   
 
 
Copyright © 2006 by TAKAGI Nobuhisa.
 
このページは Mon Apr 3 23:49:16 2006 に Doxygen によって生成されました。 
 | 
 |