阅读:978回复:0
[提问] Linux ohci.c 代码问题
贴一个有缩进的(没办法,Tab不行 space也不行 只能打点了)
代码有删节 static void usb_api_blocking_completion(struct urb *urb) { . struct usb_api_data *awd = (struct usb_api_data *)urb->context; . . awd->done = 1; . wmb(); . wake_up(&awd->wqh); ~~~~~~~~~~~~~~~~~~~~~~~~~ 他唤醒的是谁 是下面那个schedule_timeout 吗? } // Starts urb and waits for completion or timeout static int usb_start_wait_urb(struct urb *urb, int timeout, int* actual_length) { . DECLARE_WAITQUEUE(wait, current); . struct usb_api_data awd; . int status; . init_waitqueue_head(&awd.wqh); . awd.done = 0; . set_current_state(TASK_UNINTERRUPTIBLE); . add_wait_queue(&awd.wqh, &wait); . urb->context = &awd; . status = usb_submit_urb(urb); . if (status) { . . // something went wrong . . usb_free_urb(urb); . . set_current_state(TASK_RUNNING); . . remove_wait_queue(&awd.wqh, &wait); . . return status; . } . while (timeout && !awd.done) . { . . timeout = schedule_timeout(timeout); . . set_current_state(TASK_UNINTERRUPTIBLE); . . rmb(); . } ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1。这个while 循环是干啥的 睡满timeout 若awd is not done n 那么退出循环 问题:如果timeout 后awd is done 会死循环吗? . set_current_state(TASK_RUNNING); . remove_wait_queue(&awd.wqh, &wait); . if (!timeout && !awd.done) { . . if (urb->status != -EINPROGRESS) { /* No callback?!! */ . . printk(...); status = urb->status; . } else { . . printk("usb_control/bulk_msg: timeout\n"); . . usb_unlink_urb(urb); // remove urb safely . . status = -ETIMEDOUT; . } . status = urb->status; 。。。 。。。 } 为什么schedule_timeout(timeout)? 是起阻塞作用吗?? |
|