Avoid using shared_ptr when forwarding arguments in AsyncCallback (#35731)
Summary: Pull Request resolved: https://github.com/facebook/react-native/pull/35731 [Changelog][Internal] The initial intent was to try and use `unique_ptr` instead of `shared_ptr`, however turns out it complicates code more than it's worth it, so I ended up just factoring the repeated complex parts of the corresponding code to make it easier to reason about. Reviewed By: christophpurrer Differential Revision: D42265274 fbshipit-source-id: 105f57b449934c2e3227e592a76036ca7f61bc35
This commit is contained in:
Родитель
f16348ca03
Коммит
673d7e81a2
|
@ -39,38 +39,36 @@ class AsyncCallback {
|
||||||
}
|
}
|
||||||
|
|
||||||
void call(Args... args) const {
|
void call(Args... args) const {
|
||||||
auto wrapper = callback_->wrapper_.lock();
|
callInternal(std::nullopt, std::forward<Args>(args)...);
|
||||||
if (!wrapper) {
|
|
||||||
throw std::runtime_error("Failed to call invalidated async callback");
|
|
||||||
}
|
|
||||||
|
|
||||||
auto argsTuple = std::make_tuple(std::forward<Args>(args)...);
|
|
||||||
|
|
||||||
wrapper->jsInvoker().invokeAsync(
|
|
||||||
[callback = callback_,
|
|
||||||
argsPtr = std::make_shared<decltype(argsTuple)>(
|
|
||||||
std::move(argsTuple))] { callback->apply(std::move(*argsPtr)); });
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void callWithPriority(SchedulerPriority priority, Args... args) const {
|
void callWithPriority(SchedulerPriority priority, Args... args) const {
|
||||||
auto wrapper = callback_->wrapper_.lock();
|
callInternal(priority, std::forward<Args>(args)...);
|
||||||
if (!wrapper) {
|
|
||||||
throw std::runtime_error("Failed to call invalidated async callback");
|
|
||||||
}
|
|
||||||
|
|
||||||
auto argsTuple = std::make_tuple(std::forward<Args>(args)...);
|
|
||||||
|
|
||||||
wrapper->jsInvoker().invokeAsync(
|
|
||||||
priority,
|
|
||||||
[callback = callback_,
|
|
||||||
argsPtr = std::make_shared<decltype(argsTuple)>(
|
|
||||||
std::move(argsTuple))] { callback->apply(std::move(*argsPtr)); });
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
friend Bridging<AsyncCallback>;
|
friend Bridging<AsyncCallback>;
|
||||||
|
|
||||||
std::shared_ptr<SyncCallback<void(Args...)>> callback_;
|
std::shared_ptr<SyncCallback<void(Args...)>> callback_;
|
||||||
|
|
||||||
|
void callInternal(std::optional<SchedulerPriority> priority, Args... args)
|
||||||
|
const {
|
||||||
|
auto wrapper = callback_->wrapper_.lock();
|
||||||
|
if (!wrapper) {
|
||||||
|
throw std::runtime_error("Failed to call invalidated async callback");
|
||||||
|
}
|
||||||
|
auto fn = [callback = callback_,
|
||||||
|
argsPtr = std::make_shared<std::tuple<Args...>>(
|
||||||
|
std::make_tuple(std::forward<Args>(args)...))] {
|
||||||
|
callback->apply(std::move(*argsPtr));
|
||||||
|
};
|
||||||
|
|
||||||
|
if (priority) {
|
||||||
|
wrapper->jsInvoker().invokeAsync(*priority, std::move(fn));
|
||||||
|
} else {
|
||||||
|
wrapper->jsInvoker().invokeAsync(std::move(fn));
|
||||||
|
}
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
template <typename R, typename... Args>
|
template <typename R, typename... Args>
|
||||||
|
|
Загрузка…
Ссылка в новой задаче