Delete rtc_base/atomic_ops.h
Bug: webrtc:9305
Change-Id: I3e8b0db03b84b5361d63db31ee23e6db3deabfe4
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/266497
Reviewed-by: Mirko Bonadei <mbonadei@webrtc.org>
Commit-Queue: Niels Moller <nisse@webrtc.org>
Reviewed-by: Harald Alvestrand <hta@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#37348}
diff --git a/media/BUILD.gn b/media/BUILD.gn
index 4079d1b..0481e3f0 100644
--- a/media/BUILD.gn
+++ b/media/BUILD.gn
@@ -159,7 +159,6 @@
"../common_video",
"../modules/video_coding:video_codec_interface",
"../modules/video_coding:video_coding_utility",
- "../rtc_base:atomicops",
"../rtc_base:checks",
"../rtc_base:logging",
"../rtc_base/experiments:encoder_info_settings",
diff --git a/media/engine/simulcast_encoder_adapter.cc b/media/engine/simulcast_encoder_adapter.cc
index e1dfc94..4a53b80 100644
--- a/media/engine/simulcast_encoder_adapter.cc
+++ b/media/engine/simulcast_encoder_adapter.cc
@@ -30,7 +30,6 @@
#include "media/base/video_common.h"
#include "modules/video_coding/include/video_error_codes.h"
#include "modules/video_coding/utility/simulcast_rate_allocator.h"
-#include "rtc_base/atomic_ops.h"
#include "rtc_base/checks.h"
#include "rtc_base/experiments/rate_control_settings.h"
#include "rtc_base/logging.h"
@@ -294,7 +293,7 @@
// It's legal to move the encoder to another queue now.
encoder_queue_.Detach();
- rtc::AtomicOps::ReleaseStore(&inited_, 0);
+ inited_.store(0);
return WEBRTC_VIDEO_CODEC_OK;
}
@@ -368,7 +367,7 @@
bypass_mode_ = true;
DestroyStoredEncoders();
- rtc::AtomicOps::ReleaseStore(&inited_, 1);
+ inited_.store(1);
return WEBRTC_VIDEO_CODEC_OK;
}
@@ -424,7 +423,7 @@
// To save memory, don't store encoders that we don't use.
DestroyStoredEncoders();
- rtc::AtomicOps::ReleaseStore(&inited_, 1);
+ inited_.store(1);
return WEBRTC_VIDEO_CODEC_OK;
}
@@ -678,7 +677,7 @@
}
bool SimulcastEncoderAdapter::Initialized() const {
- return rtc::AtomicOps::AcquireLoad(&inited_) == 1;
+ return inited_.load() == 1;
}
void SimulcastEncoderAdapter::DestroyStoredEncoders() {
diff --git a/media/engine/simulcast_encoder_adapter.h b/media/engine/simulcast_encoder_adapter.h
index e6b6bad..ef8205e 100644
--- a/media/engine/simulcast_encoder_adapter.h
+++ b/media/engine/simulcast_encoder_adapter.h
@@ -12,6 +12,7 @@
#ifndef MEDIA_ENGINE_SIMULCAST_ENCODER_ADAPTER_H_
#define MEDIA_ENGINE_SIMULCAST_ENCODER_ADAPTER_H_
+#include <atomic>
#include <list>
#include <memory>
#include <stack>
@@ -27,7 +28,6 @@
#include "api/video_codecs/video_encoder_factory.h"
#include "common_video/framerate_controller.h"
#include "modules/video_coding/include/video_codec_interface.h"
-#include "rtc_base/atomic_ops.h"
#include "rtc_base/experiments/encoder_info_settings.h"
#include "rtc_base/system/no_unique_address.h"
#include "rtc_base/system/rtc_export.h"
@@ -167,7 +167,7 @@
void OverrideFromFieldTrial(VideoEncoder::EncoderInfo* info) const;
- volatile int inited_; // Accessed atomically.
+ std::atomic<int> inited_;
VideoEncoderFactory* const primary_encoder_factory_;
VideoEncoderFactory* const fallback_encoder_factory_;
const SdpVideoFormat video_format_;
diff --git a/modules/audio_processing/BUILD.gn b/modules/audio_processing/BUILD.gn
index 0bd4331..b1f7331 100644
--- a/modules/audio_processing/BUILD.gn
+++ b/modules/audio_processing/BUILD.gn
@@ -128,7 +128,6 @@
":audio_buffer",
":audio_frame_view",
"../../common_audio",
- "../../rtc_base:atomicops",
"../../rtc_base:checks",
"../../rtc_base:logging",
"../../rtc_base:stringutils",
@@ -177,7 +176,6 @@
"../../audio/utility:audio_frame_operations",
"../../common_audio:common_audio_c",
"../../common_audio/third_party/ooura:fft_size_256",
- "../../rtc_base:atomicops",
"../../rtc_base:checks",
"../../rtc_base:event_tracer",
"../../rtc_base:gtest_prod",
@@ -244,7 +242,6 @@
":api",
":apm_logging",
"../../api:array_view",
- "../../rtc_base:atomicops",
"../../rtc_base:checks",
"../../rtc_base:logging",
"../../system_wrappers:metrics",
@@ -488,7 +485,6 @@
":audio_processing",
":audioproc_test_utils",
"../../api:array_view",
- "../../rtc_base:atomicops",
"../../rtc_base:platform_thread",
"../../rtc_base:protobuf_utils",
"../../rtc_base:random",
diff --git a/modules/audio_processing/aec3/BUILD.gn b/modules/audio_processing/aec3/BUILD.gn
index 6e9e7a3..70d0495 100644
--- a/modules/audio_processing/aec3/BUILD.gn
+++ b/modules/audio_processing/aec3/BUILD.gn
@@ -144,7 +144,6 @@
"../../../api/audio:aec3_config",
"../../../api/audio:echo_control",
"../../../common_audio:common_audio_c",
- "../../../rtc_base:atomicops",
"../../../rtc_base:checks",
"../../../rtc_base:logging",
"../../../rtc_base:macromagic",
diff --git a/modules/audio_processing/aec3/aec_state.cc b/modules/audio_processing/aec3/aec_state.cc
index 92cf3e2..81fd91f 100644
--- a/modules/audio_processing/aec3/aec_state.cc
+++ b/modules/audio_processing/aec3/aec_state.cc
@@ -20,7 +20,6 @@
#include "api/array_view.h"
#include "modules/audio_processing/aec3/aec3_common.h"
#include "modules/audio_processing/logging/apm_data_dumper.h"
-#include "rtc_base/atomic_ops.h"
#include "rtc_base/checks.h"
#include "system_wrappers/include/field_trial.h"
@@ -97,7 +96,7 @@
} // namespace
-int AecState::instance_count_ = 0;
+std::atomic<int> AecState::instance_count_(0);
void AecState::GetResidualEchoScaling(
rtc::ArrayView<float> residual_scaling) const {
@@ -115,8 +114,7 @@
AecState::AecState(const EchoCanceller3Config& config,
size_t num_capture_channels)
- : data_dumper_(
- new ApmDataDumper(rtc::AtomicOps::Increment(&instance_count_))),
+ : data_dumper_(new ApmDataDumper(instance_count_.fetch_add(1) + 1)),
config_(config),
num_capture_channels_(num_capture_channels),
deactivate_initial_state_reset_at_echo_path_change_(
diff --git a/modules/audio_processing/aec3/aec_state.h b/modules/audio_processing/aec3/aec_state.h
index dbd0fcc..a39325c 100644
--- a/modules/audio_processing/aec3/aec_state.h
+++ b/modules/audio_processing/aec3/aec_state.h
@@ -14,6 +14,7 @@
#include <stddef.h>
#include <array>
+#include <atomic>
#include <memory>
#include <vector>
@@ -154,7 +155,7 @@
}
private:
- static int instance_count_;
+ static std::atomic<int> instance_count_;
std::unique_ptr<ApmDataDumper> data_dumper_;
const EchoCanceller3Config config_;
const size_t num_capture_channels_;
diff --git a/modules/audio_processing/aec3/block_processor.cc b/modules/audio_processing/aec3/block_processor.cc
index 4525cc9..11b8aa6 100644
--- a/modules/audio_processing/aec3/block_processor.cc
+++ b/modules/audio_processing/aec3/block_processor.cc
@@ -11,6 +11,7 @@
#include <stddef.h>
+#include <atomic>
#include <memory>
#include <utility>
#include <vector>
@@ -26,7 +27,6 @@
#include "modules/audio_processing/aec3/render_delay_buffer.h"
#include "modules/audio_processing/aec3/render_delay_controller.h"
#include "modules/audio_processing/logging/apm_data_dumper.h"
-#include "rtc_base/atomic_ops.h"
#include "rtc_base/checks.h"
#include "rtc_base/logging.h"
@@ -64,7 +64,7 @@
void SetCaptureOutputUsage(bool capture_output_used) override;
private:
- static int instance_count_;
+ static std::atomic<int> instance_count_;
std::unique_ptr<ApmDataDumper> data_dumper_;
const EchoCanceller3Config config_;
bool capture_properly_started_ = false;
@@ -79,7 +79,7 @@
absl::optional<DelayEstimate> estimated_delay_;
};
-int BlockProcessorImpl::instance_count_ = 0;
+std::atomic<int> BlockProcessorImpl::instance_count_(0);
BlockProcessorImpl::BlockProcessorImpl(
const EchoCanceller3Config& config,
@@ -89,8 +89,7 @@
std::unique_ptr<RenderDelayBuffer> render_buffer,
std::unique_ptr<RenderDelayController> delay_controller,
std::unique_ptr<EchoRemover> echo_remover)
- : data_dumper_(
- new ApmDataDumper(rtc::AtomicOps::Increment(&instance_count_))),
+ : data_dumper_(new ApmDataDumper(instance_count_.fetch_add(1) + 1)),
config_(config),
sample_rate_hz_(sample_rate_hz),
render_buffer_(std::move(render_buffer)),
diff --git a/modules/audio_processing/aec3/echo_canceller3.cc b/modules/audio_processing/aec3/echo_canceller3.cc
index f4e3541..8e306ac 100644
--- a/modules/audio_processing/aec3/echo_canceller3.cc
+++ b/modules/audio_processing/aec3/echo_canceller3.cc
@@ -15,7 +15,6 @@
#include "modules/audio_processing/aec3/aec3_common.h"
#include "modules/audio_processing/high_pass_filter.h"
#include "modules/audio_processing/logging/apm_data_dumper.h"
-#include "rtc_base/atomic_ops.h"
#include "rtc_base/experiments/field_trial_parser.h"
#include "rtc_base/logging.h"
#include "system_wrappers/include/field_trial.h"
@@ -707,7 +706,7 @@
static_cast<void>(render_transfer_queue_->Insert(&render_queue_input_frame_));
}
-int EchoCanceller3::instance_count_ = 0;
+std::atomic<int> EchoCanceller3::instance_count_(0);
EchoCanceller3::EchoCanceller3(
const EchoCanceller3Config& config,
@@ -715,8 +714,7 @@
int sample_rate_hz,
size_t num_render_channels,
size_t num_capture_channels)
- : data_dumper_(
- new ApmDataDumper(rtc::AtomicOps::Increment(&instance_count_))),
+ : data_dumper_(new ApmDataDumper(instance_count_.fetch_add(1) + 1)),
config_(AdjustConfig(config)),
sample_rate_hz_(sample_rate_hz),
num_bands_(NumBandsForRate(sample_rate_hz_)),
diff --git a/modules/audio_processing/aec3/echo_canceller3.h b/modules/audio_processing/aec3/echo_canceller3.h
index 179659a..7bf8e51 100644
--- a/modules/audio_processing/aec3/echo_canceller3.h
+++ b/modules/audio_processing/aec3/echo_canceller3.h
@@ -13,6 +13,7 @@
#include <stddef.h>
+#include <atomic>
#include <memory>
#include <vector>
@@ -185,7 +186,7 @@
RTC_GUARDED_BY(render_race_checker_);
// State that may be accessed by the capture thread.
- static int instance_count_;
+ static std::atomic<int> instance_count_;
std::unique_ptr<ApmDataDumper> data_dumper_;
const EchoCanceller3Config config_;
const int sample_rate_hz_;
diff --git a/modules/audio_processing/aec3/echo_remover.cc b/modules/audio_processing/aec3/echo_remover.cc
index 3bca86c..673d88a 100644
--- a/modules/audio_processing/aec3/echo_remover.cc
+++ b/modules/audio_processing/aec3/echo_remover.cc
@@ -14,6 +14,7 @@
#include <algorithm>
#include <array>
+#include <atomic>
#include <cmath>
#include <memory>
@@ -33,7 +34,6 @@
#include "modules/audio_processing/aec3/suppression_filter.h"
#include "modules/audio_processing/aec3/suppression_gain.h"
#include "modules/audio_processing/logging/apm_data_dumper.h"
-#include "rtc_base/atomic_ops.h"
#include "rtc_base/checks.h"
#include "rtc_base/logging.h"
@@ -142,7 +142,7 @@
void FormLinearFilterOutput(const SubtractorOutput& subtractor_output,
rtc::ArrayView<float> output);
- static int instance_count_;
+ static std::atomic<int> instance_count_;
const EchoCanceller3Config config_;
const Aec3Fft fft_;
std::unique_ptr<ApmDataDumper> data_dumper_;
@@ -180,7 +180,7 @@
std::vector<SubtractorOutput> subtractor_output_heap_;
};
-int EchoRemoverImpl::instance_count_ = 0;
+std::atomic<int> EchoRemoverImpl::instance_count_(0);
EchoRemoverImpl::EchoRemoverImpl(const EchoCanceller3Config& config,
int sample_rate_hz,
@@ -188,8 +188,7 @@
size_t num_capture_channels)
: config_(config),
fft_(),
- data_dumper_(
- new ApmDataDumper(rtc::AtomicOps::Increment(&instance_count_))),
+ data_dumper_(new ApmDataDumper(instance_count_.fetch_add(1) + 1)),
optimization_(DetectOptimization()),
sample_rate_hz_(sample_rate_hz),
num_render_channels_(num_render_channels),
diff --git a/modules/audio_processing/aec3/filter_analyzer.cc b/modules/audio_processing/aec3/filter_analyzer.cc
index c809a34..d8fd3aa 100644
--- a/modules/audio_processing/aec3/filter_analyzer.cc
+++ b/modules/audio_processing/aec3/filter_analyzer.cc
@@ -19,7 +19,6 @@
#include "modules/audio_processing/aec3/aec3_common.h"
#include "modules/audio_processing/aec3/render_buffer.h"
#include "modules/audio_processing/logging/apm_data_dumper.h"
-#include "rtc_base/atomic_ops.h"
#include "rtc_base/checks.h"
namespace webrtc {
@@ -45,12 +44,11 @@
} // namespace
-int FilterAnalyzer::instance_count_ = 0;
+std::atomic<int> FilterAnalyzer::instance_count_(0);
FilterAnalyzer::FilterAnalyzer(const EchoCanceller3Config& config,
size_t num_capture_channels)
- : data_dumper_(
- new ApmDataDumper(rtc::AtomicOps::Increment(&instance_count_))),
+ : data_dumper_(new ApmDataDumper(instance_count_.fetch_add(1) + 1)),
bounded_erl_(config.ep_strength.bounded_erl),
default_gain_(config.ep_strength.default_gain),
h_highpass_(num_capture_channels,
diff --git a/modules/audio_processing/aec3/filter_analyzer.h b/modules/audio_processing/aec3/filter_analyzer.h
index 7c6b540..9aec8b1 100644
--- a/modules/audio_processing/aec3/filter_analyzer.h
+++ b/modules/audio_processing/aec3/filter_analyzer.h
@@ -14,6 +14,7 @@
#include <stddef.h>
#include <array>
+#include <atomic>
#include <memory>
#include <vector>
@@ -129,7 +130,7 @@
ConsistentFilterDetector consistent_filter_detector;
};
- static int instance_count_;
+ static std::atomic<int> instance_count_;
std::unique_ptr<ApmDataDumper> data_dumper_;
const bool bounded_erl_;
const float default_gain_;
diff --git a/modules/audio_processing/aec3/refined_filter_update_gain.cc b/modules/audio_processing/aec3/refined_filter_update_gain.cc
index db5203d..8e391d6 100644
--- a/modules/audio_processing/aec3/refined_filter_update_gain.cc
+++ b/modules/audio_processing/aec3/refined_filter_update_gain.cc
@@ -20,7 +20,6 @@
#include "modules/audio_processing/aec3/render_signal_analyzer.h"
#include "modules/audio_processing/aec3/subtractor_output.h"
#include "modules/audio_processing/logging/apm_data_dumper.h"
-#include "rtc_base/atomic_ops.h"
#include "rtc_base/checks.h"
namespace webrtc {
@@ -31,13 +30,12 @@
} // namespace
-int RefinedFilterUpdateGain::instance_count_ = 0;
+std::atomic<int> RefinedFilterUpdateGain::instance_count_(0);
RefinedFilterUpdateGain::RefinedFilterUpdateGain(
const EchoCanceller3Config::Filter::RefinedConfiguration& config,
size_t config_change_duration_blocks)
- : data_dumper_(
- new ApmDataDumper(rtc::AtomicOps::Increment(&instance_count_))),
+ : data_dumper_(new ApmDataDumper(instance_count_.fetch_add(1) + 1)),
config_change_duration_blocks_(
static_cast<int>(config_change_duration_blocks)),
poor_excitation_counter_(kPoorExcitationCounterInitial) {
diff --git a/modules/audio_processing/aec3/refined_filter_update_gain.h b/modules/audio_processing/aec3/refined_filter_update_gain.h
index ae4fe84..1a68ebc 100644
--- a/modules/audio_processing/aec3/refined_filter_update_gain.h
+++ b/modules/audio_processing/aec3/refined_filter_update_gain.h
@@ -14,6 +14,7 @@
#include <stddef.h>
#include <array>
+#include <atomic>
#include <memory>
#include "api/array_view.h"
@@ -69,7 +70,7 @@
}
private:
- static int instance_count_;
+ static std::atomic<int> instance_count_;
std::unique_ptr<ApmDataDumper> data_dumper_;
const int config_change_duration_blocks_;
float one_by_config_change_duration_blocks_;
diff --git a/modules/audio_processing/aec3/render_delay_buffer.cc b/modules/audio_processing/aec3/render_delay_buffer.cc
index a46c378..0579121 100644
--- a/modules/audio_processing/aec3/render_delay_buffer.cc
+++ b/modules/audio_processing/aec3/render_delay_buffer.cc
@@ -32,7 +32,6 @@
#include "modules/audio_processing/aec3/render_buffer.h"
#include "modules/audio_processing/aec3/spectrum_buffer.h"
#include "modules/audio_processing/logging/apm_data_dumper.h"
-#include "rtc_base/atomic_ops.h"
#include "rtc_base/checks.h"
#include "rtc_base/logging.h"
#include "system_wrappers/include/field_trial.h"
@@ -74,7 +73,7 @@
bool HasReceivedBufferDelay() override;
private:
- static int instance_count_;
+ static std::atomic<int> instance_count_;
std::unique_ptr<ApmDataDumper> data_dumper_;
const Aec3Optimization optimization_;
const EchoCanceller3Config config_;
@@ -119,13 +118,12 @@
bool RenderUnderrun();
};
-int RenderDelayBufferImpl::instance_count_ = 0;
+std::atomic<int> RenderDelayBufferImpl::instance_count_ = 0;
RenderDelayBufferImpl::RenderDelayBufferImpl(const EchoCanceller3Config& config,
int sample_rate_hz,
size_t num_render_channels)
- : data_dumper_(
- new ApmDataDumper(rtc::AtomicOps::Increment(&instance_count_))),
+ : data_dumper_(new ApmDataDumper(instance_count_.fetch_add(1) + 1)),
optimization_(DetectOptimization()),
config_(config),
update_capture_call_counter_on_skipped_blocks_(
diff --git a/modules/audio_processing/aec3/render_delay_controller.cc b/modules/audio_processing/aec3/render_delay_controller.cc
index 8860404..aa3d440 100644
--- a/modules/audio_processing/aec3/render_delay_controller.cc
+++ b/modules/audio_processing/aec3/render_delay_controller.cc
@@ -23,7 +23,6 @@
#include "modules/audio_processing/aec3/echo_path_delay_estimator.h"
#include "modules/audio_processing/aec3/render_delay_controller_metrics.h"
#include "modules/audio_processing/logging/apm_data_dumper.h"
-#include "rtc_base/atomic_ops.h"
#include "rtc_base/checks.h"
namespace webrtc {
@@ -51,7 +50,7 @@
bool HasClockdrift() const override;
private:
- static int instance_count_;
+ static std::atomic<int> instance_count_;
std::unique_ptr<ApmDataDumper> data_dumper_;
const int hysteresis_limit_blocks_;
const int delay_headroom_samples_;
@@ -90,14 +89,13 @@
return new_delay;
}
-int RenderDelayControllerImpl::instance_count_ = 0;
+std::atomic<int> RenderDelayControllerImpl::instance_count_(0);
RenderDelayControllerImpl::RenderDelayControllerImpl(
const EchoCanceller3Config& config,
int sample_rate_hz,
size_t num_capture_channels)
- : data_dumper_(
- new ApmDataDumper(rtc::AtomicOps::Increment(&instance_count_))),
+ : data_dumper_(new ApmDataDumper(instance_count_.fetch_add(1) + 1)),
hysteresis_limit_blocks_(
static_cast<int>(config.delay.hysteresis_limit_blocks)),
delay_headroom_samples_(config.delay.delay_headroom_samples),
diff --git a/modules/audio_processing/aec3/stationarity_estimator.cc b/modules/audio_processing/aec3/stationarity_estimator.cc
index 01628f3..4d36404 100644
--- a/modules/audio_processing/aec3/stationarity_estimator.cc
+++ b/modules/audio_processing/aec3/stationarity_estimator.cc
@@ -17,7 +17,6 @@
#include "modules/audio_processing/aec3/aec3_common.h"
#include "modules/audio_processing/aec3/spectrum_buffer.h"
#include "modules/audio_processing/logging/apm_data_dumper.h"
-#include "rtc_base/atomic_ops.h"
namespace webrtc {
@@ -29,8 +28,7 @@
} // namespace
StationarityEstimator::StationarityEstimator()
- : data_dumper_(
- new ApmDataDumper(rtc::AtomicOps::Increment(&instance_count_))) {
+ : data_dumper_(new ApmDataDumper(instance_count_.fetch_add(1) + 1)) {
Reset();
}
@@ -153,7 +151,7 @@
stationarity_flags_ = all_ahead_stationary_smooth;
}
-int StationarityEstimator::instance_count_ = 0;
+std::atomic<int> StationarityEstimator::instance_count_(0);
StationarityEstimator::NoiseSpectrum::NoiseSpectrum() {
Reset();
diff --git a/modules/audio_processing/aec3/stationarity_estimator.h b/modules/audio_processing/aec3/stationarity_estimator.h
index 6f7ad40..8bcd3b7 100644
--- a/modules/audio_processing/aec3/stationarity_estimator.h
+++ b/modules/audio_processing/aec3/stationarity_estimator.h
@@ -14,6 +14,7 @@
#include <stddef.h>
#include <array>
+#include <atomic>
#include <memory>
#include "api/array_view.h"
@@ -110,7 +111,7 @@
size_t block_counter_;
};
- static int instance_count_;
+ static std::atomic<int> instance_count_;
std::unique_ptr<ApmDataDumper> data_dumper_;
NoiseSpectrum noise_;
std::array<int, kFftLengthBy2Plus1> hangovers_;
diff --git a/modules/audio_processing/aec3/suppression_gain.cc b/modules/audio_processing/aec3/suppression_gain.cc
index 0017ca0..037daba 100644
--- a/modules/audio_processing/aec3/suppression_gain.cc
+++ b/modules/audio_processing/aec3/suppression_gain.cc
@@ -21,7 +21,6 @@
#include "modules/audio_processing/aec3/subband_nearend_detector.h"
#include "modules/audio_processing/aec3/vector_math.h"
#include "modules/audio_processing/logging/apm_data_dumper.h"
-#include "rtc_base/atomic_ops.h"
#include "rtc_base/checks.h"
#include "system_wrappers/include/field_trial.h"
@@ -102,7 +101,7 @@
} // namespace
-int SuppressionGain::instance_count_ = 0;
+std::atomic<int> SuppressionGain::instance_count_(0);
float SuppressionGain::UpperBandsGain(
rtc::ArrayView<const std::array<float, kFftLengthBy2Plus1>> echo_spectrum,
@@ -326,8 +325,7 @@
Aec3Optimization optimization,
int sample_rate_hz,
size_t num_capture_channels)
- : data_dumper_(
- new ApmDataDumper(rtc::AtomicOps::Increment(&instance_count_))),
+ : data_dumper_(new ApmDataDumper(instance_count_.fetch_add(1) + 1)),
optimization_(optimization),
config_(config),
num_capture_channels_(num_capture_channels),
diff --git a/modules/audio_processing/aec3/suppression_gain.h b/modules/audio_processing/aec3/suppression_gain.h
index e63c045..c19ddd7 100644
--- a/modules/audio_processing/aec3/suppression_gain.h
+++ b/modules/audio_processing/aec3/suppression_gain.h
@@ -12,6 +12,7 @@
#define MODULES_AUDIO_PROCESSING_AEC3_SUPPRESSION_GAIN_H_
#include <array>
+#include <atomic>
#include <memory>
#include <vector>
@@ -118,7 +119,7 @@
std::array<float, kFftLengthBy2Plus1> emr_transparent_;
};
- static int instance_count_;
+ static std::atomic<int> instance_count_;
std::unique_ptr<ApmDataDumper> data_dumper_;
const Aec3Optimization optimization_;
const EchoCanceller3Config config_;
diff --git a/modules/audio_processing/agc/BUILD.gn b/modules/audio_processing/agc/BUILD.gn
index 7b8f0fd..ade35af 100644
--- a/modules/audio_processing/agc/BUILD.gn
+++ b/modules/audio_processing/agc/BUILD.gn
@@ -30,7 +30,6 @@
"../../../api:array_view",
"../../../common_audio",
"../../../common_audio:common_audio_c",
- "../../../rtc_base:atomicops",
"../../../rtc_base:checks",
"../../../rtc_base:gtest_prod",
"../../../rtc_base:logging",
diff --git a/modules/audio_processing/agc/agc_manager_direct.cc b/modules/audio_processing/agc/agc_manager_direct.cc
index fb54cf5..af25c61 100644
--- a/modules/audio_processing/agc/agc_manager_direct.cc
+++ b/modules/audio_processing/agc/agc_manager_direct.cc
@@ -18,7 +18,6 @@
#include "modules/audio_processing/agc/gain_control.h"
#include "modules/audio_processing/agc/gain_map_internal.h"
#include "modules/audio_processing/include/audio_frame_view.h"
-#include "rtc_base/atomic_ops.h"
#include "rtc_base/checks.h"
#include "rtc_base/logging.h"
#include "rtc_base/numerics/safe_minmax.h"
@@ -439,7 +438,7 @@
}
}
-int AgcManagerDirect::instance_counter_ = 0;
+std::atomic<int> AgcManagerDirect::instance_counter_(0);
AgcManagerDirect::AgcManagerDirect(
Agc* agc,
@@ -472,8 +471,7 @@
int clipped_wait_frames,
const ClippingPredictorConfig& clipping_config)
: min_mic_level_override_(GetMinMicLevelOverride()),
- data_dumper_(
- new ApmDataDumper(rtc::AtomicOps::Increment(&instance_counter_))),
+ data_dumper_(new ApmDataDumper(instance_counter_.fetch_add(1) + 1)),
use_min_channel_level_(!UseMaxAnalogChannelLevel()),
num_capture_channels_(num_capture_channels),
disable_digital_adaptive_(disable_digital_adaptive),
diff --git a/modules/audio_processing/agc/agc_manager_direct.h b/modules/audio_processing/agc/agc_manager_direct.h
index ce67a97..86abeec 100644
--- a/modules/audio_processing/agc/agc_manager_direct.h
+++ b/modules/audio_processing/agc/agc_manager_direct.h
@@ -11,6 +11,7 @@
#ifndef MODULES_AUDIO_PROCESSING_AGC_AGC_MANAGER_DIRECT_H_
#define MODULES_AUDIO_PROCESSING_AGC_AGC_MANAGER_DIRECT_H_
+#include <atomic>
#include <memory>
#include "absl/types/optional.h"
@@ -128,7 +129,7 @@
const absl::optional<int> min_mic_level_override_;
std::unique_ptr<ApmDataDumper> data_dumper_;
- static int instance_counter_;
+ static std::atomic<int> instance_counter_;
const bool use_min_channel_level_;
const int num_capture_channels_;
const bool disable_digital_adaptive_;
diff --git a/modules/audio_processing/audio_processing_impl.cc b/modules/audio_processing/audio_processing_impl.cc
index 31a6a14..b7d2340 100644
--- a/modules/audio_processing/audio_processing_impl.cc
+++ b/modules/audio_processing/audio_processing_impl.cc
@@ -28,7 +28,6 @@
#include "modules/audio_processing/include/audio_frame_view.h"
#include "modules/audio_processing/logging/apm_data_dumper.h"
#include "modules/audio_processing/optionally_built_submodule_creators.h"
-#include "rtc_base/atomic_ops.h"
#include "rtc_base/checks.h"
#include "rtc_base/logging.h"
#include "rtc_base/time_utils.h"
@@ -253,7 +252,7 @@
/*echo_detector=*/nullptr,
/*capture_analyzer=*/nullptr) {}
-int AudioProcessingImpl::instance_count_ = 0;
+std::atomic<int> AudioProcessingImpl::instance_count_(0);
AudioProcessingImpl::AudioProcessingImpl(
const AudioProcessing::Config& config,
@@ -262,8 +261,7 @@
std::unique_ptr<EchoControlFactory> echo_control_factory,
rtc::scoped_refptr<EchoDetector> echo_detector,
std::unique_ptr<CustomAudioAnalyzer> capture_analyzer)
- : data_dumper_(
- new ApmDataDumper(rtc::AtomicOps::Increment(&instance_count_))),
+ : data_dumper_(new ApmDataDumper(instance_count_.fetch_add(1) + 1)),
use_setup_specific_default_aec3_config_(
UseSetupSpecificDefaultAec3Congfig()),
use_denormal_disabler_(
diff --git a/modules/audio_processing/audio_processing_impl.h b/modules/audio_processing/audio_processing_impl.h
index 974089b..86ecb80 100644
--- a/modules/audio_processing/audio_processing_impl.h
+++ b/modules/audio_processing/audio_processing_impl.h
@@ -13,6 +13,7 @@
#include <stdio.h>
+#include <atomic>
#include <list>
#include <memory>
#include <string>
@@ -180,7 +181,7 @@
};
const std::unique_ptr<ApmDataDumper> data_dumper_;
- static int instance_count_;
+ static std::atomic<int> instance_count_;
const bool use_setup_specific_default_aec3_config_;
const bool use_denormal_disabler_;
diff --git a/modules/audio_processing/audio_processing_performance_unittest.cc b/modules/audio_processing/audio_processing_performance_unittest.cc
index 57655ae..49e435f 100644
--- a/modules/audio_processing/audio_processing_performance_unittest.cc
+++ b/modules/audio_processing/audio_processing_performance_unittest.cc
@@ -10,6 +10,7 @@
#include <math.h>
#include <algorithm>
+#include <atomic>
#include <memory>
#include <vector>
@@ -17,7 +18,6 @@
#include "modules/audio_processing/audio_processing_impl.h"
#include "modules/audio_processing/test/audio_processing_builder_for_testing.h"
#include "modules/audio_processing/test/test_utils.h"
-#include "rtc_base/atomic_ops.h"
#include "rtc_base/event.h"
#include "rtc_base/numerics/safe_conversions.h"
#include "rtc_base/platform_thread.h"
@@ -134,16 +134,16 @@
// Handler for the frame counters.
class FrameCounters {
public:
- void IncreaseRenderCounter() { rtc::AtomicOps::Increment(&render_count_); }
+ void IncreaseRenderCounter() { render_count_.fetch_add(1); }
- void IncreaseCaptureCounter() { rtc::AtomicOps::Increment(&capture_count_); }
+ void IncreaseCaptureCounter() { capture_count_.fetch_add(1); }
int CaptureMinusRenderCounters() const {
// The return value will be approximate, but that's good enough since
// by the time we return the value, it's not guaranteed to be correct
// anyway.
- return rtc::AtomicOps::AcquireLoad(&capture_count_) -
- rtc::AtomicOps::AcquireLoad(&render_count_);
+ return capture_count_.load(std::memory_order_acquire) -
+ render_count_.load(std::memory_order_acquire);
}
int RenderMinusCaptureCounters() const {
@@ -153,28 +153,31 @@
bool BothCountersExceedeThreshold(int threshold) const {
// TODO(tommi): We could use an event to signal this so that we don't need
// to be polling from the main thread and possibly steal cycles.
- const int capture_count = rtc::AtomicOps::AcquireLoad(&capture_count_);
- const int render_count = rtc::AtomicOps::AcquireLoad(&render_count_);
+ const int capture_count = capture_count_.load(std::memory_order_acquire);
+ const int render_count = render_count_.load(std::memory_order_acquire);
return (render_count > threshold && capture_count > threshold);
}
private:
- int render_count_ = 0;
- int capture_count_ = 0;
+ std::atomic<int> render_count_{0};
+ std::atomic<int> capture_count_{0};
};
// Class that represents a flag that can only be raised.
class LockedFlag {
public:
- bool get_flag() const { return rtc::AtomicOps::AcquireLoad(&flag_); }
+ bool get_flag() const { return flag_.load(std::memory_order_acquire); }
void set_flag() {
- if (!get_flag()) // read-only operation to avoid affecting the cache-line.
- rtc::AtomicOps::CompareAndSwap(&flag_, 0, 1);
+ if (!get_flag()) {
+ // read-only operation to avoid affecting the cache-line.
+ int zero = 0;
+ flag_.compare_exchange_strong(zero, 1);
+ }
}
private:
- int flag_ = 0;
+ std::atomic<int> flag_{0};
};
// Parent class for the thread processors.
diff --git a/modules/audio_processing/gain_controller2.cc b/modules/audio_processing/gain_controller2.cc
index 83a595e..f1907bb 100644
--- a/modules/audio_processing/gain_controller2.cc
+++ b/modules/audio_processing/gain_controller2.cc
@@ -18,7 +18,6 @@
#include "modules/audio_processing/audio_buffer.h"
#include "modules/audio_processing/include/audio_frame_view.h"
#include "modules/audio_processing/logging/apm_data_dumper.h"
-#include "rtc_base/atomic_ops.h"
#include "rtc_base/checks.h"
#include "rtc_base/logging.h"
#include "rtc_base/strings/string_builder.h"
@@ -65,14 +64,14 @@
} // namespace
-int GainController2::instance_count_ = 0;
+std::atomic<int> GainController2::instance_count_(0);
GainController2::GainController2(const Agc2Config& config,
int sample_rate_hz,
int num_channels,
bool use_internal_vad)
: cpu_features_(GetAllowedCpuFeatures()),
- data_dumper_(rtc::AtomicOps::Increment(&instance_count_)),
+ data_dumper_(instance_count_.fetch_add(1) + 1),
fixed_gain_applier_(
/*hard_clip_samples=*/false,
/*initial_gain_factor=*/DbToRatio(config.fixed_digital.gain_db)),
diff --git a/modules/audio_processing/gain_controller2.h b/modules/audio_processing/gain_controller2.h
index 616f88a..304fa40 100644
--- a/modules/audio_processing/gain_controller2.h
+++ b/modules/audio_processing/gain_controller2.h
@@ -11,6 +11,7 @@
#ifndef MODULES_AUDIO_PROCESSING_GAIN_CONTROLLER2_H_
#define MODULES_AUDIO_PROCESSING_GAIN_CONTROLLER2_H_
+#include <atomic>
#include <memory>
#include <string>
@@ -60,7 +61,7 @@
AvailableCpuFeatures GetCpuFeatures() const { return cpu_features_; }
private:
- static int instance_count_;
+ static std::atomic<int> instance_count_;
const AvailableCpuFeatures cpu_features_;
ApmDataDumper data_dumper_;
GainApplier fixed_gain_applier_;
diff --git a/modules/audio_processing/residual_echo_detector.cc b/modules/audio_processing/residual_echo_detector.cc
index fe1149a..2a564fc 100644
--- a/modules/audio_processing/residual_echo_detector.cc
+++ b/modules/audio_processing/residual_echo_detector.cc
@@ -15,7 +15,6 @@
#include "absl/types/optional.h"
#include "modules/audio_processing/logging/apm_data_dumper.h"
-#include "rtc_base/atomic_ops.h"
#include "rtc_base/checks.h"
#include "rtc_base/logging.h"
#include "system_wrappers/include/metrics.h"
@@ -41,11 +40,10 @@
namespace webrtc {
-int ResidualEchoDetector::instance_count_ = 0;
+std::atomic<int> ResidualEchoDetector::instance_count_(0);
ResidualEchoDetector::ResidualEchoDetector()
- : data_dumper_(
- new ApmDataDumper(rtc::AtomicOps::Increment(&instance_count_))),
+ : data_dumper_(new ApmDataDumper(instance_count_.fetch_add(1) + 1)),
render_buffer_(kRenderBufferSize),
render_power_(kLookbackFrames),
render_power_mean_(kLookbackFrames),
diff --git a/modules/audio_processing/residual_echo_detector.h b/modules/audio_processing/residual_echo_detector.h
index 44252af..ac554b1 100644
--- a/modules/audio_processing/residual_echo_detector.h
+++ b/modules/audio_processing/residual_echo_detector.h
@@ -11,6 +11,7 @@
#ifndef MODULES_AUDIO_PROCESSING_RESIDUAL_ECHO_DETECTOR_H_
#define MODULES_AUDIO_PROCESSING_RESIDUAL_ECHO_DETECTOR_H_
+#include <atomic>
#include <vector>
#include "api/array_view.h"
@@ -49,7 +50,7 @@
EchoDetector::Metrics GetMetrics() const override;
private:
- static int instance_count_;
+ static std::atomic<int> instance_count_;
std::unique_ptr<ApmDataDumper> data_dumper_;
// Keep track if the `Process` function has been previously called.
bool first_process_call_ = true;
diff --git a/rtc_base/BUILD.gn b/rtc_base/BUILD.gn
index b58b4a9..c8e23a8 100644
--- a/rtc_base/BUILD.gn
+++ b/rtc_base/BUILD.gn
@@ -194,7 +194,6 @@
"trace_event.h",
]
deps = [
- ":atomicops",
":checks",
":logging",
":macromagic",
@@ -346,7 +345,6 @@
"deprecated/recursive_critical_section.h",
]
deps = [
- ":atomicops",
":checks",
":macromagic",
":platform_thread_types",
@@ -361,7 +359,6 @@
"platform_thread.h",
]
deps = [
- ":atomicops",
":checks",
":macromagic",
":platform_thread_types",
@@ -453,10 +450,6 @@
}
}
-rtc_source_set("atomicops") {
- sources = [ "atomic_ops.h" ]
-}
-
rtc_library("checks") {
# TODO(bugs.webrtc.org/9607): This should not be public.
visibility = [ "*" ]
@@ -922,7 +915,6 @@
]
deps = [
":async_resolver_interface",
- ":atomicops",
":byte_order",
":checks",
":criticalsection",
@@ -1497,7 +1489,6 @@
rtc_library("rtc_base_approved_unittests") {
testonly = true
sources = [
- "atomic_ops_unittest.cc",
"base64_unittest.cc",
"bit_buffer_unittest.cc",
"bitstream_reader_unittest.cc",
@@ -1541,7 +1532,6 @@
"zero_memory_unittest.cc",
]
deps = [
- ":atomicops",
":bit_buffer",
":bitstream_reader",
":bounded_inline_vector",
@@ -1710,7 +1700,6 @@
"unique_id_generator_unittest.cc",
]
deps = [
- ":atomicops",
":buffer",
":buffer_queue",
":checks",
diff --git a/rtc_base/atomic_ops.h b/rtc_base/atomic_ops.h
deleted file mode 100644
index 18a24a8..0000000
--- a/rtc_base/atomic_ops.h
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- * Copyright 2011 The WebRTC Project Authors. All rights reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-#ifndef RTC_BASE_ATOMIC_OPS_H_
-#define RTC_BASE_ATOMIC_OPS_H_
-
-#if defined(WEBRTC_WIN)
-// clang-format off
-// clang formating would change include order.
-
-// Include winsock2.h before including <windows.h> to maintain consistency with
-// win32.h. To include win32.h directly, it must be broken out into its own
-// build target.
-#include <winsock2.h>
-#include <windows.h>
-// clang-format on
-#endif // defined(WEBRTC_WIN)
-
-namespace rtc {
-class AtomicOps {
- public:
-#if defined(WEBRTC_WIN)
- // Assumes sizeof(int) == sizeof(LONG), which it is on Win32 and Win64.
- static int Increment(volatile int* i) {
- return ::InterlockedIncrement(reinterpret_cast<volatile LONG*>(i));
- }
- static int Decrement(volatile int* i) {
- return ::InterlockedDecrement(reinterpret_cast<volatile LONG*>(i));
- }
- static int AcquireLoad(volatile const int* i) { return *i; }
- static void ReleaseStore(volatile int* i, int value) { *i = value; }
- static int CompareAndSwap(volatile int* i, int old_value, int new_value) {
- return ::InterlockedCompareExchange(reinterpret_cast<volatile LONG*>(i),
- new_value, old_value);
- }
- // Pointer variants.
- template <typename T>
- static T* AcquireLoadPtr(T* volatile* ptr) {
- return *ptr;
- }
- template <typename T>
- static T* CompareAndSwapPtr(T* volatile* ptr, T* old_value, T* new_value) {
- return static_cast<T*>(::InterlockedCompareExchangePointer(
- reinterpret_cast<PVOID volatile*>(ptr), new_value, old_value));
- }
-#else
- static int Increment(volatile int* i) { return __sync_add_and_fetch(i, 1); }
- static int Decrement(volatile int* i) { return __sync_sub_and_fetch(i, 1); }
- static int AcquireLoad(volatile const int* i) {
- return __atomic_load_n(i, __ATOMIC_ACQUIRE);
- }
- static void ReleaseStore(volatile int* i, int value) {
- __atomic_store_n(i, value, __ATOMIC_RELEASE);
- }
- static int CompareAndSwap(volatile int* i, int old_value, int new_value) {
- return __sync_val_compare_and_swap(i, old_value, new_value);
- }
- // Pointer variants.
- template <typename T>
- static T* AcquireLoadPtr(T* volatile* ptr) {
- return __atomic_load_n(ptr, __ATOMIC_ACQUIRE);
- }
- template <typename T>
- static T* CompareAndSwapPtr(T* volatile* ptr, T* old_value, T* new_value) {
- return __sync_val_compare_and_swap(ptr, old_value, new_value);
- }
-#endif
-};
-
-} // namespace rtc
-
-#endif // RTC_BASE_ATOMIC_OPS_H_
diff --git a/rtc_base/atomic_ops_unittest.cc b/rtc_base/atomic_ops_unittest.cc
deleted file mode 100644
index d5a1105..0000000
--- a/rtc_base/atomic_ops_unittest.cc
+++ /dev/null
@@ -1,12 +0,0 @@
-/*
- * Copyright 2011 The WebRTC Project Authors. All rights reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-// TODO(pbos): Move AtomicOps tests to here from
-// webrtc/rtc_base/criticalsection_unittest.cc.
diff --git a/rtc_base/deprecated/recursive_critical_section.cc b/rtc_base/deprecated/recursive_critical_section.cc
index 068b9aa..5408198 100644
--- a/rtc_base/deprecated/recursive_critical_section.cc
+++ b/rtc_base/deprecated/recursive_critical_section.cc
@@ -12,7 +12,6 @@
#include <time.h>
-#include "rtc_base/atomic_ops.h"
#include "rtc_base/checks.h"
#include "rtc_base/platform_thread_types.h"
#include "rtc_base/synchronization/yield.h"
diff --git a/rtc_base/deprecated/recursive_critical_section.h b/rtc_base/deprecated/recursive_critical_section.h
index cc308e4..da1e92b 100644
--- a/rtc_base/deprecated/recursive_critical_section.h
+++ b/rtc_base/deprecated/recursive_critical_section.h
@@ -11,6 +11,8 @@
#ifndef RTC_BASE_DEPRECATED_RECURSIVE_CRITICAL_SECTION_H_
#define RTC_BASE_DEPRECATED_RECURSIVE_CRITICAL_SECTION_H_
+#include <atomic>
+
#include "rtc_base/platform_thread_types.h"
#include "rtc_base/thread_annotations.h"
@@ -68,7 +70,7 @@
// Number of times the lock has been locked + number of threads waiting.
// TODO(tommi): We could use this number and subtract the recursion count
// to find places where we have multiple threads contending on the same lock.
- mutable volatile int lock_queue_;
+ mutable std::atomic<int> lock_queue_;
// `recursion_` represents the recursion count + 1 for the thread that owns
// the lock. Only modified by the thread that owns the lock.
mutable int recursion_;
diff --git a/rtc_base/deprecated/recursive_critical_section_unittest.cc b/rtc_base/deprecated/recursive_critical_section_unittest.cc
index 9256a76..571867a 100644
--- a/rtc_base/deprecated/recursive_critical_section_unittest.cc
+++ b/rtc_base/deprecated/recursive_critical_section_unittest.cc
@@ -21,7 +21,6 @@
#include "absl/base/attributes.h"
#include "rtc_base/arraysize.h"
-#include "rtc_base/atomic_ops.h"
#include "rtc_base/checks.h"
#include "rtc_base/event.h"
#include "rtc_base/location.h"
@@ -94,7 +93,7 @@
return done_event_.Wait(kLongTime);
}
- void SetExpectedThreadCount(int count) { threads_active_ = count; }
+ void SetExpectedThreadCount(int count) { threads_active_.store(count); }
int shared_value() const { return shared_value_; }
@@ -105,14 +104,14 @@
// Returns true if all threads have finished.
bool AfterEnd() {
- if (AtomicOps::Decrement(&threads_active_) == 0) {
+ if (threads_active_.fetch_sub(1) == 1) {
done_event_.Set();
return true;
}
return false;
}
- int threads_active_;
+ std::atomic<int> threads_active_;
Event start_event_;
Event done_event_;
int shared_value_;
@@ -156,49 +155,6 @@
Lock lock_;
};
-template <class Op, class Verifier>
-class AtomicOpRunner : public RunnerBase {
- public:
- explicit AtomicOpRunner(int initial_value) : RunnerBase(initial_value) {}
-
- void OnMessage(Message* msg) override {
- BeforeStart();
-
- std::vector<int> values;
- values.reserve(kOperationsToRun);
-
- // Generate a bunch of values by updating shared_value_ atomically.
- for (int i = 0; i < kOperationsToRun; ++i) {
- values.push_back(Op::AtomicOp(&shared_value_));
- }
-
- { // Add them all to the set.
- CritScope cs(&all_values_crit_);
- verifier_.Verify(values);
- }
-
- if (AfterEnd()) {
- verifier_.Finalize();
- }
- }
-
- private:
- RecursiveCriticalSection all_values_crit_;
- Verifier verifier_;
-};
-
-struct IncrementOp {
- static int AtomicOp(int* i) { return AtomicOps::Increment(i); }
-};
-
-struct DecrementOp {
- static int AtomicOp(int* i) { return AtomicOps::Decrement(i); }
-};
-
-struct CompareAndSwapOp {
- static int AtomicOp(int* i) { return AtomicOps::CompareAndSwap(i, 0, 1); }
-};
-
void StartThreads(std::vector<std::unique_ptr<Thread>>* threads,
MessageHandler* handler) {
for (int i = 0; i < kNumThreads; ++i) {
@@ -211,77 +167,6 @@
} // namespace
-TEST(AtomicOpsTest, Simple) {
- int value = 0;
- EXPECT_EQ(1, AtomicOps::Increment(&value));
- EXPECT_EQ(1, value);
- EXPECT_EQ(2, AtomicOps::Increment(&value));
- EXPECT_EQ(2, value);
- EXPECT_EQ(1, AtomicOps::Decrement(&value));
- EXPECT_EQ(1, value);
- EXPECT_EQ(0, AtomicOps::Decrement(&value));
- EXPECT_EQ(0, value);
-}
-
-TEST(AtomicOpsTest, SimplePtr) {
- class Foo {};
- Foo* volatile foo = nullptr;
- std::unique_ptr<Foo> a(new Foo());
- std::unique_ptr<Foo> b(new Foo());
- // Reading the initial value should work as expected.
- EXPECT_TRUE(rtc::AtomicOps::AcquireLoadPtr(&foo) == nullptr);
- // Setting using compare and swap should work.
- EXPECT_TRUE(rtc::AtomicOps::CompareAndSwapPtr(
- &foo, static_cast<Foo*>(nullptr), a.get()) == nullptr);
- EXPECT_TRUE(rtc::AtomicOps::AcquireLoadPtr(&foo) == a.get());
- // Setting another value but with the wrong previous pointer should fail
- // (remain a).
- EXPECT_TRUE(rtc::AtomicOps::CompareAndSwapPtr(
- &foo, static_cast<Foo*>(nullptr), b.get()) == a.get());
- EXPECT_TRUE(rtc::AtomicOps::AcquireLoadPtr(&foo) == a.get());
- // Replacing a with b should work.
- EXPECT_TRUE(rtc::AtomicOps::CompareAndSwapPtr(&foo, a.get(), b.get()) ==
- a.get());
- EXPECT_TRUE(rtc::AtomicOps::AcquireLoadPtr(&foo) == b.get());
-}
-
-TEST(AtomicOpsTest, Increment) {
- // Create and start lots of threads.
- AtomicOpRunner<IncrementOp, UniqueValueVerifier> runner(0);
- std::vector<std::unique_ptr<Thread>> threads;
- StartThreads(&threads, &runner);
- runner.SetExpectedThreadCount(kNumThreads);
-
- // Release the hounds!
- EXPECT_TRUE(runner.Run());
- EXPECT_EQ(kOperationsToRun * kNumThreads, runner.shared_value());
-}
-
-TEST(AtomicOpsTest, Decrement) {
- // Create and start lots of threads.
- AtomicOpRunner<DecrementOp, UniqueValueVerifier> runner(kOperationsToRun *
- kNumThreads);
- std::vector<std::unique_ptr<Thread>> threads;
- StartThreads(&threads, &runner);
- runner.SetExpectedThreadCount(kNumThreads);
-
- // Release the hounds!
- EXPECT_TRUE(runner.Run());
- EXPECT_EQ(0, runner.shared_value());
-}
-
-TEST(AtomicOpsTest, CompareAndSwap) {
- // Create and start lots of threads.
- AtomicOpRunner<CompareAndSwapOp, CompareAndSwapVerifier> runner(0);
- std::vector<std::unique_ptr<Thread>> threads;
- StartThreads(&threads, &runner);
- runner.SetExpectedThreadCount(kNumThreads);
-
- // Release the hounds!
- EXPECT_TRUE(runner.Run());
- EXPECT_EQ(1, runner.shared_value());
-}
-
TEST(RecursiveCriticalSectionTest, Basic) {
// Create and start lots of threads.
LockRunner<CriticalSectionLock> runner;
diff --git a/rtc_base/event_tracer.cc b/rtc_base/event_tracer.cc
index e6acbdc..28f1bfe 100644
--- a/rtc_base/event_tracer.cc
+++ b/rtc_base/event_tracer.cc
@@ -14,12 +14,12 @@
#include <stdio.h>
#include <string.h>
+#include <atomic>
#include <string>
#include <vector>
#include "absl/strings/string_view.h"
#include "api/sequence_checker.h"
-#include "rtc_base/atomic_ops.h"
#include "rtc_base/checks.h"
#include "rtc_base/event.h"
#include "rtc_base/logging.h"
@@ -81,7 +81,7 @@
namespace {
// Atomic-int fast path for avoiding logging when disabled.
-static volatile int g_event_logging_active = 0;
+static std::atomic<int> g_event_logging_active(0);
// TODO(pbos): Log metadata for all threads, etc.
class EventLogger final {
@@ -199,8 +199,8 @@
}
// Enable event logging (fast-path). This should be disabled since starting
// shouldn't be done twice.
- RTC_CHECK_EQ(0,
- rtc::AtomicOps::CompareAndSwap(&g_event_logging_active, 0, 1));
+ int zero = 0;
+ RTC_CHECK(g_event_logging_active.compare_exchange_strong(zero, 1));
// Finally start, everything should be set up now.
logging_thread_ =
@@ -212,7 +212,8 @@
RTC_DCHECK(thread_checker_.IsCurrent());
TRACE_EVENT_INSTANT0("webrtc", "EventLogger::Stop");
// Try to stop. Abort if we're not currently logging.
- if (rtc::AtomicOps::CompareAndSwap(&g_event_logging_active, 1, 0) == 0)
+ int one = 1;
+ if (g_event_logging_active.compare_exchange_strong(one, 0))
return;
// Wake up logging thread to finish writing.
@@ -321,7 +322,7 @@
bool output_file_owned_ = false;
};
-static EventLogger* volatile g_event_logger = nullptr;
+static std::atomic<EventLogger*> g_event_logger(nullptr);
static const char* const kDisabledTracePrefix = TRACE_DISABLED_BY_DEFAULT("");
const unsigned char* InternalGetCategoryEnabled(const char* name) {
const char* prefix_ptr = &kDisabledTracePrefix[0];
@@ -349,33 +350,35 @@
const unsigned long long* arg_values,
unsigned char flags) {
// Fast path for when event tracing is inactive.
- if (rtc::AtomicOps::AcquireLoad(&g_event_logging_active) == 0)
+ if (g_event_logging_active.load() == 0)
return;
- g_event_logger->AddTraceEvent(name, category_enabled, phase, num_args,
- arg_names, arg_types, arg_values,
- rtc::TimeMicros(), 1, rtc::CurrentThreadId());
+ g_event_logger.load()->AddTraceEvent(
+ name, category_enabled, phase, num_args, arg_names, arg_types, arg_values,
+ rtc::TimeMicros(), 1, rtc::CurrentThreadId());
}
} // namespace
void SetupInternalTracer(bool enable_all_categories) {
- RTC_CHECK(rtc::AtomicOps::CompareAndSwapPtr(
- &g_event_logger, static_cast<EventLogger*>(nullptr),
- new EventLogger()) == nullptr);
+ EventLogger* null_logger = nullptr;
+ RTC_CHECK(
+ g_event_logger.compare_exchange_strong(null_logger, new EventLogger()));
webrtc::SetupEventTracer(enable_all_categories ? InternalEnableAllCategories
: InternalGetCategoryEnabled,
InternalAddTraceEvent);
}
void StartInternalCaptureToFile(FILE* file) {
- if (g_event_logger) {
- g_event_logger->Start(file, false);
+ EventLogger* event_logger = g_event_logger.load();
+ if (event_logger) {
+ event_logger->Start(file, false);
}
}
bool StartInternalCapture(absl::string_view filename) {
- if (!g_event_logger)
+ EventLogger* event_logger = g_event_logger.load();
+ if (!event_logger)
return false;
FILE* file = fopen(std::string(filename).c_str(), "w");
@@ -384,23 +387,22 @@
<< "' for writing.";
return false;
}
- g_event_logger->Start(file, true);
+ event_logger->Start(file, true);
return true;
}
void StopInternalCapture() {
- if (g_event_logger) {
- g_event_logger->Stop();
+ EventLogger* event_logger = g_event_logger.load();
+ if (event_logger) {
+ event_logger->Stop();
}
}
void ShutdownInternalTracer() {
StopInternalCapture();
- EventLogger* old_logger = rtc::AtomicOps::AcquireLoadPtr(&g_event_logger);
+ EventLogger* old_logger = g_event_logger.load(std::memory_order_acquire);
RTC_DCHECK(old_logger);
- RTC_CHECK(rtc::AtomicOps::CompareAndSwapPtr(
- &g_event_logger, old_logger,
- static_cast<EventLogger*>(nullptr)) == old_logger);
+ RTC_CHECK(g_event_logger.compare_exchange_strong(old_logger, nullptr));
delete old_logger;
webrtc::SetupEventTracer(nullptr, nullptr);
}
diff --git a/rtc_base/thread.cc b/rtc_base/thread.cc
index 6693979..e1db2bc 100644
--- a/rtc_base/thread.cc
+++ b/rtc_base/thread.cc
@@ -33,7 +33,6 @@
#include "absl/algorithm/container.h"
#include "api/sequence_checker.h"
#include "api/task_queue/to_queued_task.h"
-#include "rtc_base/atomic_ops.h"
#include "rtc_base/checks.h"
#include "rtc_base/deprecated/recursive_critical_section.h"
#include "rtc_base/event.h"
@@ -212,19 +211,19 @@
// This works by posting a delayed message at the current time and waiting
// for it to be dispatched on all queues, which will ensure that all messages
// that came before it were also dispatched.
- volatile int queues_not_done = 0;
+ std::atomic<int> queues_not_done(0);
// This class is used so that whether the posted message is processed, or the
// message queue is simply cleared, queues_not_done gets decremented.
class ScopedIncrement : public MessageData {
public:
- ScopedIncrement(volatile int* value) : value_(value) {
- AtomicOps::Increment(value_);
+ ScopedIncrement(std::atomic<int>* value) : value_(value) {
+ value_->fetch_add(1);
}
- ~ScopedIncrement() override { AtomicOps::Decrement(value_); }
+ ~ScopedIncrement() override { value_->fetch_sub(1); }
private:
- volatile int* value_;
+ std::atomic<int>* value_;
};
{
@@ -245,7 +244,7 @@
// Note: One of the message queues may have been on this thread, which is
// why we can't synchronously wait for queues_not_done to go to 0; we need
// to process messages as well.
- while (AtomicOps::AcquireLoad(&queues_not_done) > 0) {
+ while (queues_not_done.load() > 0) {
if (current) {
current->ProcessMessages(0);
}
@@ -436,16 +435,16 @@
}
void Thread::Quit() {
- AtomicOps::ReleaseStore(&stop_, 1);
+ stop_.store(1, std::memory_order_release);
WakeUpSocketServer();
}
bool Thread::IsQuitting() {
- return AtomicOps::AcquireLoad(&stop_) != 0;
+ return stop_.load(std::memory_order_acquire) != 0;
}
void Thread::Restart() {
- AtomicOps::ReleaseStore(&stop_, 0);
+ stop_.store(0, std::memory_order_release);
}
bool Thread::Peek(Message* pmsg, int cmsWait) {
diff --git a/rtc_base/thread.h b/rtc_base/thread.h
index 885d7b8..3364684 100644
--- a/rtc_base/thread.h
+++ b/rtc_base/thread.h
@@ -628,7 +628,7 @@
bool fInitialized_;
bool fDestroyed_;
- volatile int stop_;
+ std::atomic<int> stop_;
// The SocketServer might not be owned by Thread.
SocketServer* const ss_;
diff --git a/rtc_base/thread_unittest.cc b/rtc_base/thread_unittest.cc
index 5490e61..321cbc3 100644
--- a/rtc_base/thread_unittest.cc
+++ b/rtc_base/thread_unittest.cc
@@ -17,7 +17,6 @@
#include "api/task_queue/to_queued_task.h"
#include "rtc_base/async_invoker.h"
#include "rtc_base/async_udp_socket.h"
-#include "rtc_base/atomic_ops.h"
#include "rtc_base/checks.h"
#include "rtc_base/event.h"
#include "rtc_base/gunit.h"
@@ -658,7 +657,7 @@
a->Start();
b->Start();
- volatile int messages_processed = 0;
+ std::atomic<int> messages_processed(0);
auto incrementer = [&messages_processed,
&entered_process_all_message_queues] {
// Wait for event as a means to ensure Increment doesn't occur outside
@@ -666,7 +665,7 @@
// the main thread, which is guaranteed to be handled inside
// ProcessAllMessageQueues.
entered_process_all_message_queues.Wait(Event::kForever);
- AtomicOps::Increment(&messages_processed);
+ messages_processed.fetch_add(1);
};
auto event_signaler = [&entered_process_all_message_queues] {
entered_process_all_message_queues.Set();
@@ -680,7 +679,7 @@
main_thread.PostTask(ToQueuedTask(event_signaler));
ThreadManager::ProcessAllMessageQueuesForTesting();
- EXPECT_EQ(4, AtomicOps::AcquireLoad(&messages_processed));
+ EXPECT_EQ(4, messages_processed.load(std::memory_order_acquire));
}
// Test that ProcessAllMessageQueues doesn't hang if a thread is quitting.
diff --git a/sdk/BUILD.gn b/sdk/BUILD.gn
index 649320a..db266b8 100644
--- a/sdk/BUILD.gn
+++ b/sdk/BUILD.gn
@@ -277,7 +277,6 @@
"../modules/audio_device:audio_device_buffer",
"../modules/audio_device:audio_device_generic",
"../rtc_base",
- "../rtc_base:atomicops",
"../rtc_base:buffer",
"../rtc_base:checks",
"../rtc_base:logging",
@@ -348,7 +347,6 @@
":base_objc",
":helpers_objc",
"../rtc_base",
- "../rtc_base:atomicops",
"../rtc_base:checks",
"../rtc_base/synchronization:mutex",
]
diff --git a/sdk/android/BUILD.gn b/sdk/android/BUILD.gn
index 8bed067..8611707 100644
--- a/sdk/android/BUILD.gn
+++ b/sdk/android/BUILD.gn
@@ -951,7 +951,6 @@
":generated_native_api_jni",
":internal_jni",
"../../api:sequence_checker",
- "../../rtc_base:atomicops",
"//api:array_view",
"//rtc_base:checks",
]
diff --git a/sdk/android/src/jni/jni_generator_helper.cc b/sdk/android/src/jni/jni_generator_helper.cc
index 8ddcdff..dc34849 100644
--- a/sdk/android/src/jni/jni_generator_helper.cc
+++ b/sdk/android/src/jni/jni_generator_helper.cc
@@ -10,7 +10,6 @@
#include "sdk/android/src/jni/jni_generator_helper.h"
-#include "rtc_base/atomic_ops.h"
#include "sdk/android/native_api/jni/class_loader.h"
namespace webrtc {
diff --git a/sdk/objc/components/audio/RTCAudioSession.mm b/sdk/objc/components/audio/RTCAudioSession.mm
index 0d0db5a..550a426 100644
--- a/sdk/objc/components/audio/RTCAudioSession.mm
+++ b/sdk/objc/components/audio/RTCAudioSession.mm
@@ -12,10 +12,10 @@
#import <UIKit/UIKit.h>
+#include <atomic>
#include <vector>
#include "absl/base/attributes.h"
-#include "rtc_base/atomic_ops.h"
#include "rtc_base/checks.h"
#include "rtc_base/synchronization/mutex.h"
@@ -48,8 +48,8 @@
@implementation RTC_OBJC_TYPE (RTCAudioSession) {
webrtc::Mutex _mutex;
AVAudioSession *_session;
- volatile int _activationCount;
- volatile int _webRTCSessionCount;
+ std::atomic<int> _activationCount;
+ std::atomic<int> _webRTCSessionCount;
BOOL _isActive;
BOOL _useManualAudio;
BOOL _isAudioEnabled;
@@ -351,7 +351,7 @@
if (![self checkLock:outError]) {
return NO;
}
- int activationCount = _activationCount;
+ int activationCount = _activationCount.load();
if (!active && activationCount == 0) {
RTCLogWarning(@"Attempting to deactivate without prior activation.");
}
@@ -403,7 +403,7 @@
[self notifyDidSetActive:active];
[self decrementActivationCount];
}
- RTCLog(@"Number of current activations: %d", _activationCount);
+ RTCLog(@"Number of current activations: %d", _activationCount.load());
return success;
}
@@ -643,21 +643,21 @@
}
- (int)activationCount {
- return _activationCount;
+ return _activationCount.load();
}
- (int)incrementActivationCount {
RTCLog(@"Incrementing activation count.");
- return rtc::AtomicOps::Increment(&_activationCount);
+ return _activationCount.fetch_add(1) + 1;
}
- (NSInteger)decrementActivationCount {
RTCLog(@"Decrementing activation count.");
- return rtc::AtomicOps::Decrement(&_activationCount);
+ return _activationCount.fetch_sub(1) - 1;
}
- (int)webRTCSessionCount {
- return _webRTCSessionCount;
+ return _webRTCSessionCount.load();
}
- (BOOL)canPlayOrRecord {
@@ -693,7 +693,7 @@
if (outError) {
*outError = nil;
}
- rtc::AtomicOps::Increment(&_webRTCSessionCount);
+ _webRTCSessionCount.fetch_add(1);
[self notifyDidStartPlayOrRecord];
return YES;
}
@@ -702,7 +702,7 @@
if (outError) {
*outError = nil;
}
- rtc::AtomicOps::Decrement(&_webRTCSessionCount);
+ _webRTCSessionCount.fetch_sub(1);
[self notifyDidStopPlayOrRecord];
return YES;
}
diff --git a/sdk/objc/native/src/audio/audio_device_ios.h b/sdk/objc/native/src/audio/audio_device_ios.h
index 69fd8a9..dc9f462 100644
--- a/sdk/objc/native/src/audio/audio_device_ios.h
+++ b/sdk/objc/native/src/audio/audio_device_ios.h
@@ -11,6 +11,7 @@
#ifndef SDK_OBJC_NATIVE_SRC_AUDIO_AUDIO_DEVICE_IOS_H_
#define SDK_OBJC_NATIVE_SRC_AUDIO_AUDIO_DEVICE_IOS_H_
+#include <atomic>
#include <memory>
#include "api/sequence_checker.h"
@@ -266,10 +267,10 @@
rtc::BufferT<int16_t> record_audio_buffer_;
// Set to 1 when recording is active and 0 otherwise.
- volatile int recording_;
+ std::atomic<int> recording_;
// Set to 1 when playout is active and 0 otherwise.
- volatile int playing_;
+ std::atomic<int> playing_;
// Set to true after successful call to Init(), false otherwise.
bool initialized_ RTC_GUARDED_BY(thread_checker_);
diff --git a/sdk/objc/native/src/audio/audio_device_ios.mm b/sdk/objc/native/src/audio/audio_device_ios.mm
index a416b92..f3f87c0 100644
--- a/sdk/objc/native/src/audio/audio_device_ios.mm
+++ b/sdk/objc/native/src/audio/audio_device_ios.mm
@@ -18,7 +18,6 @@
#include "api/array_view.h"
#include "helpers.h"
#include "modules/audio_device/fine_audio_buffer.h"
-#include "rtc_base/atomic_ops.h"
#include "rtc_base/checks.h"
#include "rtc_base/logging.h"
#include "rtc_base/thread.h"
@@ -188,7 +187,7 @@
RTC_DCHECK_RUN_ON(&thread_checker_);
RTC_DCHECK(initialized_);
RTC_DCHECK(!audio_is_initialized_);
- RTC_DCHECK(!playing_);
+ RTC_DCHECK(!playing_.load());
if (!audio_is_initialized_) {
if (!InitPlayOrRecord()) {
RTC_LOG_F(LS_ERROR) << "InitPlayOrRecord failed for InitPlayout!";
@@ -214,7 +213,7 @@
RTC_DCHECK_RUN_ON(&thread_checker_);
RTC_DCHECK(initialized_);
RTC_DCHECK(!audio_is_initialized_);
- RTC_DCHECK(!recording_);
+ RTC_DCHECK(!recording_.load());
if (!audio_is_initialized_) {
if (!InitPlayOrRecord()) {
RTC_LOG_F(LS_ERROR) << "InitPlayOrRecord failed for InitRecording!";
@@ -229,12 +228,12 @@
LOGI() << "StartPlayout";
RTC_DCHECK_RUN_ON(&thread_checker_);
RTC_DCHECK(audio_is_initialized_);
- RTC_DCHECK(!playing_);
+ RTC_DCHECK(!playing_.load());
RTC_DCHECK(audio_unit_);
if (fine_audio_buffer_) {
fine_audio_buffer_->ResetPlayout();
}
- if (!recording_ && audio_unit_->GetState() == VoiceProcessingAudioUnit::kInitialized) {
+ if (!recording_.load() && audio_unit_->GetState() == VoiceProcessingAudioUnit::kInitialized) {
OSStatus result = audio_unit_->Start();
if (result != noErr) {
RTC_OBJC_TYPE(RTCAudioSession)* session = [RTC_OBJC_TYPE(RTCAudioSession) sharedInstance];
@@ -244,7 +243,7 @@
}
RTC_LOG(LS_INFO) << "Voice-Processing I/O audio unit is now started";
}
- rtc::AtomicOps::ReleaseStore(&playing_, 1);
+ playing_.store(1, std::memory_order_release);
num_playout_callbacks_ = 0;
num_detected_playout_glitches_ = 0;
return 0;
@@ -253,14 +252,14 @@
int32_t AudioDeviceIOS::StopPlayout() {
LOGI() << "StopPlayout";
RTC_DCHECK_RUN_ON(&thread_checker_);
- if (!audio_is_initialized_ || !playing_) {
+ if (!audio_is_initialized_ || !playing_.load()) {
return 0;
}
- if (!recording_) {
+ if (!recording_.load()) {
ShutdownPlayOrRecord();
audio_is_initialized_ = false;
}
- rtc::AtomicOps::ReleaseStore(&playing_, 0);
+ playing_.store(0, std::memory_order_release);
// Derive average number of calls to OnGetPlayoutData() between detected
// audio glitches and add the result to a histogram.
@@ -278,19 +277,19 @@
}
bool AudioDeviceIOS::Playing() const {
- return playing_;
+ return playing_.load();
}
int32_t AudioDeviceIOS::StartRecording() {
LOGI() << "StartRecording";
RTC_DCHECK_RUN_ON(&thread_checker_);
RTC_DCHECK(audio_is_initialized_);
- RTC_DCHECK(!recording_);
+ RTC_DCHECK(!recording_.load());
RTC_DCHECK(audio_unit_);
if (fine_audio_buffer_) {
fine_audio_buffer_->ResetRecord();
}
- if (!playing_ && audio_unit_->GetState() == VoiceProcessingAudioUnit::kInitialized) {
+ if (!playing_.load() && audio_unit_->GetState() == VoiceProcessingAudioUnit::kInitialized) {
OSStatus result = audio_unit_->Start();
if (result != noErr) {
RTC_OBJC_TYPE(RTCAudioSession)* session = [RTC_OBJC_TYPE(RTCAudioSession) sharedInstance];
@@ -300,26 +299,26 @@
}
RTC_LOG(LS_INFO) << "Voice-Processing I/O audio unit is now started";
}
- rtc::AtomicOps::ReleaseStore(&recording_, 1);
+ recording_.store(1, std::memory_order_release);
return 0;
}
int32_t AudioDeviceIOS::StopRecording() {
LOGI() << "StopRecording";
RTC_DCHECK_RUN_ON(&thread_checker_);
- if (!audio_is_initialized_ || !recording_) {
+ if (!audio_is_initialized_ || !recording_.load()) {
return 0;
}
- if (!playing_) {
+ if (!playing_.load()) {
ShutdownPlayOrRecord();
audio_is_initialized_ = false;
}
- rtc::AtomicOps::ReleaseStore(&recording_, 0);
+ recording_.store(0, std::memory_order_release);
return 0;
}
bool AudioDeviceIOS::Recording() const {
- return recording_;
+ return recording_.load();
}
int32_t AudioDeviceIOS::PlayoutDelay(uint16_t& delayMS) const {
@@ -381,7 +380,7 @@
RTC_DCHECK_RUN_ON(&io_thread_checker_);
OSStatus result = noErr;
// Simply return if recording is not enabled.
- if (!rtc::AtomicOps::AcquireLoad(&recording_)) return result;
+ if (!recording_.load(std::memory_order_acquire)) return result;
// Set the size of our own audio buffer and clear it first to avoid copying
// in combination with potential reallocations.
@@ -434,7 +433,7 @@
// Produce silence and give audio unit a hint about it if playout is not
// activated.
- if (!rtc::AtomicOps::AcquireLoad(&playing_)) {
+ if (!playing_.load(std::memory_order_acquire)) {
const size_t size_in_bytes = audio_buffer->mDataByteSize;
RTC_CHECK_EQ(size_in_bytes / VoiceProcessingAudioUnit::kBytesPerSample, num_frames);
*flags |= kAudioUnitRenderAction_OutputIsSilence;
@@ -783,16 +782,17 @@
case VoiceProcessingAudioUnit::kUninitialized:
RTCLog(@"VPAU state: Uninitialized");
should_initialize_audio_unit = can_play_or_record;
- should_start_audio_unit = should_initialize_audio_unit && (playing_ || recording_);
+ should_start_audio_unit =
+ should_initialize_audio_unit && (playing_.load() || recording_.load());
break;
case VoiceProcessingAudioUnit::kInitialized:
RTCLog(@"VPAU state: Initialized");
- should_start_audio_unit = can_play_or_record && (playing_ || recording_);
+ should_start_audio_unit = can_play_or_record && (playing_.load() || recording_.load());
should_uninitialize_audio_unit = !can_play_or_record;
break;
case VoiceProcessingAudioUnit::kStarted:
RTCLog(@"VPAU state: Started");
- RTC_DCHECK(playing_ || recording_);
+ RTC_DCHECK(playing_.load() || recording_.load());
should_stop_audio_unit = !can_play_or_record;
should_uninitialize_audio_unit = should_stop_audio_unit;
break;
diff --git a/system_wrappers/BUILD.gn b/system_wrappers/BUILD.gn
index 4e424d9..c979a6a 100644
--- a/system_wrappers/BUILD.gn
+++ b/system_wrappers/BUILD.gn
@@ -102,7 +102,6 @@
defines = [ "WEBRTC_EXCLUDE_METRICS_DEFAULT" ]
}
deps = [
- "../rtc_base:atomicops",
"../rtc_base:checks",
"../rtc_base:macromagic",
"../rtc_base:stringutils",
diff --git a/system_wrappers/include/metrics.h b/system_wrappers/include/metrics.h
index 7bf7983..ca9ed6d 100644
--- a/system_wrappers/include/metrics.h
+++ b/system_wrappers/include/metrics.h
@@ -13,12 +13,12 @@
#include <stddef.h>
+#include <atomic>
#include <map>
#include <memory>
#include <string>
#include "absl/strings/string_view.h"
-#include "rtc_base/atomic_ops.h"
#include "rtc_base/checks.h"
#include "rtc_base/string_utils.h"
@@ -190,25 +190,22 @@
webrtc::metrics::HistogramFactoryGetEnumeration(name, boundary))
// The name of the histogram should not vary.
-#define RTC_HISTOGRAM_COMMON_BLOCK(constant_name, sample, \
- factory_get_invocation) \
- do { \
- static webrtc::metrics::Histogram* atomic_histogram_pointer = nullptr; \
- webrtc::metrics::Histogram* histogram_pointer = \
- rtc::AtomicOps::AcquireLoadPtr(&atomic_histogram_pointer); \
- if (!histogram_pointer) { \
- histogram_pointer = factory_get_invocation; \
- webrtc::metrics::Histogram* prev_pointer = \
- rtc::AtomicOps::CompareAndSwapPtr( \
- &atomic_histogram_pointer, \
- static_cast<webrtc::metrics::Histogram*>(nullptr), \
- histogram_pointer); \
- RTC_DCHECK(prev_pointer == nullptr || \
- prev_pointer == histogram_pointer); \
- } \
- if (histogram_pointer) { \
- webrtc::metrics::HistogramAdd(histogram_pointer, sample); \
- } \
+#define RTC_HISTOGRAM_COMMON_BLOCK(constant_name, sample, \
+ factory_get_invocation) \
+ do { \
+ static std::atomic<webrtc::metrics::Histogram*> atomic_histogram_pointer( \
+ nullptr); \
+ webrtc::metrics::Histogram* histogram_pointer = \
+ atomic_histogram_pointer.load(std::memory_order_acquire); \
+ if (!histogram_pointer) { \
+ histogram_pointer = factory_get_invocation; \
+ webrtc::metrics::Histogram* null_histogram = nullptr; \
+ atomic_histogram_pointer.compare_exchange_strong(null_histogram, \
+ histogram_pointer); \
+ } \
+ if (histogram_pointer) { \
+ webrtc::metrics::HistogramAdd(histogram_pointer, sample); \
+ } \
} while (0)
// The histogram is constructed/found for each call.
diff --git a/system_wrappers/source/metrics.cc b/system_wrappers/source/metrics.cc
index 0063405..39ca590 100644
--- a/system_wrappers/source/metrics.cc
+++ b/system_wrappers/source/metrics.cc
@@ -190,15 +190,13 @@
// The histogram getter functions, which return pointer values to the histograms
// in the map, are cached in WebRTC. Therefore, this memory is not freed by the
// application (the memory will be reclaimed by the OS).
-static RtcHistogramMap* volatile g_rtc_histogram_map = nullptr;
+static std::atomic<RtcHistogramMap*> g_rtc_histogram_map(nullptr);
void CreateMap() {
- RtcHistogramMap* map = rtc::AtomicOps::AcquireLoadPtr(&g_rtc_histogram_map);
+ RtcHistogramMap* map = g_rtc_histogram_map.load(std::memory_order_acquire);
if (map == nullptr) {
RtcHistogramMap* new_map = new RtcHistogramMap();
- RtcHistogramMap* old_map = rtc::AtomicOps::CompareAndSwapPtr(
- &g_rtc_histogram_map, static_cast<RtcHistogramMap*>(nullptr), new_map);
- if (old_map != nullptr)
+ if (!g_rtc_histogram_map.compare_exchange_strong(map, new_map))
delete new_map;
}
}
@@ -206,15 +204,15 @@
// Set the first time we start using histograms. Used to make sure Enable() is
// not called thereafter.
#if RTC_DCHECK_IS_ON
-static volatile int g_rtc_histogram_called = 0;
+static std::atomic<int> g_rtc_histogram_called(0);
#endif
// Gets the map (or nullptr).
RtcHistogramMap* GetMap() {
#if RTC_DCHECK_IS_ON
- rtc::AtomicOps::ReleaseStore(&g_rtc_histogram_called, 1);
+ g_rtc_histogram_called.store(1, std::memory_order_release);
#endif
- return g_rtc_histogram_map;
+ return g_rtc_histogram_map.load();
}
} // namespace
@@ -287,9 +285,9 @@
// Implementation of global functions in metrics.h.
void Enable() {
- RTC_DCHECK(g_rtc_histogram_map == nullptr);
+ RTC_DCHECK(g_rtc_histogram_map.load() == nullptr);
#if RTC_DCHECK_IS_ON
- RTC_DCHECK_EQ(0, rtc::AtomicOps::AcquireLoad(&g_rtc_histogram_called));
+ RTC_DCHECK_EQ(0, g_rtc_histogram_called.load(std::memory_order_acquire));
#endif
CreateMap();
}
diff --git a/video/BUILD.gn b/video/BUILD.gn
index 2bf0454..ac16524 100644
--- a/video/BUILD.gn
+++ b/video/BUILD.gn
@@ -112,7 +112,6 @@
"../modules/video_coding/timing:inter_frame_delay",
"../modules/video_coding/timing:timing_module",
"../modules/video_processing",
- "../rtc_base:atomicops",
"../rtc_base:checks",
"../rtc_base:event_tracer",
"../rtc_base:histogram_percentile_counter",
diff --git a/video/video_send_stream_impl.cc b/video/video_send_stream_impl.cc
index 7e81528..83fa9e1 100644
--- a/video/video_send_stream_impl.cc
+++ b/video/video_send_stream_impl.cc
@@ -26,7 +26,6 @@
#include "call/rtp_transport_controller_send_interface.h"
#include "call/video_send_stream.h"
#include "modules/pacing/pacing_controller.h"
-#include "rtc_base/atomic_ops.h"
#include "rtc_base/checks.h"
#include "rtc_base/experiments/alr_experiment.h"
#include "rtc_base/experiments/field_trial_parser.h"