| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #ifndef MEDIA_BASE_MEDIA_LOG_H_ | 5 #ifndef MEDIA_BASE_MEDIA_LOG_H_ |
| 6 #define MEDIA_BASE_MEDIA_LOG_H_ | 6 #define MEDIA_BASE_MEDIA_LOG_H_ |
| 7 | 7 |
| 8 #include <sstream> | 8 #include <sstream> |
| 9 #include <string> | 9 #include <string> |
| 10 | 10 |
| (...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 74 friend class base::RefCountedThreadSafe<MediaLog>; | 74 friend class base::RefCountedThreadSafe<MediaLog>; |
| 75 virtual ~MediaLog(); | 75 virtual ~MediaLog(); |
| 76 | 76 |
| 77 private: | 77 private: |
| 78 // A unique (to this process) id for this MediaLog. | 78 // A unique (to this process) id for this MediaLog. |
| 79 int32 id_; | 79 int32 id_; |
| 80 | 80 |
| 81 DISALLOW_COPY_AND_ASSIGN(MediaLog); | 81 DISALLOW_COPY_AND_ASSIGN(MediaLog); |
| 82 }; | 82 }; |
| 83 | 83 |
| 84 // Indicates a string should be added to the log. | 84 // Helper class to make it easier to use MediaLog like DVLOG(). |
| 85 // First parameter - The log level for the string. | |
| 86 // Second parameter - The string to add to the log. | |
| 87 typedef base::Callback<void(MediaLog::MediaLogLevel, const std::string&)> LogCB; | |
| 88 | |
| 89 // Helper class to make it easier to use LogCB or MediaLog like DVLOG(). | |
| 90 class MEDIA_EXPORT LogHelper { | 85 class MEDIA_EXPORT LogHelper { |
| 91 public: | 86 public: |
| 92 LogHelper(MediaLog::MediaLogLevel level, const LogCB& log_cb); | |
| 93 LogHelper(MediaLog::MediaLogLevel level, | 87 LogHelper(MediaLog::MediaLogLevel level, |
| 94 const scoped_refptr<MediaLog>& media_log); | 88 const scoped_refptr<MediaLog>& media_log); |
| 95 ~LogHelper(); | 89 ~LogHelper(); |
| 96 | 90 |
| 97 std::ostream& stream() { return stream_; } | 91 std::ostream& stream() { return stream_; } |
| 98 | 92 |
| 99 private: | 93 private: |
| 100 MediaLog::MediaLogLevel level_; | 94 MediaLog::MediaLogLevel level_; |
| 101 LogCB log_cb_; | |
| 102 const scoped_refptr<MediaLog> media_log_; | 95 const scoped_refptr<MediaLog> media_log_; |
| 103 std::stringstream stream_; | 96 std::stringstream stream_; |
| 104 }; | 97 }; |
| 105 | 98 |
| 106 // Provides a stringstream to collect a log entry to pass to the provided | 99 // Provides a stringstream to collect a log entry to pass to the provided |
| 107 // logger (LogCB or MediaLog) at the requested level. | 100 // MediaLog at the requested level. |
| 108 #define MEDIA_LOG(level, logger) \ | 101 #define MEDIA_LOG(level, media_log) \ |
| 109 LogHelper((MediaLog::MEDIALOG_##level), (logger)).stream() | 102 LogHelper((MediaLog::MEDIALOG_##level), (media_log)).stream() |
| 110 | 103 |
| 111 // Logs only while |count| < |max|, increments |count| for each log, and warns | 104 // Logs only while |count| < |max|, increments |count| for each log, and warns |
| 112 // in the log if |count| has just reached |max|. | 105 // in the log if |count| has just reached |max|. |
| 113 // Multiple short-circuit evaluations are involved in this macro: | 106 // Multiple short-circuit evaluations are involved in this macro: |
| 114 // 1) LAZY_STREAM avoids wasteful MEDIA_LOG and evaluation of subsequent stream | 107 // 1) LAZY_STREAM avoids wasteful MEDIA_LOG and evaluation of subsequent stream |
| 115 // arguments if |count| is >= |max|, and | 108 // arguments if |count| is >= |max|, and |
| 116 // 2) the |condition| given to LAZY_STREAM itself short-circuits to prevent | 109 // 2) the |condition| given to LAZY_STREAM itself short-circuits to prevent |
| 117 // incrementing |count| beyond |max|. | 110 // incrementing |count| beyond |max|. |
| 118 // Note that LAZY_STREAM guarantees exactly one evaluation of |condition|, so | 111 // Note that LAZY_STREAM guarantees exactly one evaluation of |condition|, so |
| 119 // |count| will be incremented at most once each time this macro runs. | 112 // |count| will be incremented at most once each time this macro runs. |
| 120 // The "|| true" portion of |condition| lets logging occur correctly when | 113 // The "|| true" portion of |condition| lets logging occur correctly when |
| 121 // |count| < |max| and |count|++ is 0. | 114 // |count| < |max| and |count|++ is 0. |
| 122 // TODO(wolenetz,chcunningham): Consider using a helper class instead of a macro | 115 // TODO(wolenetz,chcunningham): Consider using a helper class instead of a macro |
| 123 // to improve readability. | 116 // to improve readability. |
| 124 #define LIMITED_MEDIA_LOG(level, logger, count, max) \ | 117 #define LIMITED_MEDIA_LOG(level, media_log, count, max) \ |
| 125 LAZY_STREAM(MEDIA_LOG(level, logger), \ | 118 LAZY_STREAM(MEDIA_LOG(level, media_log), \ |
| 126 (count) < (max) && ((count)++ || true)) \ | 119 (count) < (max) && ((count)++ || true)) \ |
| 127 << (((count) == (max)) ? "(Log limit reached. Further similar entries " \ | 120 << (((count) == (max)) ? "(Log limit reached. Further similar entries " \ |
| 128 "may be suppressed): " \ | 121 "may be suppressed): " \ |
| 129 : "") | 122 : "") |
| 130 | 123 |
| 131 } // namespace media | 124 } // namespace media |
| 132 | 125 |
| 133 #endif // MEDIA_BASE_MEDIA_LOG_H_ | 126 #endif // MEDIA_BASE_MEDIA_LOG_H_ |
| OLD | NEW |