next up previous contents
Next: Funkcje z rodziny sleep_on Up: Bezpośrednie wywoływanie schedule() Previous: Bezpośrednie wywoływanie schedule()   Spis rzeczy

Przykład bezpośredniego wywołania schedule()

Oto co się dzieje gdy proces chce czytać z pustego pipe'a:

void pipe_wait(struct inode * inode)
{
  DECLARE_WAITQUEUE(wait, current);
  current->state = TASK_INTERRUPTIBLE;
  add_wait_queue(PIPE_WAIT(*inode), &wait);
  up(PIPE_SEM(*inode));
  schedule();
  remove_wait_queue(PIPE_WAIT(*inode), &wait);
  current->state = TASK_RUNNING;
  down(PIPE_SEM(*inode));
}

static ssize_t pipe_read( ... )
{
 ...
  if (PIPE_EMPTY(*inode)) {
    ...
    for (;;) {
      pipe_wait(inode);
      if (!PIPE_EMPTY(*inode))
        break;
    }
  }
...
}
Powyższe funkcje pochodzą z pliku fs/pipe.c



Ignacy Kowalczyk 2001-11-16