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:
Ruslan Shestopalyuk 2022-12-28 10:29:23 -08:00 коммит произвёл Facebook GitHub Bot
Родитель f16348ca03
Коммит 673d7e81a2
1 изменённых файлов: 21 добавлений и 23 удалений

Просмотреть файл

@ -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>