comparison src/pipe.c @ 37:fb3e5a2f76c1

fix
author mir3636
date Fri, 22 Feb 2019 22:36:17 +0900
parents d4e5846ddb48
children
comparison
equal deleted inserted replaced
36:d4e5846ddb48 37:fb3e5a2f76c1
117 } 117 }
118 118
119 __code cbc_piperead3(){ 119 __code cbc_piperead3(){
120 struct pipe *p = proc->cbc_arg.cbc_console_arg.p; 120 struct pipe *p = proc->cbc_arg.cbc_console_arg.p;
121 int i = proc->cbc_arg.cbc_console_arg.i; 121 int i = proc->cbc_arg.cbc_console_arg.i;
122 __code(*next)(int ret) = proc->cbc_arg.cbc_console_arg.next;
122 release(&p->lock); 123 release(&p->lock);
123 124
124 goto next(i); 125 goto next(i);
125 } 126 }
126 127
127 __code cbc_piperead2(){ 128 __code cbc_piperead2(){
128 int i = proc->cbc_arg.cbc_console_arg.i; 129 int i = proc->cbc_arg.cbc_console_arg.i;
129 int n = proc->cbc_arg.cbc_console_arg.n; 130 int n = proc->cbc_arg.cbc_console_arg.n;
130 struct pipe *p = proc->cbc_arg.cbc_console_arg.p; 131 struct pipe *p = proc->cbc_arg.cbc_console_arg.p;
131 char *addr = proc->cbc_arg.cbc_console_arg.addr; 132 char *addr = proc->cbc_arg.cbc_console_arg.addr;
132 if (i < n) { 133 if (i < n && !(p->nread == p->nwrite)) {
133 if(p->nread == p->nwrite) {
134 break;
135 }
136 addr[i] = p->data[p->nread++ % PIPESIZE]; 134 addr[i] = p->data[p->nread++ % PIPESIZE];
137 i ++; 135 i ++;
138 proc->cbc_arg.cbc_console_arg.i = i; 136 proc->cbc_arg.cbc_console_arg.i = i;
139 proc->cbc_arg.cbc_console_arg.p = p; 137 proc->cbc_arg.cbc_console_arg.p = p;
140 proc->cbc_arg.cbc_console_arg.addr = addr; 138 proc->cbc_arg.cbc_console_arg.addr = addr;
144 goto cbc_wakeup(&p->nwrite, cbc_piperead3); //DOC: piperead-wakeup 142 goto cbc_wakeup(&p->nwrite, cbc_piperead3); //DOC: piperead-wakeup
145 } 143 }
146 144
147 __code cbc_piperead1(){ 145 __code cbc_piperead1(){
148 struct pipe *p = proc->cbc_arg.cbc_console_arg.p; 146 struct pipe *p = proc->cbc_arg.cbc_console_arg.p;
147 __code(*next)(int ret) = proc->cbc_arg.cbc_console_arg.next;
149 if (p->nread == p->nwrite && p->writeopen){ 148 if (p->nread == p->nwrite && p->writeopen){
150 if(proc->killed){ 149 if(proc->killed){
151 release(&p->lock); 150 release(&p->lock);
152 goto next(-1); 151 goto next(-1);
153 } 152 }
164 { 163 {
165 acquire(&p->lock); 164 acquire(&p->lock);
166 proc->cbc_arg.cbc_console_arg.n = n; 165 proc->cbc_arg.cbc_console_arg.n = n;
167 proc->cbc_arg.cbc_console_arg.p = p; 166 proc->cbc_arg.cbc_console_arg.p = p;
168 proc->cbc_arg.cbc_console_arg.addr = addr; 167 proc->cbc_arg.cbc_console_arg.addr = addr;
168 proc->cbc_arg.cbc_console_arg.next = next;
169 goto cbc_piperead1(); 169 goto cbc_piperead1();
170 } 170 }
171 171
172 int piperead(struct pipe *p, char *addr, int n) 172 int piperead(struct pipe *p, char *addr, int n)
173 { 173 {