test for closed pipe or killed on every char, not just if pipe full
This commit is contained in:
		
							parent
							
								
									329935eca8
								
							
						
					
					
						commit
						e1bb4c7434
					
				
					 1 changed files with 14 additions and 11 deletions
				
			
		| 
						 | 
				
			
			@ -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;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		
		Reference in a new issue