Skip to content

Commit b5e2091

Browse files
zeyapmeta-codesync[bot]
authored andcommitted
Fix EXC_BAD_ACCESS introduced in #54211 (#54319)
Summary: Pull Request resolved: #54319 ## Changelog: [Internal] [Changed] - Fix EXC_BAD_ACCESS introduced in #54211 Reviewed By: sammy-SC Differential Revision: D85779978 fbshipit-source-id: 7b240e1484fdcc57283325febf75faedaba585cd
1 parent 8a3cc64 commit b5e2091

4 files changed

Lines changed: 39 additions & 72 deletions

File tree

packages/react-native/ReactCommon/react/renderer/animated/NativeAnimatedNodesManager.cpp

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -74,11 +74,13 @@ NativeAnimatedNodesManager::NativeAnimatedNodesManager(
7474
DirectManipulationCallback&& directManipulationCallback,
7575
FabricCommitCallback&& fabricCommitCallback,
7676
StartOnRenderCallback&& startOnRenderCallback,
77-
StopOnRenderCallback&& stopOnRenderCallback) noexcept
77+
StopOnRenderCallback&& stopOnRenderCallback,
78+
FrameRateListenerCallback&& frameRateListenerCallback) noexcept
7879
: directManipulationCallback_(std::move(directManipulationCallback)),
7980
fabricCommitCallback_(std::move(fabricCommitCallback)),
8081
startOnRenderCallback_(std::move(startOnRenderCallback)),
81-
stopOnRenderCallback_(std::move(stopOnRenderCallback)) {
82+
stopOnRenderCallback_(std::move(stopOnRenderCallback)),
83+
frameRateListenerCallback_(std::move(frameRateListenerCallback)) {
8284
if (!fabricCommitCallback_) {
8385
LOG(WARNING)
8486
<< "C++ Animated was setup without commit callback. This may lead to issue where buttons are not tappable when animation is driven by onScroll event.";
@@ -541,7 +543,7 @@ void NativeAnimatedNodesManager::startRenderCallbackIfNeeded(bool isAsync) {
541543
}
542544

543545
if (startOnRenderCallback_) {
544-
startOnRenderCallback_(isAsync);
546+
startOnRenderCallback_([this]() { onRender(); }, isAsync);
545547
}
546548
}
547549

@@ -563,6 +565,10 @@ void NativeAnimatedNodesManager::stopRenderCallbackIfNeeded(
563565
if (stopOnRenderCallback_) {
564566
stopOnRenderCallback_(isAsync);
565567
}
568+
569+
if (frameRateListenerCallback_) {
570+
frameRateListenerCallback_(false);
571+
}
566572
}
567573
}
568574

@@ -1030,6 +1036,10 @@ void NativeAnimatedNodesManager::onRender() {
10301036
"numActiveAnimations",
10311037
activeAnimations_.size());
10321038

1039+
if (frameRateListenerCallback_) {
1040+
frameRateListenerCallback_(true);
1041+
}
1042+
10331043
isOnRenderThread_ = true;
10341044

10351045
{

packages/react-native/ReactCommon/react/renderer/animated/NativeAnimatedNodesManager.h

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -55,14 +55,16 @@ class NativeAnimatedNodesManager {
5555
public:
5656
using DirectManipulationCallback = std::function<void(Tag, const folly::dynamic &)>;
5757
using FabricCommitCallback = std::function<void(std::unordered_map<Tag, folly::dynamic> &)>;
58-
using StartOnRenderCallback = std::function<void(bool isAsync)>;
58+
using StartOnRenderCallback = std::function<void(std::function<void()> &&, bool isAsync)>;
5959
using StopOnRenderCallback = std::function<void(bool isAsync)>;
60+
using FrameRateListenerCallback = std::function<void(bool /* shouldEnableListener */)>;
6061

6162
explicit NativeAnimatedNodesManager(
6263
DirectManipulationCallback &&directManipulationCallback,
6364
FabricCommitCallback &&fabricCommitCallback,
6465
StartOnRenderCallback &&startOnRenderCallback = nullptr,
65-
StopOnRenderCallback &&stopOnRenderCallback = nullptr) noexcept;
66+
StopOnRenderCallback &&stopOnRenderCallback = nullptr,
67+
FrameRateListenerCallback &&frameRateListenerCallback = nullptr) noexcept;
6668

6769
explicit NativeAnimatedNodesManager(std::shared_ptr<UIManagerAnimationBackend> animationBackend) noexcept;
6870

@@ -237,6 +239,7 @@ class NativeAnimatedNodesManager {
237239
std::atomic_bool isRenderCallbackStarted_{false};
238240
const StartOnRenderCallback startOnRenderCallback_;
239241
const StopOnRenderCallback stopOnRenderCallback_;
242+
const FrameRateListenerCallback frameRateListenerCallback_;
240243

241244
std::shared_ptr<EventEmitterListener> eventEmitterListener_{nullptr};
242245

packages/react-native/ReactCommon/react/renderer/animated/NativeAnimatedNodesManagerProvider.cpp

Lines changed: 14 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -19,41 +19,26 @@
1919
namespace facebook::react {
2020

2121
UIManagerNativeAnimatedDelegateImpl::UIManagerNativeAnimatedDelegateImpl(
22-
NativeAnimatedNodesManagerProvider::FrameRateListenerCallback
23-
frameRateListenerCallback)
24-
: frameRateListenerCallback_(std::move(frameRateListenerCallback)) {}
22+
std::weak_ptr<NativeAnimatedNodesManager> manager)
23+
: nativeAnimatedNodesManager_(manager) {}
2524

2625
void UIManagerNativeAnimatedDelegateImpl::runAnimationFrame() {
2726
if (auto nativeAnimatedNodesManagerStrong =
2827
nativeAnimatedNodesManager_.lock()) {
29-
if (frameRateListenerCallback_) {
30-
frameRateListenerCallback_(true);
31-
}
3228
nativeAnimatedNodesManagerStrong->onRender();
3329
}
3430
}
3531

3632
NativeAnimatedNodesManagerProvider::NativeAnimatedNodesManagerProvider(
37-
StartOnRenderCallback startOnRenderCallback,
38-
StopOnRenderCallback stopOnRenderCallback,
39-
FrameRateListenerCallback frameRateListenerCallback)
33+
NativeAnimatedNodesManager::StartOnRenderCallback startOnRenderCallback,
34+
NativeAnimatedNodesManager::StopOnRenderCallback stopOnRenderCallback,
35+
NativeAnimatedNodesManager::FrameRateListenerCallback
36+
frameRateListenerCallback)
4037
: eventEmitterListenerContainer_(
4138
std::make_shared<EventEmitterListenerContainer>()),
42-
frameRateListenerCallback_(std::move(frameRateListenerCallback)),
43-
startOnRenderCallback_(std::move(startOnRenderCallback)) {
44-
if (frameRateListenerCallback_) {
45-
stopOnRenderCallback_ = [this, stopOnRenderCallback](bool isAsync) {
46-
if (stopOnRenderCallback) {
47-
stopOnRenderCallback(isAsync);
48-
}
49-
if (frameRateListenerCallback_) {
50-
frameRateListenerCallback_(false);
51-
}
52-
};
53-
} else {
54-
stopOnRenderCallback_ = std::move(stopOnRenderCallback);
55-
}
56-
}
39+
startOnRenderCallback_(std::move(startOnRenderCallback)),
40+
stopOnRenderCallback_(std::move(stopOnRenderCallback)),
41+
frameRateListenerCallback_(std::move(frameRateListenerCallback)) {}
5742

5843
std::shared_ptr<NativeAnimatedNodesManager>
5944
NativeAnimatedNodesManagerProvider::getOrCreate(
@@ -85,10 +70,6 @@ NativeAnimatedNodesManagerProvider::getOrCreate(
8570
uiManager->synchronouslyUpdateViewOnUIThread(viewTag, props);
8671
};
8772

88-
nativeAnimatedDelegate_ =
89-
std::make_shared<UIManagerNativeAnimatedDelegateImpl>(
90-
frameRateListenerCallback_);
91-
9273
if (ReactNativeFeatureFlags::useSharedAnimatedBackend()) {
9374
#ifdef RN_USE_ANIMATION_BACKEND
9475
// TODO: this should be initialized outside of animated, but for now it
@@ -106,31 +87,14 @@ NativeAnimatedNodesManagerProvider::getOrCreate(
10687

10788
uiManager->unstable_setAnimationBackend(animationBackend_);
10889
} else {
109-
auto startOnRenderCallback =
110-
[this, startOnRenderCallbackFn = std::move(startOnRenderCallback_)](
111-
bool isAsync) {
112-
if (startOnRenderCallbackFn) {
113-
startOnRenderCallbackFn(
114-
[this]() {
115-
if (nativeAnimatedDelegate_) {
116-
nativeAnimatedDelegate_->runAnimationFrame();
117-
}
118-
},
119-
isAsync);
120-
}
121-
};
12290
nativeAnimatedNodesManager_ =
12391
std::make_shared<NativeAnimatedNodesManager>(
12492
std::move(directManipulationCallback),
12593
std::move(fabricCommitCallback),
126-
std::move(startOnRenderCallback),
94+
std::move(startOnRenderCallback_),
12795
std::move(stopOnRenderCallback_));
12896
}
12997

130-
std::static_pointer_cast<UIManagerNativeAnimatedDelegateImpl>(
131-
nativeAnimatedDelegate_)
132-
->setNativeAnimatedNodesManager(nativeAnimatedNodesManager_);
133-
13498
addEventEmitterListener(
13599
nativeAnimatedNodesManager_->getEventEmitterListener());
136100

@@ -153,6 +117,10 @@ NativeAnimatedNodesManagerProvider::getOrCreate(
153117
return false;
154118
}));
155119

120+
nativeAnimatedDelegate_ =
121+
std::make_shared<UIManagerNativeAnimatedDelegateImpl>(
122+
nativeAnimatedNodesManager_);
123+
156124
uiManager->setNativeAnimatedDelegate(nativeAnimatedDelegate_);
157125

158126
// TODO: remove force casting.

packages/react-native/ReactCommon/react/renderer/animated/NativeAnimatedNodesManagerProvider.h

Lines changed: 7 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -17,16 +17,10 @@ class AnimatedMountingOverrideDelegate;
1717

1818
class NativeAnimatedNodesManagerProvider {
1919
public:
20-
using FrameRateListenerCallback = std::function<void(bool /* shouldEnableListener */)>;
21-
// when isAsync is true, it means StartOnRenderCallback is invoked from js
22-
// thread, otherwise from main thread
23-
using StartOnRenderCallback = std::function<void(std::function<void()> &&, bool /* isAsync */)>;
24-
using StopOnRenderCallback = NativeAnimatedNodesManager::StopOnRenderCallback;
25-
2620
NativeAnimatedNodesManagerProvider(
27-
StartOnRenderCallback startOnRenderCallback = nullptr,
28-
StopOnRenderCallback stopOnRenderCallback = nullptr,
29-
FrameRateListenerCallback frameRateListenerCallback = nullptr);
21+
NativeAnimatedNodesManager::StartOnRenderCallback startOnRenderCallback = nullptr,
22+
NativeAnimatedNodesManager::StopOnRenderCallback stopOnRenderCallback = nullptr,
23+
NativeAnimatedNodesManager::FrameRateListenerCallback frameRateListenerCallback = nullptr);
3024

3125
std::shared_ptr<NativeAnimatedNodesManager> getOrCreate(
3226
jsi::Runtime &runtime,
@@ -47,29 +41,21 @@ class NativeAnimatedNodesManagerProvider {
4741
std::shared_ptr<UIManagerNativeAnimatedDelegate> nativeAnimatedDelegate_;
4842
std::shared_ptr<AnimatedMountingOverrideDelegate> animatedMountingOverrideDelegate_;
4943

50-
FrameRateListenerCallback frameRateListenerCallback_;
51-
52-
StartOnRenderCallback startOnRenderCallback_;
53-
StopOnRenderCallback stopOnRenderCallback_;
44+
NativeAnimatedNodesManager::StartOnRenderCallback startOnRenderCallback_;
45+
NativeAnimatedNodesManager::StopOnRenderCallback stopOnRenderCallback_;
46+
NativeAnimatedNodesManager::FrameRateListenerCallback frameRateListenerCallback_;
5447

5548
std::unique_ptr<MergedValueDispatcher> mergedValueDispatcher_;
5649
};
5750

5851
class UIManagerNativeAnimatedDelegateImpl : public UIManagerNativeAnimatedDelegate {
5952
public:
60-
explicit UIManagerNativeAnimatedDelegateImpl(
61-
NativeAnimatedNodesManagerProvider::FrameRateListenerCallback frameRateListenerCallback);
53+
explicit UIManagerNativeAnimatedDelegateImpl(std::weak_ptr<NativeAnimatedNodesManager> manager);
6254

6355
void runAnimationFrame() override;
6456

65-
void setNativeAnimatedNodesManager(std::weak_ptr<NativeAnimatedNodesManager> manager)
66-
{
67-
nativeAnimatedNodesManager_ = manager;
68-
}
69-
7057
private:
7158
std::weak_ptr<NativeAnimatedNodesManager> nativeAnimatedNodesManager_;
72-
NativeAnimatedNodesManagerProvider::FrameRateListenerCallback frameRateListenerCallback_;
7359
};
7460

7561
} // namespace facebook::react

0 commit comments

Comments
 (0)