aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/library.js43
-rw-r--r--tests/enet_client.c6
-rw-r--r--tests/enet_server.c2
-rwxr-xr-xtests/runner.py13
4 files changed, 47 insertions, 17 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') }}};
diff --git a/tests/enet_client.c b/tests/enet_client.c
index 88bb38bb..78c8f314 100644
--- a/tests/enet_client.c
+++ b/tests/enet_client.c
@@ -30,6 +30,10 @@ void main_loop() {
event.packet -> data,
event.peer -> data,
event.channelID);
+
+ int result = strcmp("packetfoo", event.packet->data);
+ REPORT_RESULT();
+
/* Clean up the packet now that we're done using it. */
enet_packet_destroy (event.packet);
break;
@@ -96,7 +100,7 @@ int main (int argc, char ** argv)
"console.log('added.');");
#endif
- emscripten_set_main_loop(main_loop, 1, 1);
+ emscripten_set_main_loop(main_loop, 3, 1);
return 1;
}
diff --git a/tests/enet_server.c b/tests/enet_server.c
index 2f879f53..87c64038 100644
--- a/tests/enet_server.c
+++ b/tests/enet_server.c
@@ -96,7 +96,7 @@ int main (int argc, char ** argv)
exit (EXIT_FAILURE);
}
- emscripten_set_main_loop(main_loop, 1, 1);
+ emscripten_set_main_loop(main_loop, 3, 1);
return 1;
}
diff --git a/tests/runner.py b/tests/runner.py
index f24756f6..f07e0991 100755
--- a/tests/runner.py
+++ b/tests/runner.py
@@ -15,7 +15,6 @@ will use 4 processes. To install nose do something like
from subprocess import Popen, PIPE, STDOUT
import os, unittest, tempfile, shutil, time, inspect, sys, math, glob, tempfile, re, difflib, webbrowser, hashlib, threading, platform, BaseHTTPServer, multiprocessing, functools, stat
-
if len(sys.argv) == 1:
print '''
==============================================================================
@@ -8155,6 +8154,12 @@ fscanfed: 10 - hello
elif 'browser' in str(sys.argv):
# Browser tests.
+ ''' Enable this code to run in another browser than webbrowser detects as default
+ def run_in_other_browser(url):
+ execute(['yourbrowser', url])
+ webbrowser.open_new = run_in_other_browser
+ '''
+
print
print 'Running the browser tests. Make sure the browser allows popups from localhost.'
print
@@ -9358,7 +9363,7 @@ elif 'browser' in str(sys.argv):
finally:
self.clean_pids()
- def zzztest_zz_enet(self):
+ def test_zz_enet(self):
try_delete(self.in_dir('enet'))
shutil.copytree(path_from_root('tests', 'enet'), self.in_dir('enet'))
pwd = os.getcwd()
@@ -9367,12 +9372,12 @@ elif 'browser' in str(sys.argv):
Popen(['python', path_from_root('emmake'), 'make']).communicate()
enet = [self.in_dir('enet', '.libs', 'libenet.a'), '-I'+path_from_root('tests', 'enet', 'include')]
os.chdir(pwd)
- Popen(['python', EMCC, path_from_root('tests', 'enet_server.c'), '-o', 'server.html', '-s', 'SOCKET_DEBUG=1'] + enet).communicate()
+ Popen(['python', EMCC, path_from_root('tests', 'enet_server.c'), '-o', 'server.html'] + enet).communicate()
try:
with self.WebsockHarness(1234, self.make_relay_server(1234, 1236)):
with self.WebsockHarness(1236, no_server=True):
- self.btest('enet_client.c', expected='cheez', args=enet+['-s', 'SOCKET_DEBUG=1'])
+ self.btest('enet_client.c', expected='0', args=enet)
finally:
self.clean_pids()