diff options
| author | Robert Morris <rtm@csail.mit.edu> | 2020-10-22 06:36:36 -0400 | 
|---|---|---|
| committer | Robert Morris <rtm@csail.mit.edu> | 2020-10-22 06:36:36 -0400 | 
| commit | 147855e5219e91886e71e796fd51fbc6b1a056d2 (patch) | |
| tree | 76d8bb4eee2345576cb877c7e0b98d5afe6ebde7 /kernel | |
| parent | 4df1a265cb994ce9cbf9e7dce88b79b1dd7cc5dd (diff) | |
| download | xv6-labs-147855e5219e91886e71e796fd51fbc6b1a056d2.tar.gz xv6-labs-147855e5219e91886e71e796fd51fbc6b1a056d2.tar.bz2 xv6-labs-147855e5219e91886e71e796fd51fbc6b1a056d2.zip | |
test for closed pipe or killed on every char, not just if pipe full
Diffstat (limited to 'kernel')
| -rw-r--r-- | kernel/pipe.c | 25 | 
1 files changed, 14 insertions, 11 deletions
| diff --git a/kernel/pipe.c b/kernel/pipe.c index 7ed402d..b6eefb9 100644 --- a/kernel/pipe.c +++ b/kernel/pipe.c @@ -76,26 +76,29 @@ pipeclose(struct pipe *pi, int writable)  int  pipewrite(struct pipe *pi, uint64 addr, int n)  { -  int i; -  char ch; +  int i = 0;    struct proc *pr = myproc();    acquire(&pi->lock); -  for(i = 0; i < n; i++){ -    while(pi->nwrite == pi->nread + PIPESIZE){  //DOC: pipewrite-full -      if(pi->readopen == 0 || pr->killed){ -        release(&pi->lock); -        return -1; -      } +  while(i < n){ +    if(pi->readopen == 0 || pr->killed){ +      release(&pi->lock); +      return -1; +    } +    if(pi->nwrite == pi->nread + PIPESIZE){ //DOC: pipewrite-full        wakeup(&pi->nread);        sleep(&pi->nwrite, &pi->lock); +    } else { +      char ch; +      if(copyin(pr->pagetable, &ch, addr + i, 1) == -1) +        break; +      pi->data[pi->nwrite++ % PIPESIZE] = ch; +      i++;      } -    if(copyin(pr->pagetable, &ch, addr + i, 1) == -1) -      break; -    pi->data[pi->nwrite++ % PIPESIZE] = ch;    }    wakeup(&pi->nread);    release(&pi->lock); +    return i;  } | 
