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 */

これらのスレッドはリアルタイムキューに入っている模様。