Skip to content

Commit 04a92cb

Browse files
committed
feat: use C++ threads and messaging for workers mirroring iOS implementation and handle SharedArrayBuffer
1 parent 55da2da commit 04a92cb

23 files changed

Lines changed: 1696 additions & 995 deletions

test-app/app/src/main/assets/app/mainpage.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ require("./tests/requireExceptionTests");
4949
require("./tests/java-array-test");
5050
require("./tests/field-access-test");
5151
require("./tests/byte-buffer-test");
52+
require("./tests/shared-array-buffer-test");
5253
require("./tests/dex-interface-implementation");
5354
require("./tests/testInterfaceImplementation");
5455
require("./tests/testRuntimeImplementedAPIs");
Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
describe("Tests SharedArrayBuffer conversion", function () {
2+
it("should pass a SharedArrayBuffer to a Java method expecting ByteBuffer", function () {
3+
var sab = new SharedArrayBuffer(8);
4+
var view = new Uint8Array(sab);
5+
for (var i = 0; i < 8; i++) {
6+
view[i] = i + 1;
7+
}
8+
9+
// resolves the ByteBuffer.put(ByteBuffer) overload and copies from the
10+
// direct buffer created over the SharedArrayBuffer's memory
11+
var bb = java.nio.ByteBuffer.allocateDirect(8);
12+
bb.put(sab);
13+
bb.flip();
14+
15+
var roundTripped = new Uint8Array(ArrayBuffer.from(bb));
16+
for (var i = 0; i < 8; i++) {
17+
expect(roundTripped[i]).toBe(i + 1);
18+
}
19+
});
20+
21+
it("should respect byteOffset and length of typed array views over a SharedArrayBuffer", function () {
22+
var sab = new SharedArrayBuffer(16);
23+
var full = new Uint8Array(sab);
24+
for (var i = 0; i < 16; i++) {
25+
full[i] = i;
26+
}
27+
28+
var slice = new Uint8Array(sab, 4, 8); // bytes 4..11
29+
30+
var bb = java.nio.ByteBuffer.allocateDirect(8);
31+
bb.put(slice);
32+
bb.flip();
33+
34+
var roundTripped = new Uint8Array(ArrayBuffer.from(bb));
35+
for (var i = 0; i < 8; i++) {
36+
expect(roundTripped[i]).toBe(i + 4);
37+
}
38+
});
39+
40+
it("should share memory between the SharedArrayBuffer and the Java buffer (no copy)", function () {
41+
var sab = new SharedArrayBuffer(4);
42+
var view = new Uint8Array(sab);
43+
view[0] = 42;
44+
45+
// requireNonNull returns its argument, handing back the direct
46+
// ByteBuffer the runtime created over the SharedArrayBuffer's memory
47+
var javaBuf = java.util.Objects.requireNonNull(sab);
48+
expect(javaBuf.get(0)).toBe(42);
49+
50+
// mutations after the call are visible through the Java buffer
51+
view[0] = 99;
52+
expect(javaBuf.get(0)).toBe(99);
53+
});
54+
55+
it("should share a SharedArrayBuffer's memory with a worker and a Java buffer at once", function (done) {
56+
var sab = new SharedArrayBuffer(4);
57+
var view = new Int32Array(sab);
58+
view[0] = 0;
59+
60+
var javaBuf = java.util.Objects.requireNonNull(sab);
61+
62+
var worker = new Worker("../shared/Workers/EvalWorker.js");
63+
worker.postMessage({
64+
value: sab,
65+
eval: "var v = new Int32Array(value); v[0] = 1234; postMessage('written');"
66+
});
67+
worker.onmessage = function (msg) {
68+
expect(msg.data).toBe("written");
69+
// the worker's write is visible both to this isolate and to Java
70+
expect(view[0]).toBe(1234);
71+
expect(javaBuf.getInt(0)).toBe(1234);
72+
worker.terminate();
73+
done();
74+
};
75+
});
76+
});

test-app/runtime/CMakeLists.txt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,7 @@ add_library(
9999
src/main/cpp/ArrayHelper.cpp
100100
src/main/cpp/AssetExtractor.cpp
101101
src/main/cpp/CallbackHandlers.cpp
102+
src/main/cpp/ConcurrentQueue.cpp
102103
src/main/cpp/Constants.cpp
103104
src/main/cpp/DirectBuffer.cpp
104105
src/main/cpp/FieldAccessor.cpp
@@ -112,6 +113,7 @@ add_library(
112113
src/main/cpp/JsArgToArrayConverter.cpp
113114
src/main/cpp/JSONObjectHelper.cpp
114115
src/main/cpp/Logger.cpp
116+
src/main/cpp/LooperTasks.cpp
115117
src/main/cpp/ManualInstrumentation.cpp
116118
src/main/cpp/MessageLoopTimer.cpp
117119
src/main/cpp/MetadataMethodInfo.cpp
@@ -135,6 +137,8 @@ add_library(
135137
src/main/cpp/V8GlobalHelpers.cpp
136138
src/main/cpp/V8StringConstants.cpp
137139
src/main/cpp/WeakRef.cpp
140+
src/main/cpp/WorkerMessage.cpp
141+
src/main/cpp/WorkerWrapper.cpp
138142
src/main/cpp/Timers.cpp
139143
src/main/cpp/com_tns_AssetExtractor.cpp
140144
src/main/cpp/com_tns_Runtime.cpp

0 commit comments

Comments
 (0)