chiark
/
gitweb
/
~ian
/
innduct.git
/ commitdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
| commitdiff |
tree
raw
|
patch
|
inline
| side by side (parent:
d69d12a
)
Do not assume that loop->on_fd is idempotent
author
Ian Jackson
<ian@chiark.greenend.org.uk>
Sat, 8 May 2010 13:45:05 +0000
(14:45 +0100)
committer
Ian Jackson
<ian@chiark.greenend.org.uk>
Sat, 8 May 2010 13:45:05 +0000
(14:45 +0100)
backends/innduct.c
patch
|
blob
|
history
diff --git
a/backends/innduct.c
b/backends/innduct.c
index 8104fee469826eb8e83f0b0480e3ecdfd35ab660..29fe5c10ccdfe294d445269648900fc6edf673df 100644
(file)
--- a/
backends/innduct.c
+++ b/
backends/innduct.c
@@
-511,6
+511,7
@@
struct Conn {
ISNODE(Conn);
int fd; /* may be 0, meaning closed (during construction/destruction) */
oop_read *rd; /* likewise */
ISNODE(Conn);
int fd; /* may be 0, meaning closed (during construction/destruction) */
oop_read *rd; /* likewise */
+ int oopwriting; /* since on_fd is not idempotent */
int max_queue, stream;
const char *quitting;
int since_activity; /* periods */
int max_queue, stream;
const char *quitting;
int since_activity; /* periods */
@@
-1547,12
+1548,16
@@
static void conn_maybe_write(Conn *conn) {
conn_make_some_xmits(conn);
if (!conn->xmitu) {
loop->cancel_fd(loop, conn->fd, OOP_WRITE);
conn_make_some_xmits(conn);
if (!conn->xmitu) {
loop->cancel_fd(loop, conn->fd, OOP_WRITE);
+ conn->oopwriting= 0;
return;
}
void *rp= conn_write_some_xmits(conn);
if (rp==OOP_CONTINUE) {
return;
}
void *rp= conn_write_some_xmits(conn);
if (rp==OOP_CONTINUE) {
- loop->on_fd(loop, conn->fd, OOP_WRITE, conn_writeable, conn);
+ if (!conn->oopwriting) {
+ loop->on_fd(loop, conn->fd, OOP_WRITE, conn_writeable, conn);
+ conn->oopwriting= 1;
+ }
return;
} else if (rp==OOP_HALT) {
return;
return;
} else if (rp==OOP_HALT) {
return;