Lines 64-69
struct fifoinfo {
Link Here
|
64 |
struct pipe *fi_pipe; |
64 |
struct pipe *fi_pipe; |
65 |
long fi_readers; |
65 |
long fi_readers; |
66 |
long fi_writers; |
66 |
long fi_writers; |
|
|
67 |
long fi_rgen; |
68 |
long fi_wgen; |
67 |
}; |
69 |
}; |
68 |
|
70 |
|
69 |
static vop_print_t fifo_print; |
71 |
static vop_print_t fifo_print; |
Lines 137-142
fifo_open(ap)
Link Here
|
137 |
struct thread *td; |
139 |
struct thread *td; |
138 |
struct fifoinfo *fip; |
140 |
struct fifoinfo *fip; |
139 |
struct pipe *fpipe; |
141 |
struct pipe *fpipe; |
|
|
142 |
long gen; |
140 |
int error, stops_deferred; |
143 |
int error, stops_deferred; |
141 |
|
144 |
|
142 |
vp = ap->a_vp; |
145 |
vp = ap->a_vp; |
Lines 164-169
fifo_open(ap)
Link Here
|
164 |
PIPE_LOCK(fpipe); |
167 |
PIPE_LOCK(fpipe); |
165 |
if (ap->a_mode & FREAD) { |
168 |
if (ap->a_mode & FREAD) { |
166 |
fip->fi_readers++; |
169 |
fip->fi_readers++; |
|
|
170 |
fip->fi_rgen++; |
167 |
if (fip->fi_readers == 1) { |
171 |
if (fip->fi_readers == 1) { |
168 |
fpipe->pipe_state &= ~PIPE_EOF; |
172 |
fpipe->pipe_state &= ~PIPE_EOF; |
169 |
if (fip->fi_writers > 0) |
173 |
if (fip->fi_writers > 0) |
Lines 179-184
fifo_open(ap)
Link Here
|
179 |
return (ENXIO); |
183 |
return (ENXIO); |
180 |
} |
184 |
} |
181 |
fip->fi_writers++; |
185 |
fip->fi_writers++; |
|
|
186 |
fip->fi_wgen++; |
182 |
if (fip->fi_writers == 1) { |
187 |
if (fip->fi_writers == 1) { |
183 |
fpipe->pipe_state &= ~PIPE_EOF; |
188 |
fpipe->pipe_state &= ~PIPE_EOF; |
184 |
if (fip->fi_readers > 0) |
189 |
if (fip->fi_readers > 0) |
Lines 187-192
fifo_open(ap)
Link Here
|
187 |
} |
192 |
} |
188 |
if ((ap->a_mode & O_NONBLOCK) == 0) { |
193 |
if ((ap->a_mode & O_NONBLOCK) == 0) { |
189 |
if ((ap->a_mode & FREAD) && fip->fi_writers == 0) { |
194 |
if ((ap->a_mode & FREAD) && fip->fi_writers == 0) { |
|
|
195 |
gen = fip->fi_wgen; |
190 |
VOP_UNLOCK(vp, 0); |
196 |
VOP_UNLOCK(vp, 0); |
191 |
stops_deferred = sigallowstop(); |
197 |
stops_deferred = sigallowstop(); |
192 |
error = msleep(&fip->fi_readers, PIPE_MTX(fpipe), |
198 |
error = msleep(&fip->fi_readers, PIPE_MTX(fpipe), |
Lines 194-200
fifo_open(ap)
Link Here
|
194 |
if (stops_deferred) |
200 |
if (stops_deferred) |
195 |
sigdeferstop(); |
201 |
sigdeferstop(); |
196 |
vn_lock(vp, LK_EXCLUSIVE | LK_RETRY); |
202 |
vn_lock(vp, LK_EXCLUSIVE | LK_RETRY); |
197 |
if (error) { |
203 |
if (error != 0 && gen == fip->fi_wgen) { |
198 |
fip->fi_readers--; |
204 |
fip->fi_readers--; |
199 |
if (fip->fi_readers == 0) { |
205 |
if (fip->fi_readers == 0) { |
200 |
PIPE_LOCK(fpipe); |
206 |
PIPE_LOCK(fpipe); |
Lines 214-219
fifo_open(ap)
Link Here
|
214 |
*/ |
220 |
*/ |
215 |
} |
221 |
} |
216 |
if ((ap->a_mode & FWRITE) && fip->fi_readers == 0) { |
222 |
if ((ap->a_mode & FWRITE) && fip->fi_readers == 0) { |
|
|
223 |
gen = fip->fi_rgen; |
217 |
VOP_UNLOCK(vp, 0); |
224 |
VOP_UNLOCK(vp, 0); |
218 |
stops_deferred = sigallowstop(); |
225 |
stops_deferred = sigallowstop(); |
219 |
error = msleep(&fip->fi_writers, PIPE_MTX(fpipe), |
226 |
error = msleep(&fip->fi_writers, PIPE_MTX(fpipe), |
Lines 221-227
fifo_open(ap)
Link Here
|
221 |
if (stops_deferred) |
228 |
if (stops_deferred) |
222 |
sigdeferstop(); |
229 |
sigdeferstop(); |
223 |
vn_lock(vp, LK_EXCLUSIVE | LK_RETRY); |
230 |
vn_lock(vp, LK_EXCLUSIVE | LK_RETRY); |
224 |
if (error) { |
231 |
if (error != 0 && gen == fip->fi_rgen) { |
225 |
fip->fi_writers--; |
232 |
fip->fi_writers--; |
226 |
if (fip->fi_writers == 0) { |
233 |
if (fip->fi_writers == 0) { |
227 |
PIPE_LOCK(fpipe); |
234 |
PIPE_LOCK(fpipe); |