Re: [問題] add_wait_queue在kthread的使用方式

作者: bendog (bendog)   2014-12-09 02:13:18
※ 引述《rtt2008 (rtt)》之銘言:
: 小弟讀到ldd3關於wait_queue的sample
: ssize_t sleepy_read (struct file *filp, char _ _user *buf, size_t count,
: loff_t *pos)
: {
: wait_event_interruptible(wq, flag != 0);
: flag = 0;
: return 0;
: }
: ssize_t sleepy_write (struct file *filp, const char _ _user *buf, size_t
: count,
: loff_t *pos)
: {
: flag = 1;
: wake_up_interruptible(&wq);
: return count;
: }
: 我現在將"sleepy_read" 用kernel thread替換
: 每次呼叫sleepy_write就會wake_up wait_queue去讀資料
: static int Mykthread(void *arg)
: {
: DECLARE_WAITQUEUE(wait, current);
: add_wait_queue(&waitqueue, &wait);
: while (1) {
: set_current_state(TASK_INTERRUPTIBLE);
: if (kthread_should_stop())
: break;
: wait_event_interruptible(waitqueue, flag != 0);
: flag = 0;
: schedule_timeout(10 * HZ); //sleep
: set_current_state(TASK_RUNNING);
: // read data
: }
: remove_wait_queue(&wee_wait, &wait);
: return 0;
: }
: 請問這裡add_wait_queue要放在while-loop外面還是裡面呢?
: 感謝各位大大回覆!
看你的作用,應該要加在裡面。另外注意signal 也會讓程式起來。 還有task_interrupt
ible 設定完後可能在preempt 環境使thread 離開run queue 。。要特別留意。

Links booklink

Contact Us: admin [ a t ] ucptt.com