void play_sound (int hz, int time) { // hz(Hz), time(msec) int i, wait, ret, tmp; wait = 500*1000/hz; pthread_make_periodic_np(pthread_self(), gethrtime(), wait*1000); for (i = 0; i < hz * 2 * time / 1000; ++i) { ret = pthread_wait_np(); tmp = rtl_inb(0x61); tmp = (i & 1) ? tmp | 0x02 : tmp & ~0x02; rtl_outb(tmp, 0x61); } rtl_outb((inb(0x61) & ~0x02), 0x61); }
void *thread_code(void *t) { int i; for (i = 0; i < score_index; i++){ play_sound(score[i].note, 500*4/score[i].length); } return 0; } int init_module(void) { pthread_attr_t attr; int ret; pthread_attr_init (&attr); ret = pthread_create (&task, &attr, thread_code, NULL); return ret; } void cleanup_module(void) { pthread_cancel (task); pthread_join (task, NULL); }モジュールは,ロード時にinit_module()が呼ばれ,アンロード時には cleanup_module()が呼ばれる. 上記のプログラムではモジュールのロード時に呼ばれるinit_module()内で, thread_code()スレッドが生成され,thread_code()スレッド内から play_sound()が実行される.play_sound内では, pthread_make_periodic_np()により周期が設定され for (;;) 文の中の pthread_wait_np() で周期実行となるようwaitする.