Add proxy_to_pthread option to platform=web

Co-authored-by: Fabio Alessandrelli <fabio.alessandrelli@gmail.com>
This commit is contained in:
Adam Scott 2023-07-20 09:42:03 -04:00
parent c2b916751d
commit 78c2a08fae
No known key found for this signature in database
GPG key ID: 1352C2919D96DDDF
20 changed files with 420 additions and 39 deletions

View file

@ -72,7 +72,8 @@ private:
WASM_EXPORT static void _free_lock(void **p_lock, int p_type);
WASM_EXPORT static Variant _js2variant(int p_type, godot_js_wrapper_ex *p_val);
WASM_EXPORT static void *_alloc_variants(int p_size);
WASM_EXPORT static void _callback(void *p_ref, int p_arg_id, int p_argc);
WASM_EXPORT static void callback(void *p_ref, int p_arg_id, int p_argc);
static void _callback(const JavaScriptObjectImpl *obj, Variant arg);
protected:
bool _set(const StringName &p_name, const Variant &p_value) override;
@ -245,9 +246,10 @@ Variant JavaScriptObjectImpl::callp(const StringName &p_method, const Variant **
return _js2variant(type, &exchange);
}
void JavaScriptObjectImpl::_callback(void *p_ref, int p_args_id, int p_argc) {
void JavaScriptObjectImpl::callback(void *p_ref, int p_args_id, int p_argc) {
const JavaScriptObjectImpl *obj = (JavaScriptObjectImpl *)p_ref;
ERR_FAIL_COND_MSG(obj->_callable.is_null(), "JavaScript callback failed.");
Vector<const Variant *> argp;
Array arg_arr;
for (int i = 0; i < p_argc; i++) {
@ -256,7 +258,20 @@ void JavaScriptObjectImpl::_callback(void *p_ref, int p_args_id, int p_argc) {
int type = godot_js_wrapper_object_getvar(p_args_id, Variant::INT, &exchange);
arg_arr.push_back(_js2variant(type, &exchange));
}
obj->_callable.call(arg_arr);
Variant arg = arg_arr;
#ifdef PROXY_TO_PTHREAD_ENABLED
if (!Thread::is_main_thread()) {
callable_mp_static(JavaScriptObjectImpl::_callback).bind(obj, arg).call_deferred();
return;
}
#endif
_callback(obj, arg);
}
void JavaScriptObjectImpl::_callback(const JavaScriptObjectImpl *obj, Variant arg) {
obj->_callable.call(arg);
// Set return value
godot_js_wrapper_ex exchange;
@ -273,7 +288,7 @@ void JavaScriptObjectImpl::_callback(void *p_ref, int p_args_id, int p_argc) {
Ref<JavaScriptObject> JavaScriptBridge::create_callback(const Callable &p_callable) {
Ref<JavaScriptObjectImpl> out = memnew(JavaScriptObjectImpl);
out->_callable = p_callable;
out->_js_id = godot_js_wrapper_create_cb(out.ptr(), JavaScriptObjectImpl::_callback);
out->_js_id = godot_js_wrapper_create_cb(out.ptr(), JavaScriptObjectImpl::callback);
return out;
}