カーネルコードリーディングお助け君
__user マクロ
code: memo
コンパイラーにポインターを逆参照しないように指示。直接ユーザメモリを参照する実装でも、安全に使用できるようにする。
wake_up_state(struct task_struct *p, unsigned int state)
code:memo
state 状態のプロセス p を起床
schedule()
code:memo
次に実行するプロセスを選択肢、プロセス切り替えを行う
is_global_init()
code:memo
task_struct->tgid が 1 (init プロセス) かどうかチェック
task_participate_group_stop(struct task_struct *task)
code:memo
True ならグループ停止が完了したことを親に伝えたという意味
struct signal_struct *sig = task->signal;
sig->flags = SIGNAL_STOP_STOPPED;
code:memo
SIGSTOP などのストップ系シグナルの処理 (handle) を行う
code:memo
task->jobctl に渡されたペンディング中のビット (@mask) を設定する。
@mask には %JOBCTL_PENDING_MASK などがある。
これらはストップ系シグナルの場合にセットされ (If stop signo is being set,)、
signo はクリアされる (the existing signo is cleared.)。
- true ... 設定成功
- false ... 設定失敗 (task が死んでいる)
code:memo
If true, all threads except ->group_exit_task have pending SIGKILL
sig->flags に SIGNAL_GROUP_EXIT ビットが含まれているか、
sig->group_exit_task が 非NULL なら True
※ #define SIGNAL_GROUP_EXIT>--0x00000004 /* group exit in progress */ signal->group_stop_count
code:memo
スレッドグループ内のプロセスが「スレッドグループ全体が停止中」ということを知るためのカウンタ
dequeue_synchronous_signal(kernel_siginfo_t *info)
code:memo
{
struct task_struct *tsk = current;
struct sigpending *pending = &tsk->pending;
struct sigqueue *q, *sync = NULL;
/*
* Might a synchronous signal be in the queue?
*/
if (!((pending->signal.sig0 & ~tsk->blocked.sig0) & SYNCHRONOUS_MASK)) return 0;
/*
* Return the first synchronous signal in the queue.
*/
list_for_each_entry(q, &pending->list, list) {
/* Synchronous signals have a postive si_code */
if ((q->info.si_code > SI_USER) &&
(sigmask(q->info.si_signo) & SYNCHRONOUS_MASK)) {
sync = q;
goto next;
}
}
return 0;
next:
/*
* Check if there is another siginfo for the same signal.
*/
list_for_each_entry_continue(q, &pending->list, list) {
if (q->info.si_signo == sync->info.si_signo)
goto still_pending;
}
sigdelset(&pending->signal, sync->info.si_signo);
recalc_sigpending();
still_pending:
list_del_init(&sync->list);
copy_siginfo(info, &sync->info);
__sigqueue_free(sync);
return info->si_signo;
}
code:memo