Metronome: disable & refactor for single-threaded operation.
The Chromium implementation unfortunately has a rare deadlock.
Rather than patching that up, we're changing the metronome
implementation to be able to use a single-threaded environment
instead.
The metronome functionality is disabled in VideoReceiveStream2
construction inside call.cc.
The new design does not have listener registration or
deresigstration and instead accepts and invokes callbacks, on
the same sequence that requested the callback. This allows
the clients to use features such as WeakPtrFactories or
ScopedThreadSafety for cancellation.
The CL will be followed up with cleanup CLs that removes
registration APIs once downstream consumers have adapted.
Bug: chromium:1381982
Change-Id: I43732d1971e2276c39b431a04365cd2fc3c55c25
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/282280
Reviewed-by: Per Kjellander <perkj@webrtc.org>
Reviewed-by: Erik Språng <sprang@webrtc.org>
Reviewed-by: Evan Shrubsole <eshr@webrtc.org>
Commit-Queue: Markus Handell <handellm@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#38582}
diff --git a/pc/test/integration_test_helpers.h b/pc/test/integration_test_helpers.h
index 1a1172c..21ddacb 100644
--- a/pc/test/integration_test_helpers.h
+++ b/pc/test/integration_test_helpers.h
@@ -180,20 +180,15 @@
class TaskQueueMetronome : public webrtc::Metronome {
public:
- TaskQueueMetronome(TaskQueueFactory* factory, TimeDelta tick_period);
- ~TaskQueueMetronome() override;
+ explicit TaskQueueMetronome(TimeDelta tick_period);
// webrtc::Metronome implementation.
- void AddListener(TickListener* listener) override;
- void RemoveListener(TickListener* listener) override;
+ void RequestCallOnNextTick(absl::AnyInvocable<void() &&> callback) override;
TimeDelta TickPeriod() const override;
private:
- Mutex mutex_;
const TimeDelta tick_period_;
- std::set<TickListener*> listeners_ RTC_GUARDED_BY(mutex_);
- RepeatingTaskHandle tick_task_;
- rtc::TaskQueue queue_;
+ std::vector<absl::AnyInvocable<void() &&>> callbacks_;
};
class SignalingMessageReceiver {
@@ -775,8 +770,8 @@
pc_factory_dependencies.task_queue_factory =
webrtc::CreateDefaultTaskQueueFactory();
pc_factory_dependencies.trials = std::make_unique<FieldTrialBasedConfig>();
- pc_factory_dependencies.metronome = std::make_unique<TaskQueueMetronome>(
- pc_factory_dependencies.task_queue_factory.get(), TimeDelta::Millis(8));
+ pc_factory_dependencies.metronome =
+ std::make_unique<TaskQueueMetronome>(TimeDelta::Millis(8));
cricket::MediaEngineDependencies media_deps;
media_deps.task_queue_factory =
pc_factory_dependencies.task_queue_factory.get();