mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-11-24 13:21:05 +00:00
22d5d42244
Started callback interface functionality to UniFFI. Currently this only supports the async fire-and-forget use case, where Rust queues a JS function to run, but doesn't wait (or `await`) for the response. The basic system is: - The JS code registers a callback interface handler with the C++ code. This handler is responsible for the specifics of invoking the callback. - The C++ code defines a function to call a JS handler. Once the JS handler registers itself with C++, the C++ registers it's function with Rust. - The C++ code queues the call to the JS main thread. - Because of how UniFFI handles callback interfaces, the C++ code can be "dumb". UniFFI sends a object id, method id, and RustBuffer encoding all arguments. This means C++ doesn't need to care about the specific arguments, they get unpacked by JS. I tried to keep the generated code as simple as possible by moving the complexity to static code. For JS this meant writing a generic `UniFFICallbackHandler` class in the static code that the generated code constructs. For C++ this meant the generated code defines a `UniFFIGetCallbackInterfaceInfo` function that returns a struct with all the data specific to a callback interface (it's name, the UniFFI scaffolding init function, etc). The static code can then define a generic `QueueCallback` function that looks up the callback interface info using the interface ID and then makes the call. Allow UniFFI functions to run on the main thread rather than always being dispatched to a worker thread. This allows us to test invoking callback interfaces from the main thread thread. I don't think we will use this much currently, since we don't want to block the main thread for any significant amount of time. However, this will pair well with the next step in the project which is async -- allowing async Rust functions to call async JS functions. In that scenario, dispatching to the worker thread is unnecessary. Callback interface objects present a potential memory leak, since you can easily create a cycle between a JS Callback object and a UniFFIed Rust object, and the GC has no way of detecting it. To try to detect these there's some shutdown code that checks that there are no callbacks registered during shutdown and prevents any future callbacks from being registered. Added a `config.toml` file and code to parse it. This is needed to specify which functions should run on the main thread. Updated the git commits for the several UniFFI examples/fixtures. Differential Revision: https://phabricator.services.mozilla.com/D156116 |
||
---|---|---|
.. | ||
aom | ||
cups | ||
dav1d | ||
function2 | ||
googletest | ||
highway | ||
intgemm | ||
jpeg-xl | ||
js | ||
libsrtp | ||
libwebrtc | ||
msgpack | ||
pipewire | ||
prio | ||
python | ||
rlbox | ||
rlbox_wasm2c_sandbox | ||
rust | ||
sipcc | ||
sqlite3 | ||
wasm2c | ||
webkit/PerformanceTests | ||
WinToast | ||
moz.build |