diff options
author | Alon Zakai <alonzakai@gmail.com> | 2012-10-30 14:37:10 -0700 |
---|---|---|
committer | Alon Zakai <alonzakai@gmail.com> | 2012-10-30 14:37:10 -0700 |
commit | 2fb3456c4fefd57f25e08082b9b7771c47188784 (patch) | |
tree | 6e9a424380a14dcfe95454286ded21853fda0a76 | |
parent | e28f99d18f384b98b416af7a9422d0959afab0e8 (diff) |
support growing the socket data buffer, and enable working bigdata socket test
-rw-r--r-- | src/library.js | 26 | ||||
-rwxr-xr-x | tests/runner.py | 2 | ||||
-rw-r--r-- | tests/socket_relay.py | 6 | ||||
-rw-r--r-- | tests/websockets_bi_bigdata.c | 2 | ||||
-rw-r--r-- | tests/websockets_bigdata.h | 4 |
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++) { |