generic software interrupt framework
NetBSDにはgeneric software interrupt frameworkという仕組みがある。
これはボトムハーフハンドラを実現したり、クロック処理等に使われている。
Linuxの*_softirq()に近い。
APIは、
void * softint_establish(u_int flags, void (*func)(void *), void *arg);
でハンドラを登録、
void softint_schedule(void *arg);
で次のmi_switch()時にハンドラが1回実行される。
複数回呼ばれれば、呼ばれた回数だけハンドラが実行される。
NetBSD-currentではmi_switch()の中が以下のように実装されており、一つでもsoftintがpending
されていたら問答無用で即実行、になっている。
#ifndef __HAVE_FAST_SOFTINTS else if (ci->ci_data.cpu_softints != 0) { /* There are pending soft interrupts, so pick one. */ newl = softint_picklwp(); newl->l_stat = LSONPROC; newl->l_pflag |= LP_RUNNING; } #endif /* !__HAVE_FAST_SOFTINTS */
これらのスレッドはリアルタイムキューに入っている模様。