aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/library.js26
-rwxr-xr-xtests/runner.py2
-rw-r--r--tests/socket_relay.py6
-rw-r--r--tests/websockets_bi_bigdata.c2
-rw-r--r--tests/websockets_bigdata.h4
5 files changed, 26 insertions, 14 deletions
diff --git a/src/library.js b/src/library.js
index 4f5d99ee..1cfe309a 100644
--- a/src/library.js
+++ b/src/library.js
@@ -6513,7 +6513,8 @@ LibraryManager.library = {
$Sockets__deps: ['__setErrNo', '$ERRNO_CODES'],
$Sockets: {
- BUFFER_SIZE: 10*1024,
+ BUFFER_SIZE: 10*1024, // initial size
+ MAX_BUFFER_SIZE: 10*1024*1024, // maximum size we will grow the buffer
nextFd: 1,
fds: {},
sockaddr_in_layout: Runtime.generateStructInfo([
@@ -6572,8 +6573,19 @@ LibraryManager.library = {
#endif
for (var i = 0; i < len; i++) { // TODO: typed array set, carefully with ranges, or other trick
info.buffer[info.bufferWrite++] = data[i];
- if (info.bufferWrite == Sockets.BUFFER_SIZE) info.bufferWrite = 0;
- if (info.bufferWrite == info.bufferRead) throw 'socket buffer overflow';
+ if (info.bufferWrite == info.buffer.length) info.bufferWrite = 0;
+ if (info.bufferWrite == info.bufferRead) {
+ // grow the buffer
+ var currLen = info.buffer.length;
+ if (currLen > Sockets.MAX_BUFFER_SIZE) throw 'socket buffer overflow';
+ var newBuffer = new Uint8Array(currLen*2);
+ for (var j = 0; j < currLen; j++) {
+ newBuffer[j] = info.buffer[(info.bufferRead + j)%currLen];
+ }
+ info.bufferRead = 0;
+ info.bufferWrite = currLen;
+ info.buffer = newBuffer;
+ }
}
}
info.sendQueue = [];
@@ -6581,7 +6593,7 @@ LibraryManager.library = {
info.sender = function(data) {
if (data) {
#if SOCKET_DEBUG
- Module.print(['sender', data, data.length, '|', Array.prototype.slice.call(data)]);
+ Module.print(['sender', data, data.length, '|', Array.prototype.slice.call(data)]);
#endif
info.sendQueue.push(new Uint8Array(data)); // must copy, because while this waits memory can change!
} else {
@@ -6619,7 +6631,7 @@ LibraryManager.library = {
while (info.bufferWrite != info.bufferRead && len > 0) {
// write out a byte
{{{ makeSetValue('buf++', '0', 'info.buffer[info.bufferRead++]', 'i8') }}};
- if (info.bufferRead == Sockets.BUFFER_SIZE) info.bufferRead = 0;
+ if (info.bufferRead == info.buffer.length) info.bufferRead = 0;
len--;
ret++;
}
@@ -6675,7 +6687,7 @@ LibraryManager.library = {
_connect(fd, name, {{{ makeGetValue('msg', 'Sockets.msghdr_layout.msg_namelen', 'i32') }}});
}
var bytes = info.bufferWrite - info.bufferRead;
- if (bytes < 0) bytes += Sockets.BUFFER_SIZE;
+ if (bytes < 0) bytes += info.buffer.length;
#if SOCKET_DEBUG
Module.print('recvmsg bytes: ' + bytes);
#endif
@@ -6727,7 +6739,7 @@ LibraryManager.library = {
if (!info) return -1;
var start = info.bufferRead;
var end = info.bufferWrite;
- if (end < start) end += Sockets.BUFFER_SIZE;
+ if (end < start) end += info.buffer.length;
var dest = {{{ makeGetValue('varargs', '0', 'i32') }}};
{{{ makeSetValue('dest', '0', 'end - start', 'i32') }}};
return 0;
diff --git a/tests/runner.py b/tests/runner.py
index e88388e7..a24f2d91 100755
--- a/tests/runner.py
+++ b/tests/runner.py
@@ -9307,7 +9307,7 @@ elif 'browser' in str(sys.argv):
finally:
self.clean_pids()
- def zzztest_zz_websockets_bi_bigdata(self):
+ def test_zz_websockets_bi_bigdata(self):
try:
with self.WebsockHarness(3992, self.make_relay_server(3992, 3994)):
with self.WebsockHarness(3994, no_server=True):
diff --git a/tests/socket_relay.py b/tests/socket_relay.py
index c7adcbfe..5b6403f9 100644
--- a/tests/socket_relay.py
+++ b/tests/socket_relay.py
@@ -29,15 +29,15 @@ class Listener(threading.Thread):
conn, addr = s.accept()
self.conn = conn
while 1:
- time.sleep(1)
+ time.sleep(0.5)
print 'listener', port, 'waiting for data'
- data = conn.recv(1024)
+ data = conn.recv(20*1024)
if not data:
continue
while not self.other.conn:
print 'listener', port, 'waiting for other connection in order to send data'
time.sleep(1)
- print 'listener', port, 'sending data', data
+ print 'listener', port, 'sending data', len(data)
self.other.conn.send(data)
in_listener = Listener()
diff --git a/tests/websockets_bi_bigdata.c b/tests/websockets_bi_bigdata.c
index 9e8635e3..5db2c951 100644
--- a/tests/websockets_bi_bigdata.c
+++ b/tests/websockets_bi_bigdata.c
@@ -127,7 +127,7 @@ int main(void)
"iframe.width = '40%';"
"document.body.appendChild(iframe);"
"console.log('added.');");
- emscripten_set_main_loop(iter, 1, 0);
+ emscripten_set_main_loop(iter, 3, 0);
#else
while (!done) iter(NULL);
#endif
diff --git a/tests/websockets_bigdata.h b/tests/websockets_bigdata.h
index fa1a6b17..17149ad6 100644
--- a/tests/websockets_bigdata.h
+++ b/tests/websockets_bigdata.h
@@ -1,11 +1,11 @@
#include <stdlib.h>
-#define DATA_SIZE 1250
+#define DATA_SIZE (256*256*2)
// 1500 fails
char *generateData() {
- char *ret = malloc(65536*2);
+ char *ret = malloc(256*256*2);
char *curr = ret;
for (int i = 0; i < 256; i++) {
for (int j = 0; j < 256; j++) {