FC2ブログ
メモ帳
メモ帳
スポンサーサイト
--年--月--日 (--) --:-- | 編集
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
wait_eventいろいろ
2007年05月11日 (金) 12:12 | 編集
ノーマルなwait_eventだと使い勝手が悪いってことで
いろいろ種類があるそうな。
int wait_event_interruptible(wait_queue_head_t q, int condition)
イベント待ちの間に割り込みを許可するのがこれ。
割り込みでイベント待ちが解除されたら0以外を返すらしい。

int wait_event_timeout(wait_queue_head_t q, int condition, int time)
イベント待ちを一定の時間が経過したら解除したければこれ。
タイムアウトが発生したら0を返すらしい。
timeはjiffyタイム。n秒にしたければHZ*nとかで(たぶん

int wait_event_interruptible_timeout(wait_queue_head_t q, int condition, int time)
割り込み許可&タイムアウトあり。
戻り値はタイムアウトで0、割り込みで0以下だったかな?
時間内のwake_up要求ならタイムアウトまでの残りのjiffyタイム。

割り込み許可ありの待ちを起こすときは次のwake_upをつかう。
void wake_up_interruptible(wait_queue_head_t *q)
使い方はwake_upと一緒。

で、kthreadに実装

static wait_queue_head_t hoge;
static int        hoge_bool=0;

static int test_thread(void * num)
{
  while(!kthread_should_stop()){
    wait_event_interruptible(hoge, hoge_bool!=0) ;
    //なんか処理
    hoge_bool = 0;
  }
}

static long test_ioctl(struct file *file,
unsigned int cmd, unsigned long arg)
{
  switch(cmd){
    TEST_CASE1:
      //argを外部変数に入れるとか何とか
      hoge_bool = TEST_CASE1;
      wake_up_interruptible(*hoge);
      break;
    //ほかのCASEは省略
  }
  return 0;
}
static int __init init_test(void){ //threadを生成する初期化モジュール
  
  //省略

  init_waitqueue_head(&hoge);

  //thread生成
  th = kthread_run(test_thread, &num, "test_thread");
  if (IS_ERR(th)) {
    //thread生成失敗
    goto ERR_RET;
  }
}

init_moduleでwait_queue_head_t初期化、kthread生成、起動、
スレッドは起動したらスレッドのループ内でイベント待ちでスリープ。
ioctlの呼び出しでwake_upでスレッドをイベント起床させて、何かの処理したら
またイベント待ちでスリープ。
適当なんで動くかわからんけど。
コメント
この記事へのコメント
コメントを投稿する
URL :
コメント :
パスワード :
秘密 : 管理者にだけ表示を許可する
 
トラックバック
この記事のトラックバックURL
この記事へのトラックバック
copyright © 2004 Powered By FC2 allrights reserved. / template: sukechan
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。