Skip to content

Commit 48885d2

Browse files
authored
Merge branch 'main' into antonis/oxlint
2 parents ee86488 + 349b45c commit 48885d2

5 files changed

Lines changed: 69 additions & 54 deletions

File tree

CHANGELOG.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,12 @@
66
> make sure you follow our [migration guide](https://docs.sentry.io/platforms/react-native/migration/) first.
77
<!-- prettier-ignore-end -->
88
9+
## Unreleased
10+
11+
### Fixes
12+
13+
- Fix iOS crash (EXC_BAD_ACCESS) in time-to-initial-display when navigating between screens ([#5887](https://github.com/getsentry/sentry-react-native/pull/5887))
14+
915
## 8.6.0
1016

1117
### Fixes

packages/core/ios/RNSentryTimeToDisplay.m

Lines changed: 48 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22
#import <QuartzCore/QuartzCore.h>
33
#import <React/RCTLog.h>
44

5+
// All static state below is accessed from the main thread (CADisplayLink, UI) and from the
6+
// React Native bridge / JS thread (setActiveSpanId, pop). Synchronize every access.
57
@implementation RNSentryTimeToDisplay {
68
CADisplayLink *displayLink;
79
RCTResponseSenderBlock resolveBlock;
@@ -13,6 +15,37 @@ @implementation RNSentryTimeToDisplay {
1315

1416
static NSString *activeSpanId;
1517

18+
+ (void)putTimeToDisplayForLocked:(NSString *)screenId value:(NSNumber *)value
19+
{
20+
if (!screenId) {
21+
return;
22+
}
23+
24+
// If key already exists, just update the value,
25+
// this should never happen as TTD is recorded once per navigation
26+
// We avoid updating the age to avoid the age array shift
27+
if ([screenIdToRenderDuration objectForKey:screenId]) {
28+
[screenIdToRenderDuration setObject:value forKey:screenId];
29+
return;
30+
}
31+
32+
// If we haven't reached capacity yet, just append
33+
if (screenIdAge.count < TIME_TO_DISPLAY_ENTRIES_MAX_SIZE) {
34+
[screenIdToRenderDuration setObject:value forKey:screenId];
35+
[screenIdAge addObject:screenId];
36+
} else {
37+
// Remove oldest entry, in most case will already be removed by pop
38+
NSString *oldestKey = screenIdAge[screenIdCurrentIndex];
39+
[screenIdToRenderDuration removeObjectForKey:oldestKey];
40+
41+
[screenIdToRenderDuration setObject:value forKey:screenId];
42+
screenIdAge[screenIdCurrentIndex] = screenId;
43+
44+
// Update circular index, point to the new oldest
45+
screenIdCurrentIndex = (screenIdCurrentIndex + 1) % TIME_TO_DISPLAY_ENTRIES_MAX_SIZE;
46+
}
47+
}
48+
1649
+ (void)initialize
1750
{
1851
if (self == [RNSentryTimeToDisplay class]) {
@@ -27,51 +60,34 @@ + (void)initialize
2760

2861
+ (void)setActiveSpanId:(NSString *)spanId
2962
{
30-
activeSpanId = spanId;
63+
@synchronized([RNSentryTimeToDisplay class]) {
64+
activeSpanId = spanId != nil ? [spanId copy] : nil;
65+
}
3166
}
3267

3368
+ (NSNumber *)popTimeToDisplayFor:(NSString *)screenId
3469
{
35-
NSNumber *value = screenIdToRenderDuration[screenId];
36-
[screenIdToRenderDuration removeObjectForKey:screenId];
37-
return value;
70+
@synchronized([RNSentryTimeToDisplay class]) {
71+
NSNumber *value = screenIdToRenderDuration[screenId];
72+
[screenIdToRenderDuration removeObjectForKey:screenId];
73+
return value;
74+
}
3875
}
3976

4077
+ (void)putTimeToInitialDisplayForActiveSpan:(NSNumber *)value
4178
{
42-
if (activeSpanId != nil) {
43-
NSString *prefixedSpanId = [@"ttid-navigation-" stringByAppendingString:activeSpanId];
44-
[self putTimeToDisplayFor:prefixedSpanId value:value];
79+
@synchronized([RNSentryTimeToDisplay class]) {
80+
if (activeSpanId != nil) {
81+
NSString *prefixedSpanId = [@"ttid-navigation-" stringByAppendingString:activeSpanId];
82+
[self putTimeToDisplayForLocked:prefixedSpanId value:value];
83+
}
4584
}
4685
}
4786

4887
+ (void)putTimeToDisplayFor:(NSString *)screenId value:(NSNumber *)value
4988
{
50-
if (!screenId)
51-
return;
52-
53-
// If key already exists, just update the value,
54-
// this should never happen as TTD is recorded once per navigation
55-
// We avoid updating the age to avoid the age array shift
56-
if ([screenIdToRenderDuration objectForKey:screenId]) {
57-
[screenIdToRenderDuration setObject:value forKey:screenId];
58-
return;
59-
}
60-
61-
// If we haven't reached capacity yet, just append
62-
if (screenIdAge.count < TIME_TO_DISPLAY_ENTRIES_MAX_SIZE) {
63-
[screenIdToRenderDuration setObject:value forKey:screenId];
64-
[screenIdAge addObject:screenId];
65-
} else {
66-
// Remove oldest entry, in most case will already be removed by pop
67-
NSString *oldestKey = screenIdAge[screenIdCurrentIndex];
68-
[screenIdToRenderDuration removeObjectForKey:oldestKey];
69-
70-
[screenIdToRenderDuration setObject:value forKey:screenId];
71-
screenIdAge[screenIdCurrentIndex] = screenId;
72-
73-
// Update circular index, point to the new oldest
74-
screenIdCurrentIndex = (screenIdCurrentIndex + 1) % TIME_TO_DISPLAY_ENTRIES_MAX_SIZE;
89+
@synchronized([RNSentryTimeToDisplay class]) {
90+
[self putTimeToDisplayForLocked:screenId value:value];
7591
}
7692
}
7793

packages/core/plugin/src/withSentryAndroidGradlePlugin.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ export interface SentryAndroidGradlePluginOptions {
1313
includeSourceContext?: boolean;
1414
}
1515

16-
export const sentryAndroidGradlePluginVersion = '6.2.0';
16+
export const sentryAndroidGradlePluginVersion = '6.3.0';
1717

1818
/**
1919
* Adds the Sentry Android Gradle Plugin to the project.

samples/react-native/android/build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ buildscript {
1616
classpath("com.android.tools.build:gradle")
1717
classpath("com.facebook.react:react-native-gradle-plugin")
1818
classpath("org.jetbrains.kotlin:kotlin-gradle-plugin")
19-
classpath("io.sentry:sentry-android-gradle-plugin:6.2.0")
19+
classpath("io.sentry:sentry-android-gradle-plugin:6.3.0")
2020
}
2121
}
2222

yarn.lock

Lines changed: 13 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -19025,20 +19025,20 @@ __metadata:
1902519025
linkType: hard
1902619026

1902719027
"handlebars@npm:^4.7.7":
19028-
version: 4.7.8
19029-
resolution: "handlebars@npm:4.7.8"
19030-
dependencies:
19031-
minimist: "npm:^1.2.5"
19032-
neo-async: "npm:^2.6.2"
19033-
source-map: "npm:^0.6.1"
19034-
uglify-js: "npm:^3.1.4"
19035-
wordwrap: "npm:^1.0.0"
19028+
version: 4.7.9
19029+
resolution: "handlebars@npm:4.7.9"
19030+
dependencies:
19031+
minimist: ^1.2.5
19032+
neo-async: ^2.6.2
19033+
source-map: ^0.6.1
19034+
uglify-js: ^3.1.4
19035+
wordwrap: ^1.0.0
1903619036
dependenciesMeta:
1903719037
uglify-js:
1903819038
optional: true
1903919039
bin:
1904019040
handlebars: bin/handlebars
19041-
checksum: 00e68bb5c183fd7b8b63322e6234b5ac8fbb960d712cb3f25587d559c2951d9642df83c04a1172c918c41bcfc81bfbd7a7718bbce93b893e0135fc99edea93ff
19041+
checksum: ac39070fc1c3c76a654e4b526383eaf1601976eaa474547b263915b4806977f083600e586ca923709baeed7c82a42640bcc9cc04c37a7efd3fb444f49b8347d6
1904219042
languageName: node
1904319043
linkType: hard
1904419044

@@ -24959,17 +24959,10 @@ __metadata:
2495924959
languageName: node
2496024960
linkType: hard
2496124961

24962-
"node-forge@npm:^1, node-forge@npm:^1.2.1, node-forge@npm:^1.3.1":
24963-
version: 1.3.2
24964-
resolution: "node-forge@npm:1.3.2"
24965-
checksum: b6f905b0fcc39a2d59598e12ca2c071bfd760e56a9163aab8da7f8d6622547f8db60cfb2aefc39277d5a13af32e58573674b38107a2d4df7c243e12794839546
24966-
languageName: node
24967-
linkType: hard
24968-
24969-
"node-forge@npm:^1.3.3":
24970-
version: 1.3.3
24971-
resolution: "node-forge@npm:1.3.3"
24972-
checksum: 045b650d61eeba57588744b7be4671044e83871e2c4dc5d4a38a8eb5af7e55fa790c93ba9db1d1ee14a567d25fde41e97a5132e076cff738622e0916c77b48d2
24962+
"node-forge@npm:^1, node-forge@npm:^1.2.1, node-forge@npm:^1.3.1, node-forge@npm:^1.3.3":
24963+
version: 1.4.0
24964+
resolution: "node-forge@npm:1.4.0"
24965+
checksum: c97c634d4d483aae815677db5b1bd14bfea4d873ab48817e020610a2b4d8bc6b3e77994860189b44151ff8e0842c0c4ba6faa80b9a6e6fbd6989865e8eb80b96
2497324966
languageName: node
2497424967
linkType: hard
2497524968

0 commit comments

Comments
 (0)