diff options
author | Jan Kiszka <jan.kiszka@siemens.com> | 2012-03-30 19:29:08 +0200 |
---|---|---|
committer | Jan Kiszka <jan.kiszka@siemens.com> | 2012-03-30 19:43:00 +0200 |
commit | 35e2bb8ff467da6eefef9650fc5b80e224807ebb (patch) | |
tree | 9388babe4d98bae85e0ac9cc2bf1cd54d99a27a3 | |
parent | 8d259f48aeb258c500362056ab52c856eb2fd4f1 (diff) | |
download | slirp-35e2bb8ff467da6eefef9650fc5b80e224807ebb.zip slirp-35e2bb8ff467da6eefef9650fc5b80e224807ebb.tar.gz slirp-35e2bb8ff467da6eefef9650fc5b80e224807ebb.tar.bz2 |
slirp: Signal free input buffer space to io-thread
This massively accelerates slirp reception speed: If data arrives
faster than the guest can read it from the input buffer, the file
descriptor for the corresponding socket was taken out of the fdset for
select. However, the event of the guest reading enough data from the
buffer was not signaled. Thus, the io-thread only noticed this change
on the next time-driven poll. Fix this by kicking the io-thread as
required.
Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
-rw-r--r-- | sbuf.c | 7 |
1 files changed, 7 insertions, 0 deletions
@@ -6,6 +6,7 @@ */ #include <slirp.h> +#include <main-loop.h> static void sbappendsb(struct sbuf *sb, struct mbuf *m); @@ -16,6 +17,8 @@ void sbfree(struct sbuf *sb) void sbdrop(struct sbuf *sb, int num) { + int limit = sb->sb_datalen / 2; + /* * We can only drop how much we have * This should never succeed @@ -26,6 +29,10 @@ void sbdrop(struct sbuf *sb, int num) sb->sb_rptr += num; if (sb->sb_rptr >= sb->sb_data + sb->sb_datalen) sb->sb_rptr -= sb->sb_datalen; + + if (sb->sb_cc < limit && sb->sb_cc + num >= limit) { + qemu_notify_event(); + } } void sbreserve(struct sbuf *sb, int size) |