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 {
|
||||
auto wrapper = callback_->wrapper_.lock();
|
||||
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)); });
|
||||
callInternal(std::nullopt, std::forward<Args>(args)...);
|
||||
}
|
||||
|
||||
void callWithPriority(SchedulerPriority priority, Args... args) const {
|
||||
auto wrapper = callback_->wrapper_.lock();
|
||||
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)); });
|
||||
callInternal(priority, std::forward<Args>(args)...);
|
||||
}
|
||||
|
||||
private:
|
||||
friend Bridging<AsyncCallback>;
|
||||
|
||||
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>
|
||||
|
|
Загрузка…
Ссылка в новой задаче