From: Andreas Pehrson Date: Mon, 5 Sep 2022 13:56:00 +0000 Subject: Bug 1786502 - Lock access to DeviceInfo devicechange callbacks. r=webrtc-reviewers,jib Differential Revision: https://phabricator.services.mozilla.com/D155365 Mercurial Revision: https://hg.mozilla.org/mozilla-central/rev/e826dfadfe1264c59d9b13e3c17d6f75a40f5c33 --- modules/video_capture/video_capture.h | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/modules/video_capture/video_capture.h b/modules/video_capture/video_capture.h index 7279bed476..db07580921 100644 --- a/modules/video_capture/video_capture.h +++ b/modules/video_capture/video_capture.h @@ -16,6 +16,8 @@ #include "modules/desktop_capture/desktop_capture_types.h" #include "modules/video_capture/raw_video_sink_interface.h" #include "modules/video_capture/video_capture_defines.h" +#include "rtc_base/synchronization/mutex.h" +#include "rtc_base/thread_annotations.h" #include #if defined(ANDROID) @@ -40,15 +42,18 @@ class VideoCaptureModule : public RefCountInterface { virtual uint32_t NumberOfDevices() = 0; virtual int32_t Refresh() = 0; virtual void DeviceChange() { + MutexLock lock(&_inputCallbacksMutex); for (auto inputCallBack : _inputCallBacks) { inputCallBack->OnDeviceChange(); } } virtual void RegisterVideoInputFeedBack(VideoInputFeedBack* callBack) { + MutexLock lock(&_inputCallbacksMutex); _inputCallBacks.insert(callBack); } virtual void DeRegisterVideoInputFeedBack(VideoInputFeedBack* callBack) { + MutexLock lock(&_inputCallbacksMutex); auto it = _inputCallBacks.find(callBack); if (it != _inputCallBacks.end()) { _inputCallBacks.erase(it); @@ -102,7 +107,8 @@ class VideoCaptureModule : public RefCountInterface { virtual ~DeviceInfo() {} private: - std::set _inputCallBacks; + Mutex _inputCallbacksMutex; + std::set _inputCallBacks RTC_GUARDED_BY(_inputCallbacksMutex); }; // Register capture data callback