aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/library.js26
1 files changed, 19 insertions, 7 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;