Mercurial > hg > Members > innparusu > xv6-rpi
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 { |