Dolda2000 GitWeb
/
doldaconnect.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
First attempt at replacing sockblock with autoblocking.
[doldaconnect.git]
/
daemon
/
fnet-dc.c
diff --git
a/daemon/fnet-dc.c
b/daemon/fnet-dc.c
index
317a133
..
708215a
100644
(file)
--- a/
daemon/fnet-dc.c
+++ b/
daemon/fnet-dc.c
@@
-2691,7
+2691,7
@@
static void dctransgotdata(struct transfer *transfer, struct dcpeer *peer)
if((peer->state == PEER_TRNS) || (peer->state == PEER_SYNC))
{
if((peer->state == PEER_TRNS) || (peer->state == PEER_SYNC))
{
- if(sockqueue
size(peer->sk) < 65536
)
+ if(sockqueue
left(peer->sk) > 0
)
{
if((buf = transfergetdata(transfer, &bufsize)) != NULL)
{
{
if((buf = transfergetdata(transfer, &bufsize)) != NULL)
{
@@
-2762,18
+2762,14
@@
static void dctransendofdata(struct transfer *transfer, struct dcpeer *peer)
dctransgotdata(transfer, peer);
}
dctransgotdata(transfer, peer);
}
-static void dcwantdata(struct transfer *transfer, struct dcpeer *peer)
-{
- if(transferdatasize(transfer) < 65536)
- sockblock(peer->sk, 0);
-}
-
static void transread(struct socket *sk, struct dcpeer *peer)
{
void *buf;
size_t bufsize;
struct transfer *transfer;
static void transread(struct socket *sk, struct dcpeer *peer)
{
void *buf;
size_t bufsize;
struct transfer *transfer;
+ if(transferdatasize(peer->transfer) < 0)
+ return;
if((buf = sockgetinbuf(sk, &bufsize)) == NULL)
return;
if(peer->transfer == NULL)
if((buf = sockgetinbuf(sk, &bufsize)) == NULL)
return;
if(peer->transfer == NULL)
@@
-2791,8
+2787,12
@@
static void transread(struct socket *sk, struct dcpeer *peer)
transferendofdata(transfer);
return;
}
transferendofdata(transfer);
return;
}
- if(transferdatasize(peer->transfer) > 65535)
- sockblock(sk, 1);
+}
+
+static void dcwantdata(struct transfer *transfer, struct dcpeer *peer)
+{
+ if(transferdatasize(transfer) > 0)
+ transread(peer->sk, peer);
}
static void transerr(struct socket *sk, int err, struct dcpeer *peer)
}
static void transerr(struct socket *sk, int err, struct dcpeer *peer)
@@
-2993,6
+2993,8
@@
static void hubread(struct socket *sk, struct fnetnode *fn)
char *p, *p2;
hub = (struct dchub *)fn->data;
char *p, *p2;
hub = (struct dchub *)fn->data;
+ if(hub->queue.size > 1000)
+ return;
if((newbuf = sockgetinbuf(sk, &datalen)) == NULL)
return;
if(hub->inbufdata > 500000) /* Discard possible malicious data */
if((newbuf = sockgetinbuf(sk, &datalen)) == NULL)
return;
if(hub->inbufdata > 500000) /* Discard possible malicious data */
@@
-3016,8
+3018,6
@@
static void hubread(struct socket *sk, struct fnetnode *fn)
p = p2;
}
memmove(hub->inbuf, p, hub->inbufdata -= p - hub->inbuf);
p = p2;
}
memmove(hub->inbuf, p, hub->inbufdata -= p - hub->inbuf);
- if(hub->queue.size > 1000)
- sockblock(sk, 1);
}
static void huberr(struct socket *sk, int err, struct fnetnode *fn)
}
static void huberr(struct socket *sk, int err, struct fnetnode *fn)
@@
-3234,6
+3234,10
@@
static void peerread(struct socket *sk, struct dcpeer *peer)
size_t datalen, cnlen;
struct command *cmd;
size_t datalen, cnlen;
struct command *cmd;
+ if(peer->state == PEER_CMD) {
+ if((peer->queue.size > 50) || (peer->inbufdata > 65536))
+ return;
+ }
if((newbuf = sockgetinbuf(sk, &datalen)) == NULL)
return;
sizebuf2(peer->inbuf, peer->inbufdata + datalen, 1);
if((newbuf = sockgetinbuf(sk, &datalen)) == NULL)
return;
sizebuf2(peer->inbuf, peer->inbufdata + datalen, 1);
@@
-3259,16
+3263,11
@@
static void peerread(struct socket *sk, struct dcpeer *peer)
{
peer->state = PEER_STOP;
break;
{
peer->state = PEER_STOP;
break;
- } else {
- if(peer->queue.size > 50)
- sockblock(sk, 1);
}
}
} else if(peer->state == PEER_TTHL) {
handletthl(peer);
}
}
}
} else if(peer->state == PEER_TTHL) {
handletthl(peer);
}
- if(peer->inbufdata > 500000)
- sockblock(sk, 1);
}
static void peererror(struct socket *sk, int err, struct dcpeer *peer)
}
static void peererror(struct socket *sk, int err, struct dcpeer *peer)
@@
-3772,7
+3771,7
@@
static int run(void)
quota--;
}
if(hub->queue.size < 1000)
quota--;
}
if(hub->queue.size < 1000)
-
sockblock(hub->sk, 0
);
+
hubread(hub->sk, fn
);
if(quota < 1)
break;
}
if(quota < 1)
break;
}
@@
-3791,7
+3790,7
@@
static int run(void)
quota--;
}
if((peer->queue.size < 50) && (peer->inbufdata < 500000))
quota--;
}
if((peer->queue.size < 50) && (peer->inbufdata < 500000))
-
sockblock(peer->sk, 0
);
+
peerread(peer->sk, peer
);
if(quota < 1)
break;
}
if(quota < 1)
break;
}