15 uint nread
; // number of bytes read
16 uint nwrite
; // number of bytes written
17 int readopen
; // read fd is still open
18 int writeopen
; // write fd is still open
22 pipealloc(struct file
**f0
, struct file
**f1
)
28 if((*f0
= filealloc()) == 0 || (*f1
= filealloc()) == 0)
30 if((p
= (struct pipe
*)kalloc()) == 0)
36 initlock(&p
->lock
, "pipe");
37 (*f0
)->type
= FD_PIPE
;
41 (*f1
)->type
= FD_PIPE
;
58 pipeclose(struct pipe
*p
, int writable
)
68 if(p
->readopen
== 0 && p
->writeopen
== 0){
76 pipewrite(struct pipe
*p
, char *addr
, int n
)
81 for(i
= 0; i
< n
; i
++){
82 while(p
->nwrite
== p
->nread
+ PIPESIZE
){ //DOC: pipewrite-full
83 if(p
->readopen
== 0 || proc
->killed
){
88 sleep(&p
->nwrite
, &p
->lock
); //DOC: pipewrite-sleep
90 p
->data
[p
->nwrite
++ % PIPESIZE
] = addr
[i
];
92 wakeup(&p
->nread
); //DOC: pipewrite-wakeup1
98 piperead(struct pipe
*p
, char *addr
, int n
)
103 while(p
->nread
== p
->nwrite
&& p
->writeopen
){ //DOC: pipe-empty
108 sleep(&p
->nread
, &p
->lock
); //DOC: piperead-sleep
110 for(i
= 0; i
< n
; i
++){ //DOC: piperead-copy
111 if(p
->nread
== p
->nwrite
)
113 addr
[i
] = p
->data
[p
->nread
++ % PIPESIZE
];
115 wakeup(&p
->nwrite
); //DOC: piperead-wakeup