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 3012263002: Move log_count_ out of RtcEventLogImpl (Closed)
Patch Set: Created 3 years, 3 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
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
65 const int kEventsInHistory = 10000; 65 const int kEventsInHistory = 10000;
66 66
67 bool IsConfigEvent(const rtclog::Event& event) { 67 bool IsConfigEvent(const rtclog::Event& event) {
68 rtclog::Event_EventType event_type = event.type(); 68 rtclog::Event_EventType event_type = event.type();
69 return event_type == rtclog::Event::VIDEO_RECEIVER_CONFIG_EVENT || 69 return event_type == rtclog::Event::VIDEO_RECEIVER_CONFIG_EVENT ||
70 event_type == rtclog::Event::VIDEO_SENDER_CONFIG_EVENT || 70 event_type == rtclog::Event::VIDEO_SENDER_CONFIG_EVENT ||
71 event_type == rtclog::Event::AUDIO_RECEIVER_CONFIG_EVENT || 71 event_type == rtclog::Event::AUDIO_RECEIVER_CONFIG_EVENT ||
72 event_type == rtclog::Event::AUDIO_SENDER_CONFIG_EVENT; 72 event_type == rtclog::Event::AUDIO_SENDER_CONFIG_EVENT;
73 } 73 }
74 74
75 // Observe a limit on the number of concurrent logs, so as not to run into
76 // OS-imposed limits on open files and/or threads/task-queues.
77 // TODO(eladalon): Known issue - there's a race over |rtc_event_log_count|.
78 std::atomic<int> rtc_event_log_count(0);
79
75 // TODO(eladalon): This class exists because C++11 doesn't allow transferring a 80 // TODO(eladalon): This class exists because C++11 doesn't allow transferring a
76 // unique_ptr to a lambda (a copy constructor is required). We should get 81 // unique_ptr to a lambda (a copy constructor is required). We should get
77 // rid of this when we move to C++14. 82 // rid of this when we move to C++14.
78 template <typename T> 83 template <typename T>
79 class ResourceOwningTask final : public rtc::QueuedTask { 84 class ResourceOwningTask final : public rtc::QueuedTask {
80 public: 85 public:
81 ResourceOwningTask(std::unique_ptr<T> resource, 86 ResourceOwningTask(std::unique_ptr<T> resource,
82 std::function<void(std::unique_ptr<T>)> handler) 87 std::function<void(std::unique_ptr<T>)> handler)
83 : resource_(std::move(resource)), handler_(handler) {} 88 : resource_(std::move(resource)), handler_(handler) {}
84 89
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after
150 // event from being added; in this case, the output string is left unchanged. 155 // event from being added; in this case, the output string is left unchanged.
151 bool AppendEventToString(rtclog::Event* event, 156 bool AppendEventToString(rtclog::Event* event,
152 ProtoString* output_string) RTC_WARN_UNUSED_RESULT; 157 ProtoString* output_string) RTC_WARN_UNUSED_RESULT;
153 158
154 void LogToMemory(std::unique_ptr<rtclog::Event> event); 159 void LogToMemory(std::unique_ptr<rtclog::Event> event);
155 160
156 void StartLogFile(); 161 void StartLogFile();
157 void LogToFile(std::unique_ptr<rtclog::Event> event); 162 void LogToFile(std::unique_ptr<rtclog::Event> event);
158 void StopLogFile(int64_t stop_time); 163 void StopLogFile(int64_t stop_time);
159 164
160 // Observe a limit on the number of concurrent logs, so as not to run into
161 // OS-imposed limits on open files and/or threads/task-queues.
162 // TODO(eladalon): Known issue - there's a race over |log_count_|.
163 static std::atomic<int> log_count_;
164
165 // Make sure that the event log is "managed" - created/destroyed, as well 165 // Make sure that the event log is "managed" - created/destroyed, as well
166 // as started/stopped - from the same thread/task-queue. 166 // as started/stopped - from the same thread/task-queue.
167 rtc::SequencedTaskChecker owner_sequence_checker_; 167 rtc::SequencedTaskChecker owner_sequence_checker_;
168 168
169 // History containing all past configuration events. 169 // History containing all past configuration events.
170 std::vector<std::unique_ptr<rtclog::Event>> config_history_ 170 std::vector<std::unique_ptr<rtclog::Event>> config_history_
171 RTC_ACCESS_ON(task_queue_); 171 RTC_ACCESS_ON(task_queue_);
172 172
173 // History containing the most recent (non-configuration) events (~10s). 173 // History containing the most recent (non-configuration) events (~10s).
174 std::deque<std::unique_ptr<rtclog::Event>> history_ 174 std::deque<std::unique_ptr<rtclog::Event>> history_
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
228 return rtclog::BweProbeResult::INVALID_SEND_RECEIVE_RATIO; 228 return rtclog::BweProbeResult::INVALID_SEND_RECEIVE_RATIO;
229 case kTimeout: 229 case kTimeout:
230 return rtclog::BweProbeResult::TIMEOUT; 230 return rtclog::BweProbeResult::TIMEOUT;
231 } 231 }
232 RTC_NOTREACHED(); 232 RTC_NOTREACHED();
233 return rtclog::BweProbeResult::SUCCESS; 233 return rtclog::BweProbeResult::SUCCESS;
234 } 234 }
235 235
236 } // namespace 236 } // namespace
237 237
238 std::atomic<int> RtcEventLogImpl::log_count_(0);
239
240 RtcEventLogImpl::RtcEventLogImpl() 238 RtcEventLogImpl::RtcEventLogImpl()
241 : file_(FileWrapper::Create()), 239 : file_(FileWrapper::Create()),
242 max_size_bytes_(std::numeric_limits<decltype(max_size_bytes_)>::max()), 240 max_size_bytes_(std::numeric_limits<decltype(max_size_bytes_)>::max()),
243 written_bytes_(0), 241 written_bytes_(0),
244 task_queue_("rtc_event_log") {} 242 task_queue_("rtc_event_log") {}
245 243
246 RtcEventLogImpl::~RtcEventLogImpl() { 244 RtcEventLogImpl::~RtcEventLogImpl() {
247 RTC_DCHECK_CALLED_SEQUENTIALLY(&owner_sequence_checker_); 245 RTC_DCHECK_CALLED_SEQUENTIALLY(&owner_sequence_checker_);
248 246
249 // If we're logging to the file, this will stop that. Blocking function. 247 // If we're logging to the file, this will stop that. Blocking function.
250 StopLogging(); 248 StopLogging();
251 249
252 int count = std::atomic_fetch_sub(&RtcEventLogImpl::log_count_, 1) - 1; 250 int count = std::atomic_fetch_sub(&rtc_event_log_count, 1) - 1;
253 RTC_DCHECK_GE(count, 0); 251 RTC_DCHECK_GE(count, 0);
254 } 252 }
255 253
256 bool RtcEventLogImpl::StartLogging(const std::string& file_name, 254 bool RtcEventLogImpl::StartLogging(const std::string& file_name,
257 int64_t max_size_bytes) { 255 int64_t max_size_bytes) {
258 RTC_DCHECK_CALLED_SEQUENTIALLY(&owner_sequence_checker_); 256 RTC_DCHECK_CALLED_SEQUENTIALLY(&owner_sequence_checker_);
259 257
260 auto file = rtc::WrapUnique<FileWrapper>(FileWrapper::Create()); 258 auto file = rtc::WrapUnique<FileWrapper>(FileWrapper::Create());
261 if (!file->OpenFile(file_name.c_str(), false)) { 259 if (!file->OpenFile(file_name.c_str(), false)) {
262 LOG(LS_ERROR) << "Can't open file. WebRTC event log not started."; 260 LOG(LS_ERROR) << "Can't open file. WebRTC event log not started.";
(...skipping 541 matching lines...) Expand 10 before | Expand all | Expand 10 after
804 802
805 file_->CloseFile(); 803 file_->CloseFile();
806 RTC_DCHECK(!file_->is_open()); 804 RTC_DCHECK(!file_->is_open());
807 } 805 }
808 806
809 #endif // ENABLE_RTC_EVENT_LOG 807 #endif // ENABLE_RTC_EVENT_LOG
810 808
811 // RtcEventLog member functions. 809 // RtcEventLog member functions.
812 std::unique_ptr<RtcEventLog> RtcEventLog::Create() { 810 std::unique_ptr<RtcEventLog> RtcEventLog::Create() {
813 #ifdef ENABLE_RTC_EVENT_LOG 811 #ifdef ENABLE_RTC_EVENT_LOG
814 // TODO(eladalon): Known issue - there's a race over |log_count_| here. 812 // TODO(eladalon): Known issue - there's a race over |rtc_event_log_count|.
815 constexpr int kMaxLogCount = 5; 813 constexpr int kMaxLogCount = 5;
816 int count = 1 + std::atomic_fetch_add(&RtcEventLogImpl::log_count_, 1); 814 int count = 1 + std::atomic_fetch_add(&rtc_event_log_count, 1);
817 if (count > kMaxLogCount) { 815 if (count > kMaxLogCount) {
818 LOG(LS_WARNING) << "Denied creation of additional WebRTC event logs. " 816 LOG(LS_WARNING) << "Denied creation of additional WebRTC event logs. "
819 << count - 1 << " logs open already."; 817 << count - 1 << " logs open already.";
820 std::atomic_fetch_sub(&RtcEventLogImpl::log_count_, 1); 818 std::atomic_fetch_sub(&rtc_event_log_count, 1);
821 return std::unique_ptr<RtcEventLog>(new RtcEventLogNullImpl()); 819 return std::unique_ptr<RtcEventLog>(new RtcEventLogNullImpl());
822 } 820 }
823 return std::unique_ptr<RtcEventLog>(new RtcEventLogImpl()); 821 return std::unique_ptr<RtcEventLog>(new RtcEventLogImpl());
824 #else 822 #else
825 return CreateNull(); 823 return CreateNull();
826 #endif // ENABLE_RTC_EVENT_LOG 824 #endif // ENABLE_RTC_EVENT_LOG
827 } 825 }
828 826
829 std::unique_ptr<RtcEventLog> RtcEventLog::CreateNull() { 827 std::unique_ptr<RtcEventLog> RtcEventLog::CreateNull() {
830 return std::unique_ptr<RtcEventLog>(new RtcEventLogNullImpl()); 828 return std::unique_ptr<RtcEventLog>(new RtcEventLogNullImpl());
831 } 829 }
832 830
833 } // namespace webrtc 831 } // 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