OLD | NEW |
1 /* | 1 /* |
2 * libjingle | 2 * libjingle |
3 * Copyright 2014 Google Inc. | 3 * Copyright 2014 Google Inc. |
4 * | 4 * |
5 * Redistribution and use in source and binary forms, with or without | 5 * Redistribution and use in source and binary forms, with or without |
6 * modification, are permitted provided that the following conditions are met: | 6 * modification, are permitted provided that the following conditions are met: |
7 * | 7 * |
8 * 1. Redistributions of source code must retain the above copyright notice, | 8 * 1. Redistributions of source code must retain the above copyright notice, |
9 * this list of conditions and the following disclaimer. | 9 * this list of conditions and the following disclaimer. |
10 * 2. Redistributions in binary form must reproduce the above copyright notice, | 10 * 2. Redistributions in binary form must reproduce the above copyright notice, |
(...skipping 14 matching lines...) Expand all Loading... |
25 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | 25 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
26 */ | 26 */ |
27 | 27 |
28 #include "talk/app/webrtc/statstypes.h" | 28 #include "talk/app/webrtc/statstypes.h" |
29 | 29 |
30 #include <string.h> | 30 #include <string.h> |
31 | 31 |
32 #include "webrtc/base/checks.h" | 32 #include "webrtc/base/checks.h" |
33 | 33 |
34 // TODO(tommi): Could we have a static map of value name -> expected type | 34 // TODO(tommi): Could we have a static map of value name -> expected type |
35 // and use this to DCHECK on correct usage (somewhat strongly typed values)? | 35 // and use this to RTC_DCHECK on correct usage (somewhat strongly typed values)? |
36 // Alternatively, we could define the names+type in a separate document and | 36 // Alternatively, we could define the names+type in a separate document and |
37 // generate strongly typed inline C++ code that forces the correct type to be | 37 // generate strongly typed inline C++ code that forces the correct type to be |
38 // used for a given name at compile time. | 38 // used for a given name at compile time. |
39 | 39 |
40 using rtc::RefCountedObject; | 40 using rtc::RefCountedObject; |
41 | 41 |
42 namespace webrtc { | 42 namespace webrtc { |
43 namespace { | 43 namespace { |
44 | 44 |
45 // The id of StatsReport of type kStatsReportTypeBwe. | 45 // The id of StatsReport of type kStatsReportTypeBwe. |
(...skipping 21 matching lines...) Expand all Loading... |
67 return "transport"; | 67 return "transport"; |
68 case StatsReport::kStatsReportTypeComponent: | 68 case StatsReport::kStatsReportTypeComponent: |
69 return "googComponent"; | 69 return "googComponent"; |
70 case StatsReport::kStatsReportTypeCandidatePair: | 70 case StatsReport::kStatsReportTypeCandidatePair: |
71 return "googCandidatePair"; | 71 return "googCandidatePair"; |
72 case StatsReport::kStatsReportTypeCertificate: | 72 case StatsReport::kStatsReportTypeCertificate: |
73 return "googCertificate"; | 73 return "googCertificate"; |
74 case StatsReport::kStatsReportTypeDataChannel: | 74 case StatsReport::kStatsReportTypeDataChannel: |
75 return "datachannel"; | 75 return "datachannel"; |
76 } | 76 } |
77 DCHECK(false); | 77 RTC_DCHECK(false); |
78 return nullptr; | 78 return nullptr; |
79 } | 79 } |
80 | 80 |
81 class BandwidthEstimationId : public StatsReport::IdBase { | 81 class BandwidthEstimationId : public StatsReport::IdBase { |
82 public: | 82 public: |
83 BandwidthEstimationId() | 83 BandwidthEstimationId() |
84 : StatsReport::IdBase(StatsReport::kStatsReportTypeBwe) {} | 84 : StatsReport::IdBase(StatsReport::kStatsReportTypeBwe) {} |
85 std::string ToString() const override { return kStatsReportVideoBweId; } | 85 std::string ToString() const override { return kStatsReportVideoBweId; } |
86 }; | 86 }; |
87 | 87 |
(...skipping 136 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
224 StatsReport::IdBase::~IdBase() {} | 224 StatsReport::IdBase::~IdBase() {} |
225 | 225 |
226 StatsReport::StatsType StatsReport::IdBase::type() const { return type_; } | 226 StatsReport::StatsType StatsReport::IdBase::type() const { return type_; } |
227 | 227 |
228 bool StatsReport::IdBase::Equals(const IdBase& other) const { | 228 bool StatsReport::IdBase::Equals(const IdBase& other) const { |
229 return other.type_ == type_; | 229 return other.type_ == type_; |
230 } | 230 } |
231 | 231 |
232 StatsReport::Value::Value(StatsValueName name, int64 value, Type int_type) | 232 StatsReport::Value::Value(StatsValueName name, int64 value, Type int_type) |
233 : name(name), type_(int_type) { | 233 : name(name), type_(int_type) { |
234 DCHECK(type_ == kInt || type_ == kInt64); | 234 RTC_DCHECK(type_ == kInt || type_ == kInt64); |
235 type_ == kInt ? value_.int_ = static_cast<int>(value) : value_.int64_ = value; | 235 type_ == kInt ? value_.int_ = static_cast<int>(value) : value_.int64_ = value; |
236 } | 236 } |
237 | 237 |
238 StatsReport::Value::Value(StatsValueName name, float f) | 238 StatsReport::Value::Value(StatsValueName name, float f) |
239 : name(name), type_(kFloat) { | 239 : name(name), type_(kFloat) { |
240 value_.float_ = f; | 240 value_.float_ = f; |
241 } | 241 } |
242 | 242 |
243 StatsReport::Value::Value(StatsValueName name, const std::string& value) | 243 StatsReport::Value::Value(StatsValueName name, const std::string& value) |
244 : name(name), type_(kString) { | 244 : name(name), type_(kString) { |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
276 break; | 276 break; |
277 } | 277 } |
278 } | 278 } |
279 | 279 |
280 bool StatsReport::Value::Equals(const Value& other) const { | 280 bool StatsReport::Value::Equals(const Value& other) const { |
281 if (name != other.name) | 281 if (name != other.name) |
282 return false; | 282 return false; |
283 | 283 |
284 // There's a 1:1 relation between a name and a type, so we don't have to | 284 // There's a 1:1 relation between a name and a type, so we don't have to |
285 // check that. | 285 // check that. |
286 DCHECK_EQ(type_, other.type_); | 286 RTC_DCHECK_EQ(type_, other.type_); |
287 | 287 |
288 switch (type_) { | 288 switch (type_) { |
289 case kInt: | 289 case kInt: |
290 return value_.int_ == other.value_.int_; | 290 return value_.int_ == other.value_.int_; |
291 case kInt64: | 291 case kInt64: |
292 return value_.int64_ == other.value_.int64_; | 292 return value_.int64_ == other.value_.int64_; |
293 case kFloat: | 293 case kFloat: |
294 return value_.float_ == other.value_.float_; | 294 return value_.float_ == other.value_.float_; |
295 case kStaticString: { | 295 case kStaticString: { |
296 #if (!defined(NDEBUG) || defined(DCHECK_ALWAYS_ON)) | 296 #if (!defined(NDEBUG) || defined(DCHECK_ALWAYS_ON)) |
297 if (value_.static_string_ != other.value_.static_string_) { | 297 if (value_.static_string_ != other.value_.static_string_) { |
298 DCHECK(strcmp(value_.static_string_, other.value_.static_string_) != 0) | 298 RTC_DCHECK(strcmp(value_.static_string_, other.value_.static_string_) != |
| 299 0) |
299 << "Duplicate global?"; | 300 << "Duplicate global?"; |
300 } | 301 } |
301 #endif | 302 #endif |
302 return value_.static_string_ == other.value_.static_string_; | 303 return value_.static_string_ == other.value_.static_string_; |
303 } | 304 } |
304 case kString: | 305 case kString: |
305 return *value_.string_ == *other.value_.string_; | 306 return *value_.string_ == *other.value_.string_; |
306 case kBool: | 307 case kBool: |
307 return value_.bool_ == other.value_.bool_; | 308 return value_.bool_ == other.value_.bool_; |
308 case kId: | 309 case kId: |
309 return (*value_.id_)->Equals(*other.value_.id_); | 310 return (*value_.id_)->Equals(*other.value_.id_); |
310 } | 311 } |
311 RTC_NOTREACHED(); | 312 RTC_NOTREACHED(); |
312 return false; | 313 return false; |
313 } | 314 } |
314 | 315 |
315 bool StatsReport::Value::operator==(const std::string& value) const { | 316 bool StatsReport::Value::operator==(const std::string& value) const { |
316 return (type_ == kString && value_.string_->compare(value) == 0) || | 317 return (type_ == kString && value_.string_->compare(value) == 0) || |
317 (type_ == kStaticString && value.compare(value_.static_string_) == 0); | 318 (type_ == kStaticString && value.compare(value_.static_string_) == 0); |
318 } | 319 } |
319 | 320 |
320 bool StatsReport::Value::operator==(const char* value) const { | 321 bool StatsReport::Value::operator==(const char* value) const { |
321 if (type_ == kString) | 322 if (type_ == kString) |
322 return value_.string_->compare(value) == 0; | 323 return value_.string_->compare(value) == 0; |
323 if (type_ != kStaticString) | 324 if (type_ != kStaticString) |
324 return false; | 325 return false; |
325 #if (!defined(NDEBUG) || defined(DCHECK_ALWAYS_ON)) | 326 #if (!defined(NDEBUG) || defined(DCHECK_ALWAYS_ON)) |
326 if (value_.static_string_ != value) | 327 if (value_.static_string_ != value) |
327 DCHECK(strcmp(value_.static_string_, value) != 0) << "Duplicate global?"; | 328 RTC_DCHECK(strcmp(value_.static_string_, value) != 0) |
| 329 << "Duplicate global?"; |
328 #endif | 330 #endif |
329 return value == value_.static_string_; | 331 return value == value_.static_string_; |
330 } | 332 } |
331 | 333 |
332 bool StatsReport::Value::operator==(int64 value) const { | 334 bool StatsReport::Value::operator==(int64 value) const { |
333 return type_ == kInt ? value_.int_ == static_cast<int>(value) : | 335 return type_ == kInt ? value_.int_ == static_cast<int>(value) : |
334 (type_ == kInt64 ? value_.int64_ == value : false); | 336 (type_ == kInt64 ? value_.int64_ == value : false); |
335 } | 337 } |
336 | 338 |
337 bool StatsReport::Value::operator==(bool value) const { | 339 bool StatsReport::Value::operator==(bool value) const { |
338 return type_ == kBool && value_.bool_ == value; | 340 return type_ == kBool && value_.bool_ == value; |
339 } | 341 } |
340 | 342 |
341 bool StatsReport::Value::operator==(float value) const { | 343 bool StatsReport::Value::operator==(float value) const { |
342 return type_ == kFloat && value_.float_ == value; | 344 return type_ == kFloat && value_.float_ == value; |
343 } | 345 } |
344 | 346 |
345 bool StatsReport::Value::operator==(const Id& value) const { | 347 bool StatsReport::Value::operator==(const Id& value) const { |
346 return type_ == kId && (*value_.id_)->Equals(value); | 348 return type_ == kId && (*value_.id_)->Equals(value); |
347 } | 349 } |
348 | 350 |
349 int StatsReport::Value::int_val() const { | 351 int StatsReport::Value::int_val() const { |
350 DCHECK(type_ == kInt); | 352 RTC_DCHECK(type_ == kInt); |
351 return value_.int_; | 353 return value_.int_; |
352 } | 354 } |
353 | 355 |
354 int64 StatsReport::Value::int64_val() const { | 356 int64 StatsReport::Value::int64_val() const { |
355 DCHECK(type_ == kInt64); | 357 RTC_DCHECK(type_ == kInt64); |
356 return value_.int64_; | 358 return value_.int64_; |
357 } | 359 } |
358 | 360 |
359 float StatsReport::Value::float_val() const { | 361 float StatsReport::Value::float_val() const { |
360 DCHECK(type_ == kFloat); | 362 RTC_DCHECK(type_ == kFloat); |
361 return value_.float_; | 363 return value_.float_; |
362 } | 364 } |
363 | 365 |
364 const char* StatsReport::Value::static_string_val() const { | 366 const char* StatsReport::Value::static_string_val() const { |
365 DCHECK(type_ == kStaticString); | 367 RTC_DCHECK(type_ == kStaticString); |
366 return value_.static_string_; | 368 return value_.static_string_; |
367 } | 369 } |
368 | 370 |
369 const std::string& StatsReport::Value::string_val() const { | 371 const std::string& StatsReport::Value::string_val() const { |
370 DCHECK(type_ == kString); | 372 RTC_DCHECK(type_ == kString); |
371 return *value_.string_; | 373 return *value_.string_; |
372 } | 374 } |
373 | 375 |
374 bool StatsReport::Value::bool_val() const { | 376 bool StatsReport::Value::bool_val() const { |
375 DCHECK(type_ == kBool); | 377 RTC_DCHECK(type_ == kBool); |
376 return value_.bool_; | 378 return value_.bool_; |
377 } | 379 } |
378 | 380 |
379 const char* StatsReport::Value::display_name() const { | 381 const char* StatsReport::Value::display_name() const { |
380 switch (name) { | 382 switch (name) { |
381 case kStatsValueNameAudioOutputLevel: | 383 case kStatsValueNameAudioOutputLevel: |
382 return "audioOutputLevel"; | 384 return "audioOutputLevel"; |
383 case kStatsValueNameAudioInputLevel: | 385 case kStatsValueNameAudioInputLevel: |
384 return "audioInputLevel"; | 386 return "audioInputLevel"; |
385 case kStatsValueNameBytesSent: | 387 case kStatsValueNameBytesSent: |
(...skipping 198 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
584 return "googTransportType"; | 586 return "googTransportType"; |
585 case kStatsValueNameTrackId: | 587 case kStatsValueNameTrackId: |
586 return "googTrackId"; | 588 return "googTrackId"; |
587 case kStatsValueNameTypingNoiseState: | 589 case kStatsValueNameTypingNoiseState: |
588 return "googTypingNoiseState"; | 590 return "googTypingNoiseState"; |
589 case kStatsValueNameViewLimitedResolution: | 591 case kStatsValueNameViewLimitedResolution: |
590 return "googViewLimitedResolution"; | 592 return "googViewLimitedResolution"; |
591 case kStatsValueNameWritable: | 593 case kStatsValueNameWritable: |
592 return "googWritable"; | 594 return "googWritable"; |
593 default: | 595 default: |
594 DCHECK(false); | 596 RTC_DCHECK(false); |
595 break; | 597 break; |
596 } | 598 } |
597 | 599 |
598 return nullptr; | 600 return nullptr; |
599 } | 601 } |
600 | 602 |
601 std::string StatsReport::Value::ToString() const { | 603 std::string StatsReport::Value::ToString() const { |
602 switch (type_) { | 604 switch (type_) { |
603 case kInt: | 605 case kInt: |
604 return rtc::ToString(value_.int_); | 606 return rtc::ToString(value_.int_); |
605 case kInt64: | 607 case kInt64: |
606 return rtc::ToString(value_.int64_); | 608 return rtc::ToString(value_.int64_); |
607 case kFloat: | 609 case kFloat: |
608 return rtc::ToString(value_.float_); | 610 return rtc::ToString(value_.float_); |
609 case kStaticString: | 611 case kStaticString: |
610 return std::string(value_.static_string_); | 612 return std::string(value_.static_string_); |
611 case kString: | 613 case kString: |
612 return *value_.string_; | 614 return *value_.string_; |
613 case kBool: | 615 case kBool: |
614 return value_.bool_ ? "true" : "false"; | 616 return value_.bool_ ? "true" : "false"; |
615 case kId: | 617 case kId: |
616 return (*value_.id_)->ToString(); | 618 return (*value_.id_)->ToString(); |
617 } | 619 } |
618 RTC_NOTREACHED(); | 620 RTC_NOTREACHED(); |
619 return std::string(); | 621 return std::string(); |
620 } | 622 } |
621 | 623 |
622 StatsReport::StatsReport(const Id& id) : id_(id), timestamp_(0.0) { | 624 StatsReport::StatsReport(const Id& id) : id_(id), timestamp_(0.0) { |
623 DCHECK(id_.get()); | 625 RTC_DCHECK(id_.get()); |
624 } | 626 } |
625 | 627 |
626 // static | 628 // static |
627 StatsReport::Id StatsReport::NewBandwidthEstimationId() { | 629 StatsReport::Id StatsReport::NewBandwidthEstimationId() { |
628 return Id(new RefCountedObject<BandwidthEstimationId>()); | 630 return Id(new RefCountedObject<BandwidthEstimationId>()); |
629 } | 631 } |
630 | 632 |
631 // static | 633 // static |
632 StatsReport::Id StatsReport::NewTypedId(StatsType type, const std::string& id) { | 634 StatsReport::Id StatsReport::NewTypedId(StatsType type, const std::string& id) { |
633 return Id(new RefCountedObject<TypedId>(type, id)); | 635 return Id(new RefCountedObject<TypedId>(type, id)); |
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
713 | 715 |
714 const StatsReport::Value* StatsReport::FindValue(StatsValueName name) const { | 716 const StatsReport::Value* StatsReport::FindValue(StatsValueName name) const { |
715 Values::const_iterator it = values_.find(name); | 717 Values::const_iterator it = values_.find(name); |
716 return it == values_.end() ? nullptr : it->second.get(); | 718 return it == values_.end() ? nullptr : it->second.get(); |
717 } | 719 } |
718 | 720 |
719 StatsCollection::StatsCollection() { | 721 StatsCollection::StatsCollection() { |
720 } | 722 } |
721 | 723 |
722 StatsCollection::~StatsCollection() { | 724 StatsCollection::~StatsCollection() { |
723 DCHECK(thread_checker_.CalledOnValidThread()); | 725 RTC_DCHECK(thread_checker_.CalledOnValidThread()); |
724 for (auto* r : list_) | 726 for (auto* r : list_) |
725 delete r; | 727 delete r; |
726 } | 728 } |
727 | 729 |
728 StatsCollection::const_iterator StatsCollection::begin() const { | 730 StatsCollection::const_iterator StatsCollection::begin() const { |
729 DCHECK(thread_checker_.CalledOnValidThread()); | 731 RTC_DCHECK(thread_checker_.CalledOnValidThread()); |
730 return list_.begin(); | 732 return list_.begin(); |
731 } | 733 } |
732 | 734 |
733 StatsCollection::const_iterator StatsCollection::end() const { | 735 StatsCollection::const_iterator StatsCollection::end() const { |
734 DCHECK(thread_checker_.CalledOnValidThread()); | 736 RTC_DCHECK(thread_checker_.CalledOnValidThread()); |
735 return list_.end(); | 737 return list_.end(); |
736 } | 738 } |
737 | 739 |
738 size_t StatsCollection::size() const { | 740 size_t StatsCollection::size() const { |
739 DCHECK(thread_checker_.CalledOnValidThread()); | 741 RTC_DCHECK(thread_checker_.CalledOnValidThread()); |
740 return list_.size(); | 742 return list_.size(); |
741 } | 743 } |
742 | 744 |
743 StatsReport* StatsCollection::InsertNew(const StatsReport::Id& id) { | 745 StatsReport* StatsCollection::InsertNew(const StatsReport::Id& id) { |
744 DCHECK(thread_checker_.CalledOnValidThread()); | 746 RTC_DCHECK(thread_checker_.CalledOnValidThread()); |
745 DCHECK(Find(id) == nullptr); | 747 RTC_DCHECK(Find(id) == nullptr); |
746 StatsReport* report = new StatsReport(id); | 748 StatsReport* report = new StatsReport(id); |
747 list_.push_back(report); | 749 list_.push_back(report); |
748 return report; | 750 return report; |
749 } | 751 } |
750 | 752 |
751 StatsReport* StatsCollection::FindOrAddNew(const StatsReport::Id& id) { | 753 StatsReport* StatsCollection::FindOrAddNew(const StatsReport::Id& id) { |
752 DCHECK(thread_checker_.CalledOnValidThread()); | 754 RTC_DCHECK(thread_checker_.CalledOnValidThread()); |
753 StatsReport* ret = Find(id); | 755 StatsReport* ret = Find(id); |
754 return ret ? ret : InsertNew(id); | 756 return ret ? ret : InsertNew(id); |
755 } | 757 } |
756 | 758 |
757 StatsReport* StatsCollection::ReplaceOrAddNew(const StatsReport::Id& id) { | 759 StatsReport* StatsCollection::ReplaceOrAddNew(const StatsReport::Id& id) { |
758 DCHECK(thread_checker_.CalledOnValidThread()); | 760 RTC_DCHECK(thread_checker_.CalledOnValidThread()); |
759 DCHECK(id.get()); | 761 RTC_DCHECK(id.get()); |
760 Container::iterator it = std::find_if(list_.begin(), list_.end(), | 762 Container::iterator it = std::find_if(list_.begin(), list_.end(), |
761 [&id](const StatsReport* r)->bool { return r->id()->Equals(id); }); | 763 [&id](const StatsReport* r)->bool { return r->id()->Equals(id); }); |
762 if (it != end()) { | 764 if (it != end()) { |
763 StatsReport* report = new StatsReport((*it)->id()); | 765 StatsReport* report = new StatsReport((*it)->id()); |
764 delete *it; | 766 delete *it; |
765 *it = report; | 767 *it = report; |
766 return report; | 768 return report; |
767 } | 769 } |
768 return InsertNew(id); | 770 return InsertNew(id); |
769 } | 771 } |
770 | 772 |
771 // Looks for a report with the given |id|. If one is not found, NULL | 773 // Looks for a report with the given |id|. If one is not found, NULL |
772 // will be returned. | 774 // will be returned. |
773 StatsReport* StatsCollection::Find(const StatsReport::Id& id) { | 775 StatsReport* StatsCollection::Find(const StatsReport::Id& id) { |
774 DCHECK(thread_checker_.CalledOnValidThread()); | 776 RTC_DCHECK(thread_checker_.CalledOnValidThread()); |
775 Container::iterator it = std::find_if(list_.begin(), list_.end(), | 777 Container::iterator it = std::find_if(list_.begin(), list_.end(), |
776 [&id](const StatsReport* r)->bool { return r->id()->Equals(id); }); | 778 [&id](const StatsReport* r)->bool { return r->id()->Equals(id); }); |
777 return it == list_.end() ? nullptr : *it; | 779 return it == list_.end() ? nullptr : *it; |
778 } | 780 } |
779 | 781 |
780 } // namespace webrtc | 782 } // namespace webrtc |
OLD | NEW |