|
10 | 10 |
|
11 | 11 | #import "RTCFieldTrials.h" |
12 | 12 |
|
| 13 | +#import <os/lock.h> |
13 | 14 | #include <memory> |
14 | | - |
15 | 15 | #import "base/RTCLogging.h" |
16 | 16 |
|
17 | 17 | #include "system_wrappers/include/field_trial.h" |
18 | 18 |
|
19 | 19 | 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 = |
24 | 24 | @"WebRTC-Audio-MinimizeResamplingOnMobile"; |
25 | 25 | NSString *const kRTCFieldTrialUseNWPathMonitor = @"WebRTC-Network-UseNWPathMonitor"; |
26 | | -NSString * const kRTCFieldTrialEnabledValue = @"Enabled"; |
| 26 | +NSString *const kRTCFieldTrialEnabledValue = @"Enabled"; |
27 | 27 |
|
28 | 28 | // InitFieldTrialsFromString stores the char*, so the char array must outlive |
29 | 29 | // the application. |
30 | 30 | static char *gFieldTrialInitString = nullptr; |
| 31 | +static os_unfair_lock fieldTrialLock = OS_UNFAIR_LOCK_INIT; |
31 | 32 |
|
32 | 33 | void RTCInitFieldTrialDictionary(NSDictionary<NSString *, NSString *> *fieldTrials) { |
33 | 34 | if (!fieldTrials) { |
34 | 35 | RTCLogWarning(@"No fieldTrials provided."); |
35 | 36 | return; |
36 | 37 | } |
| 38 | + |
37 | 39 | // 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. |
39 | 40 | NSMutableString *fieldTrialInitString = [NSMutableString string]; |
40 | 41 | for (NSString *key in fieldTrials) { |
41 | 42 | NSString *fieldTrialEntry = [NSString stringWithFormat:@"%@/%@/", key, fieldTrials[key]]; |
42 | 43 | [fieldTrialInitString appendString:fieldTrialEntry]; |
43 | 44 | } |
| 45 | + |
44 | 46 | size_t len = fieldTrialInitString.length + 1; |
| 47 | + |
| 48 | + // Locking before modifying global variable |
| 49 | + os_unfair_lock_lock(&fieldTrialLock); |
45 | 50 | if (gFieldTrialInitString != nullptr) { |
46 | 51 | delete[] gFieldTrialInitString; |
| 52 | + gFieldTrialInitString = nullptr; |
47 | 53 | } |
| 54 | + |
48 | 55 | 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) { |
52 | 60 | RTCLogError(@"Failed to convert field trial string."); |
| 61 | + os_unfair_lock_unlock(&fieldTrialLock); |
53 | 62 | return; |
54 | 63 | } |
| 64 | + |
55 | 65 | webrtc::field_trial::InitFieldTrialsFromString(gFieldTrialInitString); |
| 66 | + os_unfair_lock_unlock(&fieldTrialLock); |
56 | 67 | } |
0 commit comments