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 によって生成されました。
|
|