lkml.org 
[lkml]   [2010]   [Jan]   [21]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    Date
    From
    SubjectRe: Lots of bugs with current->state = TASK_*INTERRUPTIBLE
    What about something like the following (drivers/macintosh/adb.c):

    add_wait_queue(&state->wait_queue, &wait);
    current->state = TASK_INTERRUPTIBLE;

    for (;;) {
    req = state->completed;
    if (req != NULL)
    state->completed = req->next;
    else if (atomic_read(&state->n_pending) == 0)
    ret = -EIO;
    if (req != NULL || ret != 0)
    break;

    if (file->f_flags & O_NONBLOCK) {
    ret = -EAGAIN;
    break;
    }
    if (signal_pending(current)) {
    ret = -ERESTARTSYS;
    break;
    }
    spin_unlock_irqrestore(&state->lock, flags);
    schedule();
    spin_lock_irqsave(&state->lock, flags);
    }

    current->state = TASK_RUNNING;
    remove_wait_queue(&state->wait_queue, &wait);

    There is a call to schedule eventually after the first current->state
    assignment, but it is not right after.

    thanks,
    julia


    \
     
     \ /
      Last update: 2010-01-21 11:51    [W:0.045 / U:0.176 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site