Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(490)

Side by Side Diff: webrtc/logging/rtc_event_log/rtc_event_log.cc

Issue 2956003003: Limit the number of simultaneous event logs. (Closed)
Patch Set: Use atomics instead of lock. Created 3 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright (c) 2015 The WebRTC project authors. All Rights Reserved. 2 * Copyright (c) 2015 The WebRTC project authors. All Rights Reserved.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license 4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source 5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found 6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may 7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree. 8 * be found in the AUTHORS file in the root of the source tree.
9 */ 9 */
10 10
11 #include "webrtc/logging/rtc_event_log/rtc_event_log.h" 11 #include "webrtc/logging/rtc_event_log/rtc_event_log.h"
12 12
13 #include <limits> 13 #include <limits>
14 #include <vector> 14 #include <vector>
15 15
16 #include "webrtc/base/atomicops.h"
16 #include "webrtc/base/checks.h" 17 #include "webrtc/base/checks.h"
17 #include "webrtc/base/constructormagic.h" 18 #include "webrtc/base/constructormagic.h"
18 #include "webrtc/base/event.h" 19 #include "webrtc/base/event.h"
19 #include "webrtc/base/logging.h" 20 #include "webrtc/base/logging.h"
20 #include "webrtc/base/protobuf_utils.h" 21 #include "webrtc/base/protobuf_utils.h"
21 #include "webrtc/base/swap_queue.h" 22 #include "webrtc/base/swap_queue.h"
22 #include "webrtc/base/thread_checker.h" 23 #include "webrtc/base/thread_checker.h"
23 #include "webrtc/base/timeutils.h" 24 #include "webrtc/base/timeutils.h"
24 #include "webrtc/logging/rtc_event_log/rtc_event_log_helper_thread.h" 25 #include "webrtc/logging/rtc_event_log/rtc_event_log_helper_thread.h"
25 #include "webrtc/modules/audio_coding/audio_network_adaptor/include/audio_networ k_adaptor.h" 26 #include "webrtc/modules/audio_coding/audio_network_adaptor/include/audio_networ k_adaptor.h"
(...skipping 19 matching lines...) Expand all
45 #else 46 #else
46 #include "webrtc/logging/rtc_event_log/rtc_event_log.pb.h" 47 #include "webrtc/logging/rtc_event_log/rtc_event_log.pb.h"
47 #endif 48 #endif
48 #endif 49 #endif
49 50
50 namespace webrtc { 51 namespace webrtc {
51 52
52 #ifdef ENABLE_RTC_EVENT_LOG 53 #ifdef ENABLE_RTC_EVENT_LOG
53 54
54 class RtcEventLogImpl final : public RtcEventLog { 55 class RtcEventLogImpl final : public RtcEventLog {
56 friend std::unique_ptr<RtcEventLog> RtcEventLog::Create();
57
55 public: 58 public:
56 RtcEventLogImpl();
57 ~RtcEventLogImpl() override; 59 ~RtcEventLogImpl() override;
58 60
59 bool StartLogging(const std::string& file_name, 61 bool StartLogging(const std::string& file_name,
60 int64_t max_size_bytes) override; 62 int64_t max_size_bytes) override;
61 bool StartLogging(rtc::PlatformFile platform_file, 63 bool StartLogging(rtc::PlatformFile platform_file,
62 int64_t max_size_bytes) override; 64 int64_t max_size_bytes) override;
63 void StopLogging() override; 65 void StopLogging() override;
64 void LogVideoReceiveStreamConfig(const rtclog::StreamConfig& config) override; 66 void LogVideoReceiveStreamConfig(const rtclog::StreamConfig& config) override;
65 void LogVideoSendStreamConfig(const rtclog::StreamConfig& config) override; 67 void LogVideoSendStreamConfig(const rtclog::StreamConfig& config) override;
66 void LogAudioReceiveStreamConfig(const rtclog::StreamConfig& config) override; 68 void LogAudioReceiveStreamConfig(const rtclog::StreamConfig& config) override;
(...skipping 18 matching lines...) Expand all
85 const AudioEncoderRuntimeConfig& config) override; 87 const AudioEncoderRuntimeConfig& config) override;
86 void LogProbeClusterCreated(int id, 88 void LogProbeClusterCreated(int id,
87 int bitrate_bps, 89 int bitrate_bps,
88 int min_probes, 90 int min_probes,
89 int min_bytes) override; 91 int min_bytes) override;
90 void LogProbeResultSuccess(int id, int bitrate_bps) override; 92 void LogProbeResultSuccess(int id, int bitrate_bps) override;
91 void LogProbeResultFailure(int id, 93 void LogProbeResultFailure(int id,
92 ProbeFailureReason failure_reason) override; 94 ProbeFailureReason failure_reason) override;
93 95
94 private: 96 private:
97 // Private constructor to ensure that creation is done by RtcEventLog::Create.
98 RtcEventLogImpl();
99
95 void StoreEvent(std::unique_ptr<rtclog::Event>* event); 100 void StoreEvent(std::unique_ptr<rtclog::Event>* event);
96 void LogProbeResult(int id, 101 void LogProbeResult(int id,
97 rtclog::BweProbeResult::ResultType result, 102 rtclog::BweProbeResult::ResultType result,
98 int bitrate_bps); 103 int bitrate_bps);
99 104
105 static volatile int log_count_;
106
100 // Message queue for passing control messages to the logging thread. 107 // Message queue for passing control messages to the logging thread.
101 SwapQueue<RtcEventLogHelperThread::ControlMessage> message_queue_; 108 SwapQueue<RtcEventLogHelperThread::ControlMessage> message_queue_;
102 109
103 // Message queue for passing events to the logging thread. 110 // Message queue for passing events to the logging thread.
104 SwapQueue<std::unique_ptr<rtclog::Event> > event_queue_; 111 SwapQueue<std::unique_ptr<rtclog::Event> > event_queue_;
105 112
106 RtcEventLogHelperThread helper_thread_; 113 RtcEventLogHelperThread helper_thread_;
107 rtc::ThreadChecker thread_checker_; 114 rtc::ThreadChecker thread_checker_;
108 115
109 RTC_DISALLOW_COPY_AND_ASSIGN(RtcEventLogImpl); 116 RTC_DISALLOW_COPY_AND_ASSIGN(RtcEventLogImpl);
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
155 RTC_NOTREACHED(); 162 RTC_NOTREACHED();
156 return rtclog::BweProbeResult::SUCCESS; 163 return rtclog::BweProbeResult::SUCCESS;
157 } 164 }
158 165
159 // The RTP and RTCP buffers reserve space for twice the expected number of 166 // The RTP and RTCP buffers reserve space for twice the expected number of
160 // sent packets because they also contain received packets. 167 // sent packets because they also contain received packets.
161 static const int kEventsPerSecond = 1000; 168 static const int kEventsPerSecond = 1000;
162 static const int kControlMessagesPerSecond = 10; 169 static const int kControlMessagesPerSecond = 10;
163 } // namespace 170 } // namespace
164 171
172 volatile int RtcEventLogImpl::log_count_ = 0;
173
165 // RtcEventLogImpl member functions. 174 // RtcEventLogImpl member functions.
166 RtcEventLogImpl::RtcEventLogImpl() 175 RtcEventLogImpl::RtcEventLogImpl()
167 // Allocate buffers for roughly one second of history. 176 // Allocate buffers for roughly one second of history.
168 : message_queue_(kControlMessagesPerSecond), 177 : message_queue_(kControlMessagesPerSecond),
169 event_queue_(kEventsPerSecond), 178 event_queue_(kEventsPerSecond),
170 helper_thread_(&message_queue_, &event_queue_), 179 helper_thread_(&message_queue_, &event_queue_),
171 thread_checker_() { 180 thread_checker_() {
172 thread_checker_.DetachFromThread(); 181 thread_checker_.DetachFromThread();
173 } 182 }
174 183
175 RtcEventLogImpl::~RtcEventLogImpl() { 184 RtcEventLogImpl::~RtcEventLogImpl() {
176 // The RtcEventLogHelperThread destructor closes the file 185 // The RtcEventLogHelperThread destructor closes the file
177 // and waits for the thread to terminate. 186 // and waits for the thread to terminate.
187 int count = rtc::AtomicOps::Decrement(&RtcEventLogImpl::log_count_);
188 RTC_DCHECK_GE(count, 0);
178 } 189 }
179 190
180 bool RtcEventLogImpl::StartLogging(const std::string& file_name, 191 bool RtcEventLogImpl::StartLogging(const std::string& file_name,
181 int64_t max_size_bytes) { 192 int64_t max_size_bytes) {
182 RTC_DCHECK(thread_checker_.CalledOnValidThread()); 193 RTC_DCHECK(thread_checker_.CalledOnValidThread());
183 RtcEventLogHelperThread::ControlMessage message; 194 RtcEventLogHelperThread::ControlMessage message;
184 message.message_type = RtcEventLogHelperThread::ControlMessage::START_FILE; 195 message.message_type = RtcEventLogHelperThread::ControlMessage::START_FILE;
185 message.max_size_bytes = max_size_bytes <= 0 196 message.max_size_bytes = max_size_bytes <= 0
186 ? std::numeric_limits<int64_t>::max() 197 ? std::numeric_limits<int64_t>::max()
187 : max_size_bytes; 198 : max_size_bytes;
(...skipping 388 matching lines...) Expand 10 before | Expand all | Expand 10 after
576 } 587 }
577 dump_file->CloseFile(); 588 dump_file->CloseFile();
578 return result->ParseFromString(dump_buffer); 589 return result->ParseFromString(dump_buffer);
579 } 590 }
580 591
581 #endif // ENABLE_RTC_EVENT_LOG 592 #endif // ENABLE_RTC_EVENT_LOG
582 593
583 // RtcEventLog member functions. 594 // RtcEventLog member functions.
584 std::unique_ptr<RtcEventLog> RtcEventLog::Create() { 595 std::unique_ptr<RtcEventLog> RtcEventLog::Create() {
585 #ifdef ENABLE_RTC_EVENT_LOG 596 #ifdef ENABLE_RTC_EVENT_LOG
597 constexpr int kMaxLogCount = 5;
598 int count = rtc::AtomicOps::Increment(&RtcEventLogImpl::log_count_);
599 if (count > kMaxLogCount) {
600 LOG(LS_WARNING) << "Denied creation of additional WebRTC event logs. "
601 << count - 1 << " logs open already.";
602 rtc::AtomicOps::Decrement(&RtcEventLogImpl::log_count_);
603 return std::unique_ptr<RtcEventLog>(new RtcEventLogNullImpl());
604 }
586 return std::unique_ptr<RtcEventLog>(new RtcEventLogImpl()); 605 return std::unique_ptr<RtcEventLog>(new RtcEventLogImpl());
587 #else 606 #else
588 return std::unique_ptr<RtcEventLog>(new RtcEventLogNullImpl()); 607 return std::unique_ptr<RtcEventLog>(new RtcEventLogNullImpl());
589 #endif // ENABLE_RTC_EVENT_LOG 608 #endif // ENABLE_RTC_EVENT_LOG
590 } 609 }
591 610
592 std::unique_ptr<RtcEventLog> RtcEventLog::CreateNull() { 611 std::unique_ptr<RtcEventLog> RtcEventLog::CreateNull() {
593 return std::unique_ptr<RtcEventLog>(new RtcEventLogNullImpl()); 612 return std::unique_ptr<RtcEventLog>(new RtcEventLogNullImpl());
594 } 613 }
595 614
596 } // namespace webrtc 615 } // namespace webrtc
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698