Skip to content

Commit 592f539

Browse files
huntiefacebook-github-bot
authored andcommitted
Fix data race on PerformanceObserver entry buffer
Summary: Add mutex to protect `PerformanceObserver::buffer_` and `didScheduleFlushBuffer_`, which can be accessed concurrently from a background thread (`handleEntry`) and JS thread (`takeRecords`). Fixes T263429319. Changelog: [Internal] Differential Revision: D99820359
1 parent fdd6ca5 commit 592f539

File tree

2 files changed

+20
-6
lines changed

2 files changed

+20
-6
lines changed

packages/react-native/ReactCommon/react/performance/timeline/PerformanceObserver.cpp

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -25,16 +25,21 @@ void PerformanceObserver::handleEntry(const PerformanceEntry& entry) {
2525
return;
2626
}
2727

28-
buffer_.push_back(entry);
28+
{
29+
std::lock_guard lock(bufferMutex_);
30+
buffer_.push_back(entry);
31+
}
2932
scheduleFlushBuffer();
3033
}
3134
}
3235

3336
std::vector<PerformanceEntry> PerformanceObserver::takeRecords() {
3437
std::vector<PerformanceEntry> result;
35-
buffer_.swap(result);
36-
37-
didScheduleFlushBuffer_ = false;
38+
{
39+
std::lock_guard lock(bufferMutex_);
40+
buffer_.swap(result);
41+
didScheduleFlushBuffer_ = false;
42+
}
3843

3944
return result;
4045
}
@@ -87,9 +92,16 @@ void PerformanceObserver::disconnect() noexcept {
8792
}
8893

8994
void PerformanceObserver::scheduleFlushBuffer() {
90-
if (!didScheduleFlushBuffer_) {
91-
didScheduleFlushBuffer_ = true;
95+
bool shouldSchedule = false;
96+
{
97+
std::lock_guard lock(bufferMutex_);
98+
if (!didScheduleFlushBuffer_) {
99+
didScheduleFlushBuffer_ = true;
100+
shouldSchedule = true;
101+
}
102+
}
92103

104+
if (shouldSchedule) {
93105
callback_();
94106
}
95107
}

packages/react-native/ReactCommon/react/performance/timeline/PerformanceObserver.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414

1515
#include <functional>
1616
#include <memory>
17+
#include <mutex>
1718
#include <unordered_set>
1819
#include <vector>
1920

@@ -126,6 +127,7 @@ class PerformanceObserver : public std::enable_shared_from_this<PerformanceObser
126127

127128
/// https://www.w3.org/TR/event-timing/#sec-modifications-perf-timeline
128129
HighResDuration durationThreshold_ = DEFAULT_DURATION_THRESHOLD;
130+
std::mutex bufferMutex_;
129131
std::vector<PerformanceEntry> buffer_;
130132
bool didScheduleFlushBuffer_ = false;
131133
bool requiresDroppedEntries_ = false;

0 commit comments

Comments
 (0)