diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/library.js | 43 |
1 files changed, 32 insertions, 11 deletions
diff --git a/src/library.js b/src/library.js index 05bbd3c0..3ca94f70 100644 --- a/src/library.js +++ b/src/library.js @@ -6591,17 +6591,24 @@ LibraryManager.library = { } } } - info.sendQueue = []; + info.sendQueue = new Uint8Array(1024); + info.sendQueueUsed = 0; info.senderWaiting = false; - info.sender = function(data) { + info.sender = function(data, justQueue) { if (data) { #if SOCKET_DEBUG Module.print(['sender', data, data.length, '|', Array.prototype.slice.call(data)]); #endif - info.sendQueue.push(new Uint8Array(data).buffer); // must copy, because while this waits memory can change! + if (info.sendQueueUsed + data.length >= info.sendQueue.length) { + var newQueue = new Uint8Array(2*Math.max(info.sendQueue.length, data.length)); + newQueue.set(info.sendQueue); + info.sendQueue = newQueue; + } + info.sendQueue.set(data, info.sendQueueUsed); // must copy, because while this waits memory can change! + info.sendQueueUsed += data.length; } else { info.senderWaiting = false; // we are a setTimeout callback - if (info.sendQueue.length == 0) return; + if (info.sendQueueUsed == 0) return; } if (info.socket.readyState != info.socket.OPEN) { if (!info.senderWaiting) { @@ -6611,11 +6618,13 @@ LibraryManager.library = { } return; } - for (var i = 0; i < info.sendQueue.length; i++) { - info.socket.send(info.sendQueue[i]); - } - info.sendQueue = []; - } + if (justQueue) return; +#if SOCKET_DEBUG + Module.print('sender actually sending ' + info.sendQueueUsed); +#endif + info.socket.send(new Uint8Array(info.sendQueue.subarray(0, info.sendQueueUsed)).buffer); // TODO: if browser accepts views, can optimize this + info.sendQueueUsed = 0; + }; return 0; }, @@ -6665,17 +6674,24 @@ LibraryManager.library = { var iov = {{{ makeGetValue('msg', 'Sockets.msghdr_layout.msg_iov', 'i8*') }}}; var num = {{{ makeGetValue('msg', 'Sockets.msghdr_layout.msg_iovlen', 'i32') }}}; var ret = 0; +#if SOCKET_DEBUG + Module.print('sendmsg vecs: ' + num); +#endif for (var i = 0; i < num; i++) { var currNum = {{{ makeGetValue('iov', '8*i + 4', 'i32') }}}; +#if SOCKET_DEBUG + Module.print('sendmsg curr size: ' + currNum); +#endif if (!currNum) continue; var currBuf = {{{ makeGetValue('iov', '8*i', 'i8*') }}}; - info.sender(HEAPU8.subarray(currBuf, currBuf+currNum)); + info.sender(HEAPU8.subarray(currBuf, currBuf+currNum), true); ret += currNum; } + info.sender(null); // flush all of these together. Important they get sent as a single socket message return ret; }, - recvmsg__deps: ['$Sockets', 'connect', 'recv', '__setErrNo', '$ERRNO_CODES'], + recvmsg__deps: ['$Sockets', 'connect', 'recv', '__setErrNo', '$ERRNO_CODES', 'htons'], recvmsg: function(fd, msg, flags) { var info = Sockets.fds[fd]; if (!info) return -1; @@ -6697,6 +6713,11 @@ LibraryManager.library = { #if SOCKET_DEBUG Module.print('recvmsg bytes: ' + bytes); #endif + // write source + var name = {{{ makeGetValue('msg', 'Sockets.msghdr_layout.msg_name', '*') }}}; + {{{ makeSetValue('name', 'Sockets.sockaddr_in_layout.sin_addr', 'info.addr', 'i32') }}}; + {{{ makeSetValue('name', 'Sockets.sockaddr_in_layout.sin_port', '_htons(info.port)', 'i16') }}}; + // write data var ret = bytes; var iov = {{{ makeGetValue('msg', 'Sockets.msghdr_layout.msg_iov', 'i8*') }}}; var num = {{{ makeGetValue('msg', 'Sockets.msghdr_layout.msg_iovlen', 'i32') }}}; |