comparison src/pipe.c @ 36:d4e5846ddb48

cbc_piperead
author mir3636
date Fri, 22 Feb 2019 22:15:33 +0900
parents ad1d3b268e2d
children fb3e5a2f76c1
comparison
equal deleted inserted replaced
35:ad1d3b268e2d 36:d4e5846ddb48
114 wakeup(&p->nread); //DOC: pipewrite-wakeup1 114 wakeup(&p->nread); //DOC: pipewrite-wakeup1
115 release(&p->lock); 115 release(&p->lock);
116 return n; 116 return n;
117 } 117 }
118 118
119 int cbc_piperead(struct pipe *p, char *addr, int n, __code (*next)(int ret)) 119 __code cbc_piperead3(){
120 { 120 struct pipe *p = proc->cbc_arg.cbc_console_arg.p;
121 int i; 121 int i = proc->cbc_arg.cbc_console_arg.i;
122 release(&p->lock);
122 123
123 acquire(&p->lock); 124 goto next(i);
125 }
124 126
125 while(p->nread == p->nwrite && p->writeopen){ //DOC: pipe-empty 127 __code cbc_piperead2(){
128 int i = proc->cbc_arg.cbc_console_arg.i;
129 int n = proc->cbc_arg.cbc_console_arg.n;
130 struct pipe *p = proc->cbc_arg.cbc_console_arg.p;
131 char *addr = proc->cbc_arg.cbc_console_arg.addr;
132 if (i < n) {
133 if(p->nread == p->nwrite) {
134 break;
135 }
136 addr[i] = p->data[p->nread++ % PIPESIZE];
137 i ++;
138 proc->cbc_arg.cbc_console_arg.i = i;
139 proc->cbc_arg.cbc_console_arg.p = p;
140 proc->cbc_arg.cbc_console_arg.addr = addr;
141 goto cbc_piperead2();
142 }
143 proc->cbc_arg.cbc_console_arg.p = p;
144 goto cbc_wakeup(&p->nwrite, cbc_piperead3); //DOC: piperead-wakeup
145 }
146
147 __code cbc_piperead1(){
148 struct pipe *p = proc->cbc_arg.cbc_console_arg.p;
149 if (p->nread == p->nwrite && p->writeopen){
126 if(proc->killed){ 150 if(proc->killed){
127 release(&p->lock); 151 release(&p->lock);
128 goto next(-1); 152 goto next(-1);
129 } 153 }
154 proc->cbc_arg.cbc_console_arg.p = p;
155 goto cbc_sleep(&p->nread, &p->lock, cbc_piperead1);
156 }
157 int i = 0;
158 proc->cbc_arg.cbc_console_arg.i = i;
159 proc->cbc_arg.cbc_console_arg.p = p;
160 goto cbc_piperead2();
161 }
130 162
131 sleep(&p->nread, &p->lock); //DOC: piperead-sleep*/ 163 __code cbc_piperead(struct pipe *p, char *addr, int n, __code (*next)(int ret))
132 } 164 {
165 acquire(&p->lock);
166 proc->cbc_arg.cbc_console_arg.n = n;
167 proc->cbc_arg.cbc_console_arg.p = p;
168 proc->cbc_arg.cbc_console_arg.addr = addr;
169 goto cbc_piperead1();
170 }
133 171
134 for(i = 0; i < n; i++){ //DOC: piperead-copy
135 if(p->nread == p->nwrite) {
136 break;
137 }
138
139 addr[i] = p->data[p->nread++ % PIPESIZE];
140 }
141
142 goto cbc_wakeup(&p->nwrite); //DOC: piperead-wakeup
143 release(&p->lock);
144
145 return i;
146 }
147 int piperead(struct pipe *p, char *addr, int n) 172 int piperead(struct pipe *p, char *addr, int n)
148 { 173 {
149 int i; 174 int i;
150 175
151 acquire(&p->lock); 176 acquire(&p->lock);