8 typedef struct Bufproc Bufproc
;
9 typedef struct Bufq Bufq
;
45 n
+= (q
->end
- q
->start
);
64 while(rendezvous(&b
->wr
, 0) == (void*)~0)
67 write(b
->notefd
, "interrupt", 9);
91 setprocname("bufproc()");
96 while((b
->fd
>= 0) && (queuesize(b
->qh
) >= 64*1024)){
99 while(rendezvous(&b
->wr
, 0) == (void*)~0)
105 if((q
== nil
) && (q
= b
->qf
))
110 q
= kmalloc(sizeof(*q
));
112 q
->end
= q
->start
= &q
->data
[0];
113 ret
= read(fd
, q
->start
, sizeof(q
->data
));
118 if(ret
== -EINTR
|| ret
== -ERESTART
)
124 q
->end
= q
->start
+ ret
;
128 wakeq(&b
->wq
, MAXPROC
);
134 wakeq(&b
->wq
, MAXPROC
);
146 b
= kmallocz(sizeof(*b
), 1);
150 if((pid
= procfork(bufproc
, b
, 0)) < 0)
151 panic("unable to fork bufproc: %r");
152 snprint(buf
, sizeof(buf
), "/proc/%d/note", pid
);
153 b
->notefd
= open(buf
, OWRITE
);
158 int readbufproc(void *bp
, void *data
, int len
, int peek
, int noblock
)
166 while((q
= b
->qh
) == nil
){
176 if((ret
= b
->error
) == 0)
180 if((ret
= sleepq(&b
->wq
, b
, 1)) < 0){
191 n
= q
->end
- q
->start
;
196 memmove(p
, q
->start
, n
);
199 if(q
->start
+n
>= q
->end
){
204 if((b
->qh
= q
->next
) == nil
)
221 while(rendezvous(&b
->wr
, 0) == (void*)~0)
233 int pollbufproc(void *bp
, Ufile
*file
, void *tab
)
241 pollwait(file
, &b
->wq
, tab
);
244 } else if(b
->error
< 0)
253 int nreadablebufproc(void *bp
)
259 ret
= queuesize(b
->qh
);