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