lock.h

ロックオブジェクトの定義 [詳細]

このグラフは、どのファイルから直接、間接的にインクルードされているかを示しています。

ソースコードを見る。

データ構造

struct  lock_operations
 ロック操作関数構造体 [詳細]
struct  lock_object

マクロ定義

#define ACQUIRE_LOCK(lockobj)   ((lockobj).lock_ops.acquire_lock(&(lockobj)))
#define RELEASE_LOCK(lockobj)   ((lockobj).lock_ops.release_lock(&(lockobj)))
#define RELEASE_LOCK_AND_DISPATCH(lockobj, dspreq)
#define T_ACQUIRE_LOCK(lockobj)
 ロック取得マクロ
#define T_ACQUIRE_LOCK_AND_CHECK_RUNNABLE()
 ロック取得マクロ
#define T_ACQUIRE_NESTED_LOCK(lockobj, lockobj1)
 二段目のロック取得マクロ
#define T_ACQUIRE_NESTED_LOCK_AND_CHECK_RUNNABLE(lockobj1)
 二段目のロック取得マクロ
#define T_RELEASE_LOCK(lockobj)
 ロック解放マクロ
#define T_RELEASE_NESTED_LOCK(lockobj, lockobj1)
 ロック解放マクロ
#define T_RELEASE_LOCK_AND_DISPATCH(lockobj, dspreq)
 ロック解放&ディスパッチマクロ
#define I_ACQUIRE_LOCK(lockobj)
#define I_ACQUIRE_NESTED_LOCK(lockobj, lockobj1)
#define I_RELEASE_LOCK(lockobj)
#define I_RELEASE_NESTED_LOCK(lockobj, lockobj1)
#define LOCKOPS_MY_LOCAL_ACQUIRE_LOCK   my_local_acquire_lock
#define LOCKOPS_MY_LOCAL_RELEASE_LOCK   my_local_release_lock
#define LOCKOPS_LOCAL_ACQUIRE_LOCK   local_acquire_lock
#define LOCKOPS_LOCAL_RELEASE_LOCK   local_release_lock

型定義

typedef lock_object LOCKOBJ
 ロックオブジェクト
typedef lock_operations LOCKOPS
 ロック操作関数構造体

関数

BOOL my_local_acquire_lock (LOCKOBJ *lockobj)
void my_local_release_lock (LOCKOBJ *lockobj)
BOOL local_acquire_lock (LOCKOBJ *lockobj)
 (他プロセッサ上のローカル資源の)ロックの取得
void local_release_lock (LOCKOBJ *lockobj)
 (他プロセッサ上のローカル資源の)ロックの解放


説明

ロックオブジェクトの定義

ロックオブジェクトは,ロック構造を指すポインタと,ロックを取るため のワークエリア,ロックを操作する関数群からなる.ロックを操作する関 数群には,以下の2つの操作が含まれる.

acquire_lockは,ロックの取得に成功した場合に FALSE, ロック待ちの間に割込みが発生した場合に TRUE を返す.

acquire_lock ロックを取得する release_lock ロックを解放する

lock.h で定義されています。


マクロ定義

#define ACQUIRE_LOCK lockobj   )     ((lockobj).lock_ops.acquire_lock(&(lockobj)))
 

lock.h82 行で定義されています。

#define I_ACQUIRE_LOCK lockobj   ) 
 

値:

{                       \
    i_lock_cpu();                                       \
    if ((lockobj).lock_ops.acquire_lock(&(lockobj))) {  \
        goto retry;                                     \
    }                                                   \
}

lock.h210 行で定義されています。

#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.h217 行で定義されています。

#define I_RELEASE_LOCK lockobj   ) 
 

値:

{                   \
    (lockobj).lock_ops.release_lock(&(lockobj));    \
    i_unlock_cpu();                                 \
}

lock.h225 行で定義されています。

#define I_RELEASE_NESTED_LOCK lockobj,
lockobj1   ) 
 

値:

{   \
    (lockobj).lock_ops.release_lock(&(lockobj));    \
}

lock.h230 行で定義されています。

#define LOCKOPS_LOCAL_ACQUIRE_LOCK   local_acquire_lock
 

lock.h250 行で定義されています。

#define LOCKOPS_LOCAL_RELEASE_LOCK   local_release_lock
 

lock.h251 行で定義されています。

#define LOCKOPS_MY_LOCAL_ACQUIRE_LOCK   my_local_acquire_lock
 

lock.h241 行で定義されています。

#define LOCKOPS_MY_LOCAL_RELEASE_LOCK   my_local_release_lock
 

lock.h242 行で定義されています。

