Skip to content

Commit 7cf1e43

Browse files
authored
Thread-safe RTCInitFieldTrialDictionary (#116)
1 parent 5cc0748 commit 7cf1e43

File tree

1 file changed

+21
-10
lines changed

1 file changed

+21
-10
lines changed

sdk/objc/api/peerconnection/RTCFieldTrials.mm

Lines changed: 21 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -10,47 +10,58 @@
1010

1111
#import "RTCFieldTrials.h"
1212

13+
#import <os/lock.h>
1314
#include <memory>
14-
1515
#import "base/RTCLogging.h"
1616

1717
#include "system_wrappers/include/field_trial.h"
1818

1919
NSString *const kRTCFieldTrialAudioForceABWENoTWCCKey = @"WebRTC-Audio-ABWENoTWCC";
20-
NSString * const kRTCFieldTrialFlexFec03AdvertisedKey = @"WebRTC-FlexFEC-03-Advertised";
21-
NSString * const kRTCFieldTrialFlexFec03Key = @"WebRTC-FlexFEC-03";
22-
NSString * const kRTCFieldTrialH264HighProfileKey = @"WebRTC-H264HighProfile";
23-
NSString * const kRTCFieldTrialMinimizeResamplingOnMobileKey =
20+
NSString *const kRTCFieldTrialFlexFec03AdvertisedKey = @"WebRTC-FlexFEC-03-Advertised";
21+
NSString *const kRTCFieldTrialFlexFec03Key = @"WebRTC-FlexFEC-03";
22+
NSString *const kRTCFieldTrialH264HighProfileKey = @"WebRTC-H264HighProfile";
23+
NSString *const kRTCFieldTrialMinimizeResamplingOnMobileKey =
2424
@"WebRTC-Audio-MinimizeResamplingOnMobile";
2525
NSString *const kRTCFieldTrialUseNWPathMonitor = @"WebRTC-Network-UseNWPathMonitor";
26-
NSString * const kRTCFieldTrialEnabledValue = @"Enabled";
26+
NSString *const kRTCFieldTrialEnabledValue = @"Enabled";
2727

2828
// InitFieldTrialsFromString stores the char*, so the char array must outlive
2929
// the application.
3030
static char *gFieldTrialInitString = nullptr;
31+
static os_unfair_lock fieldTrialLock = OS_UNFAIR_LOCK_INIT;
3132

3233
void RTCInitFieldTrialDictionary(NSDictionary<NSString *, NSString *> *fieldTrials) {
3334
if (!fieldTrials) {
3435
RTCLogWarning(@"No fieldTrials provided.");
3536
return;
3637
}
38+
3739
// Assemble the keys and values into the field trial string.
38-
// We don't perform any extra format checking. That should be done by the underlying WebRTC calls.
3940
NSMutableString *fieldTrialInitString = [NSMutableString string];
4041
for (NSString *key in fieldTrials) {
4142
NSString *fieldTrialEntry = [NSString stringWithFormat:@"%@/%@/", key, fieldTrials[key]];
4243
[fieldTrialInitString appendString:fieldTrialEntry];
4344
}
45+
4446
size_t len = fieldTrialInitString.length + 1;
47+
48+
// Locking before modifying global variable
49+
os_unfair_lock_lock(&fieldTrialLock);
4550
if (gFieldTrialInitString != nullptr) {
4651
delete[] gFieldTrialInitString;
52+
gFieldTrialInitString = nullptr;
4753
}
54+
4855
gFieldTrialInitString = new char[len];
49-
if (![fieldTrialInitString getCString:gFieldTrialInitString
50-
maxLength:len
51-
encoding:NSUTF8StringEncoding]) {
56+
bool success = [fieldTrialInitString getCString:gFieldTrialInitString
57+
maxLength:len
58+
encoding:NSUTF8StringEncoding];
59+
if (!success) {
5260
RTCLogError(@"Failed to convert field trial string.");
61+
os_unfair_lock_unlock(&fieldTrialLock);
5362
return;
5463
}
64+
5565
webrtc::field_trial::InitFieldTrialsFromString(gFieldTrialInitString);
66+
os_unfair_lock_unlock(&fieldTrialLock);
5667
}

0 commit comments

Comments
 (0)