teo1234
驱动牛犊
驱动牛犊
  • 注册日期2004-12-28
  • 最后登录2005-02-04
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:977回复:0

[提问] Linux ohci.c 代码问题

楼主#
更多 发布于:2005-01-26 10:20
贴一个有缩进的(没办法,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)?
是起阻塞作用吗??  
游客

返回顶部