diff options
| author | Richard Nyberg <rnyberg@murmeldjur.se> | 2005-07-03 09:37:25 +0000 |
|---|---|---|
| committer | Richard Nyberg <rnyberg@murmeldjur.se> | 2005-07-03 09:37:25 +0000 |
| commit | b84c77f1f7303d4fe4cdeddcf4754bf00508983a (patch) | |
| tree | 50a965e01f5c7b50d2dc5cda26ba8a1f57ff31fe | |
| parent | c375a922364dbcfb1fda640868e9c76cccea0e62 (diff) | |
| download | btpd-b84c77f1f7303d4fe4cdeddcf4754bf00508983a.tar.gz btpd-b84c77f1f7303d4fe4cdeddcf4754bf00508983a.zip | |
New algorithm for bandwidth limitation.
| -rw-r--r-- | btpd/btpd.c | 1 | ||||
| -rw-r--r-- | btpd/btpd.h | 1 | ||||
| -rw-r--r-- | btpd/net.c | 76 | ||||
| -rw-r--r-- | btpd/net.h | 8 |
4 files changed, 84 insertions, 2 deletions
diff --git a/btpd/btpd.c b/btpd/btpd.c index dfbf8d9..30c8744 100644 --- a/btpd/btpd.c +++ b/btpd/btpd.c @@ -116,6 +116,7 @@ btpd_init(void) btpd.ntorrents = 0; BTPDQ_INIT(&btpd.cm_list); + BTPDQ_INIT(&btpd.bwq); BTPDQ_INIT(&btpd.readq); BTPDQ_INIT(&btpd.writeq); diff --git a/btpd/btpd.h b/btpd/btpd.h index 4a9d2de..d3cf990 100644 --- a/btpd/btpd.h +++ b/btpd/btpd.h @@ -45,6 +45,7 @@ struct btpd { unsigned ntorrents; struct torrent_tq cm_list; + struct bwlim_tq bwq; struct peer_tq readq; struct peer_tq writeq; diff --git a/btpd/net.c b/btpd/net.c index 6a444a4..244e7e4 100644 --- a/btpd/net.c +++ b/btpd/net.c @@ -24,13 +24,48 @@ static unsigned long net_write(struct peer *p, unsigned long wmax); void +net_bw_read_cb(int sd, short type, void *arg) +{ + struct peer *p; + struct bwlim *bw = arg; + + btpd.ibw_left += bw->count; + + unsigned long count = 0; + + while ((p = BTPDQ_FIRST(&btpd.readq)) != NULL && btpd.ibw_left - count > 0) { + BTPDQ_REMOVE(&btpd.readq, p, rq_entry); + p->flags &= ~PF_ON_READQ; + count += p->reader->read(p, btpd.ibw_left - count); + } + btpd.ibw_left -= count; + + BTPDQ_REMOVE(&btpd.bwq, bw, entry); + if (count == 0) + free(bw); + else { + bw->count = count; + event_add(&bw->timer, (& (struct timeval) { 1, 0 })); + BTPDQ_INSERT_TAIL(&btpd.bwq, bw, entry); + } +} + +void net_read_cb(int sd, short type, void *arg) { struct peer *p = (struct peer *)arg; if (btpd.ibwlim == 0) { p->reader->read(p, 0); } else if (btpd.ibw_left > 0) { - btpd.ibw_left -= p->reader->read(p, btpd.ibw_left); + unsigned long nread = p->reader->read(p, btpd.ibw_left); + if (nread > 0) { + struct bwlim *bw = btpd_calloc(1, sizeof(*bw)); + evtimer_set(&bw->timer, net_bw_read_cb, bw); + evtimer_add(&bw->timer, (& (struct timeval) { 1, 0 })); + bw->count = nread; + btpd.ibw_left -= nread; + BTPDQ_INSERT_TAIL(&btpd.bwq, bw, entry); + } } else { p->flags |= PF_ON_READQ; BTPDQ_INSERT_TAIL(&btpd.readq, p, rq_entry); @@ -38,13 +73,48 @@ net_read_cb(int sd, short type, void *arg) } void +net_bw_write_cb(int sd, short type, void *arg) +{ + struct peer *p; + struct bwlim *bw = arg; + + btpd.obw_left += bw->count; + + unsigned long count = 0; + + while ((p = BTPDQ_FIRST(&btpd.writeq)) != NULL && btpd.obw_left - count > 0) { + BTPDQ_REMOVE(&btpd.writeq, p, wq_entry); + p->flags &= ~PF_ON_WRITEQ; + count += net_write(p, btpd.obw_left - count); + } + btpd.obw_left -= count; + + BTPDQ_REMOVE(&btpd.bwq, bw, entry); + if (count == 0) + free(bw); + else { + bw->count = count; + event_add(&bw->timer, (& (struct timeval) { 1, 0 })); + BTPDQ_INSERT_TAIL(&btpd.bwq, bw, entry); + } +} + +void net_write_cb(int sd, short type, void *arg) { struct peer *p = (struct peer *)arg; if (btpd.obwlim == 0) { net_write(p, 0); } else if (btpd.obw_left > 0) { - btpd.obw_left -= net_write(p, btpd.obw_left); + unsigned long nw = net_write(p, btpd.obw_left); + if (nw > 0) { + struct bwlim *bw = btpd_calloc(1, sizeof(*bw)); + evtimer_set(&bw->timer, net_bw_write_cb, bw); + evtimer_add(&bw->timer, (& (struct timeval) { 1, 0 })); + bw->count = nw; + btpd.obw_left -= nw; + BTPDQ_INSERT_TAIL(&btpd.bwq, bw, entry); + } } else { p->flags |= PF_ON_WRITEQ; BTPDQ_INSERT_TAIL(&btpd.writeq, p, wq_entry); @@ -927,6 +997,7 @@ net_by_second(void) } } +#if 0 btpd.obw_left = btpd.obwlim; btpd.ibw_left = btpd.ibwlim; @@ -957,4 +1028,5 @@ net_by_second(void) net_write(p, 0); } } +#endif } diff --git a/btpd/net.h b/btpd/net.h index bd61360..7ceff02 100644 --- a/btpd/net.h +++ b/btpd/net.h @@ -11,6 +11,14 @@ #define MSG_PIECE 7 #define MSG_CANCEL 8 +struct bwlim { + unsigned long count; + struct event timer; + BTPDQ_ENTRY(bwlim) entry; +}; + +BTPDQ_HEAD(bwlim_tq, bwlim); + struct iob_link { BTPDQ_ENTRY(iob_link) entry; void (*kill_buf)(struct io_buffer *); |