aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlon Zakai <alonzakai@gmail.com>2012-10-26 11:45:21 -0700
committerAlon Zakai <alonzakai@gmail.com>2012-10-26 11:45:21 -0700
commit3f855a246e873ca2c862e3747f530cd0544f2f25 (patch)
tree43ab90203593c76d6b5afad0b4cedf47cfc1c7aa
parentff52d178360a0dd1d7bca018d5872d0aaebdfba6 (diff)
emscripten_get_worker_queue_size
-rw-r--r--src/library_browser.js9
-rw-r--r--system/include/emscripten/emscripten.h10
-rw-r--r--tests/worker_api_2_main.cpp15
3 files changed, 33 insertions, 1 deletions
diff --git a/src/library_browser.js b/src/library_browser.js
index 7c1d4320..d7aba76f 100644
--- a/src/library_browser.js
+++ b/src/library_browser.js
@@ -574,6 +574,7 @@ mergeInto(LibraryManager.library, {
var info = {
worker: new Worker(url),
callbacks: [],
+ awaited: 0,
buffer: 0,
bufferSize: 0
};
@@ -583,6 +584,7 @@ mergeInto(LibraryManager.library, {
var callbackId = msg.data['callbackId'];
var callbackInfo = info.callbacks[callbackId];
if (!callbackInfo) return; // no callback or callback removed meanwhile
+ info.awaited--;
info.callbacks[callbackId] = null; // TODO: reuse callbackIds, compress this
var data = msg.data['data'];
if (data) {
@@ -619,6 +621,7 @@ mergeInto(LibraryManager.library, {
func: Runtime.getFuncWrapper(callback),
arg: arg
});
+ info.awaited++;
}
info.worker.postMessage({
'funcName': funcName,
@@ -635,6 +638,12 @@ mergeInto(LibraryManager.library, {
'callbackId': workerCallbackId,
'data': data ? {{{ makeHEAPView('U8', 'data', 'data + size') }}} : 0
});
+ },
+
+ emscripten_get_worker_queue_size: function(id) {
+ var info = Browser.workers[id];
+ if (!info) return -1;
+ return info.awaited;
}
});
diff --git a/system/include/emscripten/emscripten.h b/system/include/emscripten/emscripten.h
index 0a136f66..6c421eb5 100644
--- a/system/include/emscripten/emscripten.h
+++ b/system/include/emscripten/emscripten.h
@@ -268,6 +268,16 @@ void emscripten_call_worker(worker_t worker, const char *funcname, char *data, i
void emscripten_worker_respond(char *data, int size);
/*
+ * Checks how many responses are being waited for from a worker. This
+ * only counts calls to emscripten_call_worker that had a non-null
+ * callback (if it's null, we do not have any tracking of a response),
+ * and that the response was not yet received. It is a simple way to
+ * check on the status of the worker to see how busy it is, and do
+ * basic decisions about throttling.
+ */
+int emscripten_get_worker_queue_size(worker_t worker);
+
+/*
* Profiling tools.
* INIT must be called first, with the maximum identifier that
* will be used. BEGIN will add some code that marks
diff --git a/tests/worker_api_2_main.cpp b/tests/worker_api_2_main.cpp
index da24a43b..ec8a6d4b 100644
--- a/tests/worker_api_2_main.cpp
+++ b/tests/worker_api_2_main.cpp
@@ -15,7 +15,7 @@ Info x[3] = { { 22, 3.159, 97, 2.1828 },
{ 55123, 987612.563, 190, 0.0009 },
{ -102, -12.532, -21, -51252 } };
-int stage = 1;
+int stage = -1;
int c3_7 = 0, c3_8 = 0;
@@ -64,6 +64,10 @@ void c2(char *data, int size, void *arg) { // tests queuing up several messages,
void c1(char *data, int size, void *arg) { // tests copying + buffer enlargement
assert((int)arg == stage);
+ if (stage == 1) {
+ printf("wait 0? %d\n", emscripten_get_worker_queue_size(w1));
+ assert(emscripten_get_worker_queue_size(w1) == 0);
+ }
Info *x2 = (Info*)data;
assert(x2 != x && x2 != x+1 && x2 != x+2);
for (int i = 0; i < size/sizeof(Info); i++) {
@@ -78,9 +82,13 @@ void c1(char *data, int size, void *arg) { // tests copying + buffer enlargement
if (stage < 2) {
emscripten_call_worker(w1, "one", (char*)x, sizeof(Info)*3, c1, (void*)2);
} else {
+ printf("wait 1? %d\n", emscripten_get_worker_queue_size(w1));
+ assert(emscripten_get_worker_queue_size(w1) == 0);
emscripten_call_worker(w1, "two", (char*)&x[0], sizeof(Info), c2, (void*)3);
emscripten_call_worker(w1, "two", (char*)&x[1], sizeof(Info), c2, (void*)4);
emscripten_call_worker(w1, "two", (char*)&x[2], sizeof(Info), c2, (void*)5);
+ printf("wait 2? %d\n", emscripten_get_worker_queue_size(w1));
+ assert(emscripten_get_worker_queue_size(w1) == 3);
}
stage++;
}
@@ -88,7 +96,12 @@ void c1(char *data, int size, void *arg) { // tests copying + buffer enlargement
int main() {
w1 = emscripten_create_worker("worker.js");
+ printf("wait -1? %d\n", emscripten_get_worker_queue_size(w1));
+ assert(emscripten_get_worker_queue_size(w1) == 0);
emscripten_call_worker(w1, "one", (char*)x, sizeof(Info)*2, c1, (void*)1);
+ printf("wait -1? %d\n", emscripten_get_worker_queue_size(w1));
+ assert(emscripten_get_worker_queue_size(w1) == 1);
+ stage = 1; // make sure we get here
return 0;
}