chiark
/
gitweb
/
~ian
/
chiark-utils.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
improve deadlock section
[chiark-utils.git]
/
cprogs
/
wrbufcore.c
diff --git
a/cprogs/wrbufcore.c
b/cprogs/wrbufcore.c
index 417cb01ac0cef44f7cc03c80f04f0120152fc857..7ed609a00ebfbe1fc97e3637de3a79dc9fcc7281 100644
(file)
--- a/
cprogs/wrbufcore.c
+++ b/
cprogs/wrbufcore.c
@@
-30,19
+30,26
@@
#include "rwbuffer.h"
static size_t waitfill;
#include "rwbuffer.h"
static size_t waitfill;
-static int writing;
+
+int writing;
void wrbufcore_startup(void) {
waitfill= (buffersize*3)/4;
writing=0;
void wrbufcore_startup(void) {
waitfill= (buffersize*3)/4;
writing=0;
+ maxselfd=0;
+}
+
+void fdsetset(int fd, fd_set *set) {
+ FD_SET(fd,set);
+ if (fd >= maxselfd) maxselfd= fd+1;
}
void wrbufcore_prepselect(int rdfd, int wrfd) {
FD_ZERO(&readfds);
}
void wrbufcore_prepselect(int rdfd, int wrfd) {
FD_ZERO(&readfds);
- if (rdfd>=0 && !seeneof && used+1<buffersize)
FD_SET
(rdfd,&readfds);
-
+ if (rdfd>=0 && !seeneof && used+1<buffersize)
fdsetset
(rdfd,&readfds);
+
FD_ZERO(&writefds);
FD_ZERO(&writefds);
- if (writing)
FD_SET
(wrfd,&writefds);
+ if (writing)
fdsetset
(wrfd,&writefds);
}
void wrbufcore_afterselect(int rdfd, int wrfd) {
}
void wrbufcore_afterselect(int rdfd, int wrfd) {
@@
-51,6
+58,7
@@
void wrbufcore_afterselect(int rdfd, int wrfd) {
if (FD_ISSET(wrfd,&writefds) &&
!(rdfd>=0 && FD_ISSET(rdfd,&readfds)) &&
!used) {
if (FD_ISSET(wrfd,&writefds) &&
!(rdfd>=0 && FD_ISSET(rdfd,&readfds)) &&
!used) {
+ wrbuf_report("stopping");
writing= 0;
FD_CLR(wrfd,&writefds);
}
writing= 0;
FD_CLR(wrfd,&writefds);
}
@@
-59,6
+67,7
@@
void wrbufcore_afterselect(int rdfd, int wrfd) {
r= read(rdfd,rp,min(buffersize-1-used,buf+buffersize-rp));
if (!r) {
seeneof=1; writing=1;
r= read(rdfd,rp,min(buffersize-1-used,buf+buffersize-rp));
if (!r) {
seeneof=1; writing=1;
+ wrbuf_report("seeneof");
} else if (r<0) {
if (!(errno == EAGAIN || errno == EINTR)) { perror("read"); exit(1); }
} else {
} else if (r<0) {
if (!(errno == EAGAIN || errno == EINTR)) { perror("read"); exit(1); }
} else {
@@
-66,7
+75,10
@@
void wrbufcore_afterselect(int rdfd, int wrfd) {
rp+= r;
if (rp == buf+buffersize) rp=buf;
}
rp+= r;
if (rp == buf+buffersize) rp=buf;
}
- if (used > waitfill) writing=1;
+ if (used > waitfill) {
+ if (!writing) wrbuf_report("starting");
+ writing=1;
+ }
}
if (FD_ISSET(wrfd,&writefds) && used) {
}
if (FD_ISSET(wrfd,&writefds) && used) {