这里便是一段有疑问的代码,始终想不通某一进程调用底层函数,然后底层函数又改变了当前进程的状态,疑问在于:改变进程状态后,而进程调用底层函数还在运行,不知道进程与底层函数关系,似乎不是简单的调用关系。
见有关代码:
// Starts urb and waits for completion or timeout
static int usb_start_wait_urb(urb_t *urb, int timeout, int* actual_length)
{
DECLARE_WAITQUEUE(wait, current);
DECLARE_WAIT_QUEUE_HEAD(wqh);
api_wrapper_data awd;
int status;
awd.wakeup = &wqh;
init_waitqueue_head(&wqh);
current->state = TASK_INTERRUPTIBLE;//改变了当前进程的状态
add_wait_queue(&wqh, &wait);
urb->context = &awd;
status = usb_submit_urb(urb);
if (status) {
// something went wrong
usb_free_urb(urb);
current->state = TASK_RUNNING;
remove_wait_queue(&wqh, &wait);
return status;
}
if (urb->status == -EINPROGRESS) {
while (timeout && urb->status == -EINPROGRESS)
status = timeout = schedule_timeout(timeout);
} else
status = 1;
current->state = TASK_RUNNING;//数据传完后,又改回Running状态
remove_wait_queue(&wqh, &wait);
if (!status) {
// timeout
printk("usb_control/bulk_msg: timeout\n");
usb_unlink_urb(urb); // remove urb safely
status = -ETIMEDOUT;
} else
status = urb->status;
if (actual_length)
*actual_length = urb->actual_length;
usb_free_urb(urb);
return status;
}
搞清楚这个原因很重要,这种用法在linux内核里边很常见,需要掌握这种技术,放在这里,望大牛们留言讨论!!