about summary refs log tree commit diff
diff options
context:
space:
mode:
authorRichard Nyberg <rnyberg@murmeldjur.se>2005-07-03 09:37:25 +0000
committerRichard Nyberg <rnyberg@murmeldjur.se>2005-07-03 09:37:25 +0000
commitb84c77f1f7303d4fe4cdeddcf4754bf00508983a (patch)
tree50a965e01f5c7b50d2dc5cda26ba8a1f57ff31fe
parentc375a922364dbcfb1fda640868e9c76cccea0e62 (diff)
downloadbtpd-b84c77f1f7303d4fe4cdeddcf4754bf00508983a.tar.gz
btpd-b84c77f1f7303d4fe4cdeddcf4754bf00508983a.zip
New algorithm for bandwidth limitation.
-rw-r--r--btpd/btpd.c1
-rw-r--r--btpd/btpd.h1
-rw-r--r--btpd/net.c76
-rw-r--r--btpd/net.h8
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 *);