#define RELEASE_LOCK lockobj   )     ((lockobj).lock_ops.release_lock(&(lockobj)))
 

lock.h85 行で定義されています。

#define RELEASE_LOCK_AND_DISPATCH lockobj,
dspreq   ) 
 

値:

{   \
    (lockobj).lock_ops.release_lock(&(lockobj));        \
    if (dspreq == TRUE){                                \
        dispatch();                                     \
    }                                                   \
}

lock.h88 行で定義されています。

#define T_ACQUIRE_LOCK lockobj   ) 
 

値:

{                           \
    t_lock_cpu();                                           \
    if ((lockobj).lock_ops.acquire_lock(&(lockobj))) {      \
        t_unlock_cpu();                                     \
        goto retry;                                         \
    }                                                       \
}
ロック取得マクロ

ロックが取得できない場合,その間の割り込み要求に備えて一度CPU ロックを放す

lock.h101 行で定義されています。

 
#define T_ACQUIRE_LOCK_AND_CHECK_RUNNABLE  ) 
 

値:

{               \
    t_lock_cpu();                                           \
    if ((runccb->tsk_lock).lock_ops.acquire_lock(&(runccb->tsk_lock))) {\
        t_unlock_cpu();                                     \
        goto retry;                                         \
    }                                                       \
    else if(!TSTAT_RUNNABLE(runtsk->tstat)){                \
        (runccb->tsk_lock).lock_ops.release_lock(&(runccb->tsk_lock));  \
        t_unlock_cpu();                                     \
        goto retry;                                         \
    }                                                       \
}
ロック取得マクロ

ロックが取得できない場合,その間の割り込み要求に備えて一度CPU ロックを放す.また,CPUロック後,ロック取得するまでの間に自タ スクの状態がRUNNABLE以外に変更されていないかチェックする. タスクの状態が変化していれば,一度ロックを全て開放してリトライ する. 本マクロの使用は,自タスクのロックに対する操作の場合のみである ため,引数はとらず,runccbに対して操作を行う.

lock.h120 行で定義されています。

#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.h139 行で定義されています。

#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.h159 行で定義されています。

#define T_RELEASE_LOCK lockobj   ) 
 

値:

{                   \
    (lockobj).lock_ops.release_lock(&(lockobj));    \
    t_unlock_cpu();                                 \
}
ロック解放マクロ

dispatchする前に,lockを解放させることが必要 従って,dispatch()の前に以下のマクロを発行すること

lock.h179 行で定義されています。

#define T_RELEASE_LOCK_AND_DISPATCH lockobj,
dspreq   ) 
 

値:

{   \
    (lockobj).lock_ops.release_lock(&(lockobj));        \
    if (dspreq) {                                       \
        dispatch();                                     \
    }                                                   \
    t_unlock_cpu();                                     \
}
ロック解放&ディスパッチマクロ

ロック解放後ディスパッチリクエストがあればディスパッチャー を呼び出す

lock.h199 行で定義されています。

#define T_RELEASE_NESTED_LOCK lockobj,
lockobj1   ) 
 

値:

{   \
    (lockobj).lock_ops.release_lock(&(lockobj));    \
}
ロック解放マクロ

両方のロックを同時に解放するものではない.

lock.h189 行で定義されています。


型定義

typedef struct lock_object LOCKOBJ
 

ロックオブジェクト

lock.h60 行で定義されています。

typedef struct lock_operations LOCKOPS
 

ロック操作関数構造体


関数

BOOL local_acquire_lock LOCKOBJ lockobj  ) 
 

(他プロセッサ上のローカル資源の)ロックの取得

mp_config.c148 行で定義されています。

参照先 current_ipending()FALSElock_object::lock_ptrmutex_try_lock()TRUE.

00149 {
00150     do {
00151         if (mutex_try_lock((unsigned int)(lockobj->lock_ptr), PRCID) != 0){
00152             return (FALSE);
00153         }
00154     } while (current_ipending() == 0);
00155     
00156     return (TRUE);
00157 }

関数の呼び出しグラフ:

void local_release_lock LOCKOBJ lockobj  ) 
 

(他プロセッサ上のローカル資源の)ロックの解放

mp_config.c169 行で定義されています。

参照先 lock_object::lock_ptrmutex_unlock().

00170 {
00171     mutex_unlock((unsigned int)(lockobj->lock_ptr), PRCID);
00172 }

関数の呼び出しグラフ:

BOOL my_local_acquire_lock LOCKOBJ lockobj  ) 
 

void my_local_release_lock LOCKOBJ lockobj  ) 
 


Copyright © 2006 by TAKAGI Nobuhisa.
このページは Mon Apr 3 23:49:16 2006 に Doxygen によって生成されました。