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

Side by Side Diff: base/debug/trace_event.h

Issue 18587004: Add a sampling tracing to RenderWidget::DoDeferredUpdate (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 7 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 | Annotate | Revision Log
« no previous file with comments | « no previous file | base/debug/trace_event_impl.cc » ('j') | content/renderer/render_widget.cc » ('J')
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 // This header file defines the set of trace_event macros without specifying 5 // This header file defines the set of trace_event macros without specifying
6 // how the events actually get collected and stored. If you need to expose trace 6 // how the events actually get collected and stored. If you need to expose trace
7 // events to some other universe, you can copy-and-paste this file as well as 7 // events to some other universe, you can copy-and-paste this file as well as
8 // trace_event.h, modifying the macros contained there as necessary for the 8 // trace_event.h, modifying the macros contained there as necessary for the
9 // target platform. The end result is that multiple libraries can funnel events 9 // target platform. The end result is that multiple libraries can funnel events
10 // through to a shared trace event collector. 10 // through to a shared trace event collector.
(...skipping 281 matching lines...) Expand 10 before | Expand all | Expand 10 after
292 INTERNAL_TRACE_EVENT_ADD(TRACE_EVENT_PHASE_INSTANT, \ 292 INTERNAL_TRACE_EVENT_ADD(TRACE_EVENT_PHASE_INSTANT, \
293 category_group, name, TRACE_EVENT_FLAG_COPY | scope, \ 293 category_group, name, TRACE_EVENT_FLAG_COPY | scope, \
294 arg1_name, arg1_val, arg2_name, arg2_val) 294 arg1_name, arg1_val, arg2_name, arg2_val)
295 295
296 // Sets the current sample state to the given category and name (both must be 296 // Sets the current sample state to the given category and name (both must be
297 // constant strings). These states are intended for a sampling profiler. 297 // constant strings). These states are intended for a sampling profiler.
298 // Implementation note: we store category and name together because we don't 298 // Implementation note: we store category and name together because we don't
299 // want the inconsistency/expense of storing two pointers. 299 // want the inconsistency/expense of storing two pointers.
300 // |thread_bucket| is [0..2] and is used to statically isolate samples in one 300 // |thread_bucket| is [0..2] and is used to statically isolate samples in one
301 // thread from others. 301 // thread from others.
302 #define TRACE_EVENT_SAMPLE_STATE(thread_bucket, category, name) \ 302 #define TRACE_EVENT_SET_SAMPLING_STATE_FOR_BUCKET( \
303 TRACE_EVENT_API_ATOMIC_STORE( \ 303 bucket_number, category, name) \
304 TRACE_EVENT_API_THREAD_BUCKET(thread_bucket), \ 304 TRACE_EVENT_API_ATOMIC_STORE( \
305 reinterpret_cast<TRACE_EVENT_API_ATOMIC_WORD>(category "\0" name)); 305 TRACE_EVENT_API_THREAD_BUCKET(bucket_number), \
306 reinterpret_cast<TRACE_EVENT_API_ATOMIC_WORD>(category "\0" name));
307
308 // Creates a scope of a sampling state of the given bucket.
309 //
310 // { // The sampling state is set within this scope.
311 // TRACE_EVENT_SAMPLING_STATE_SCOPE_FOR_BUCKET(0, "category", "name");
nduca 2013/07/03 09:54:34 bikeshed: how about TRACE_EVENT_SCOPED_SET_SAMPLIN
haraken 2013/07/04 02:03:16 Done.
312 // ...;
313 // }
314 #define TRACE_EVENT_SAMPLING_STATE_SCOPE_FOR_BUCKET( \
315 bucket_number, category, name) \
316 trace_event_internal::TraceEventSamplingStateScope<bucket_number> \
317 traceEventSamplingScope(category "\0" name);
318
319 // Returns a current sampling state of the current scope of the given bucket.
320 #define TRACE_EVENT_SAMPLING_STATE_SCOPE_CURRENT_FOR_BUCKET(bucket_number) \
321 trace_event_internal::TraceEventSamplingStateScope<bucket_number>::Current()
322
323 // Updates a sampling state of the current scope of the given bucket.
324 // You should use this macro only when the overhead of
325 // TRACE_EVENT_SAMPLING_STATE_SCOPE_FOR_BUCKET is not acceptable.
326 #define TRACE_EVENT_SAMPLING_STATE_SCOPE_SET_CURRENT_FOR_BUCKET( \
327 bucket_number, category, name) \
328 trace_event_internal:: \
329 TraceEventSamplingStateScope<bucket_number>::Set(category "\0" name)
330
331 // Syntactic sugars for the sampling tracing in the main thread.
332 #define TRACE_EVENT_SAMPLING_STATE_SCOPE(category, name) \
333 TRACE_EVENT_SAMPLING_STATE_SCOPE_FOR_BUCKET(0, category, name)
334 #define TRACE_EVENT_SAMPLING_STATE_SCOPE_CURRENT() \
335 TRACE_EVENT_SAMPLING_STATE_SCOPE_CURRENT_FOR_BUCKET(0)
336 #define TRACE_EVENT_SAMPLING_STATE_SCOPE_SET_CURRENT(category, name) \
337 TRACE_EVENT_SAMPLING_STATE_SCOPE_SET_CURRENT_FOR_BUCKET(0, category, name)
338
306 339
307 // Records a single BEGIN event called "name" immediately, with 0, 1 or 2 340 // Records a single BEGIN event called "name" immediately, with 0, 1 or 2
308 // associated arguments. If the category is not enabled, then this 341 // associated arguments. If the category is not enabled, then this
309 // does nothing. 342 // does nothing.
310 // - category and name strings must have application lifetime (statics or 343 // - category and name strings must have application lifetime (statics or
311 // literals). They may not include " chars. 344 // literals). They may not include " chars.
312 #define TRACE_EVENT_BEGIN0(category_group, name) \ 345 #define TRACE_EVENT_BEGIN0(category_group, name) \
313 INTERNAL_TRACE_EVENT_ADD(TRACE_EVENT_PHASE_BEGIN, \ 346 INTERNAL_TRACE_EVENT_ADD(TRACE_EVENT_PHASE_BEGIN, \
314 category_group, name, TRACE_EVENT_FLAG_NONE) 347 category_group, name, TRACE_EVENT_FLAG_NONE)
315 #define TRACE_EVENT_BEGIN1(category_group, name, arg1_name, arg1_val) \ 348 #define TRACE_EVENT_BEGIN1(category_group, name, arg1_name, arg1_val) \
(...skipping 432 matching lines...) Expand 10 before | Expand all | Expand 10 after
748 781
749 // Defines atomic operations used internally by the tracing system. 782 // Defines atomic operations used internally by the tracing system.
750 #define TRACE_EVENT_API_ATOMIC_WORD base::subtle::AtomicWord 783 #define TRACE_EVENT_API_ATOMIC_WORD base::subtle::AtomicWord
751 #define TRACE_EVENT_API_ATOMIC_LOAD(var) base::subtle::NoBarrier_Load(&(var)) 784 #define TRACE_EVENT_API_ATOMIC_LOAD(var) base::subtle::NoBarrier_Load(&(var))
752 #define TRACE_EVENT_API_ATOMIC_STORE(var, value) \ 785 #define TRACE_EVENT_API_ATOMIC_STORE(var, value) \
753 base::subtle::NoBarrier_Store(&(var), (value)) 786 base::subtle::NoBarrier_Store(&(var), (value))
754 787
755 // Defines visibility for classes in trace_event.h 788 // Defines visibility for classes in trace_event.h
756 #define TRACE_EVENT_API_CLASS_EXPORT BASE_EXPORT 789 #define TRACE_EVENT_API_CLASS_EXPORT BASE_EXPORT
757 790
758 // Not supported in split-dll build. http://crbug.com/237249 791 // Not supported in split-dll build. http://crbug.com/256965
759 #if !defined(CHROME_SPLIT_DLL) 792 #if !defined(CHROME_SPLIT_DLL)
760 // The thread buckets for the sampling profiler. 793 // The thread buckets for the sampling profiler.
761 TRACE_EVENT_API_CLASS_EXPORT extern TRACE_EVENT_API_ATOMIC_WORD g_trace_state0; 794 TRACE_EVENT_API_CLASS_EXPORT extern \
762 TRACE_EVENT_API_CLASS_EXPORT extern TRACE_EVENT_API_ATOMIC_WORD g_trace_state1; 795 TRACE_EVENT_API_ATOMIC_WORD g_trace_state[3];
763 TRACE_EVENT_API_CLASS_EXPORT extern TRACE_EVENT_API_ATOMIC_WORD g_trace_state2; 796
764 #define TRACE_EVENT_API_THREAD_BUCKET(thread_bucket) \ 797 #define TRACE_EVENT_API_THREAD_BUCKET(thread_bucket) \
765 g_trace_state##thread_bucket 798 g_trace_state[thread_bucket]
799
766 #endif 800 #endif
767 801
768 //////////////////////////////////////////////////////////////////////////////// 802 ////////////////////////////////////////////////////////////////////////////////
769 803
770 // Implementation detail: trace event macros create temporary variables 804 // Implementation detail: trace event macros create temporary variables
771 // to keep instrumentation overhead low. These macros give each temporary 805 // to keep instrumentation overhead low. These macros give each temporary
772 // variable a unique name based on the line number to prevent name collissions. 806 // variable a unique name based on the line number to prevent name collissions.
773 #define INTERNAL_TRACE_EVENT_UID3(a,b) \ 807 #define INTERNAL_TRACE_EVENT_UID3(a,b) \
774 trace_event_unique_##a##b 808 trace_event_unique_##a##b
775 #define INTERNAL_TRACE_EVENT_UID2(a,b) \ 809 #define INTERNAL_TRACE_EVENT_UID2(a,b) \
(...skipping 656 matching lines...) Expand 10 before | Expand all | Expand 10 after
1432 INTERNAL_TRACE_EVENT_UID(profileScope)( \ 1466 INTERNAL_TRACE_EVENT_UID(profileScope)( \
1433 &INTERNAL_TRACE_EVENT_UID(atomic), name); \ 1467 &INTERNAL_TRACE_EVENT_UID(atomic), name); \
1434 1468
1435 // This macro generates less code then TRACE_EVENT0 but is also 1469 // This macro generates less code then TRACE_EVENT0 but is also
1436 // slower to execute when tracing is off. It should generally only be 1470 // slower to execute when tracing is off. It should generally only be
1437 // used with code that is seldom executed or conditionally executed 1471 // used with code that is seldom executed or conditionally executed
1438 // when debugging. 1472 // when debugging.
1439 #define TRACE_EVENT_BINARY_EFFICIENT0(category_group, name) \ 1473 #define TRACE_EVENT_BINARY_EFFICIENT0(category_group, name) \
1440 INTERNAL_TRACE_EVENT_BINARY_EFFICIENT_ADD_SCOPED(category_group, name) 1474 INTERNAL_TRACE_EVENT_BINARY_EFFICIENT_ADD_SCOPED(category_group, name)
1441 1475
1476 // TraceEventSamplingStateScope records the current sampling state
1477 // and sets a new sampling state. When the scope exists, it restores
1478 // the sampling state having recorded.
1479 template<size_t BucketNumber>
1480 class TraceEventSamplingStateScope {
1481 public:
1482 TraceEventSamplingStateScope(const char* category_and_name) {
1483 previous_state_ = TraceEventSamplingStateScope<BucketNumber>::Current();
1484 TraceEventSamplingStateScope<BucketNumber>::Set(category_and_name);
1485 }
1486
1487 ~TraceEventSamplingStateScope() {
1488 TraceEventSamplingStateScope<BucketNumber>::Set(previous_state_);
1489 }
1490
1491 static inline const char* Current() {
1492 return reinterpret_cast<const char*>(TRACE_EVENT_API_ATOMIC_LOAD(
1493 g_trace_state[BucketNumber]));
1494 }
1495
1496 static inline void Set(const char* category_and_name) {
1497 TRACE_EVENT_API_ATOMIC_STORE(
1498 g_trace_state[BucketNumber],
1499 reinterpret_cast<TRACE_EVENT_API_ATOMIC_WORD>(
1500 const_cast<char*>(category_and_name)));
1501 }
1502
1503 private:
1504 const char* previous_state_;
1505 };
1506
1442 } // namespace trace_event_internal 1507 } // namespace trace_event_internal
1443 1508
1444 namespace base { 1509 namespace base {
1445 namespace debug { 1510 namespace debug {
1446 1511
1447 template<typename IDType> class TraceScopedTrackableObject { 1512 template<typename IDType> class TraceScopedTrackableObject {
1448 public: 1513 public:
1449 TraceScopedTrackableObject(const char* category_group, const char* name, 1514 TraceScopedTrackableObject(const char* category_group, const char* name,
1450 IDType id) 1515 IDType id)
1451 : category_group_(category_group), 1516 : category_group_(category_group),
(...skipping 15 matching lines...) Expand all
1467 const char* name_; 1532 const char* name_;
1468 IDType id_; 1533 IDType id_;
1469 1534
1470 DISALLOW_COPY_AND_ASSIGN(TraceScopedTrackableObject); 1535 DISALLOW_COPY_AND_ASSIGN(TraceScopedTrackableObject);
1471 }; 1536 };
1472 1537
1473 } // namespace debug 1538 } // namespace debug
1474 } // namespace base 1539 } // namespace base
1475 1540
1476 #endif /* BASE_DEBUG_TRACE_EVENT_H_ */ 1541 #endif /* BASE_DEBUG_TRACE_EVENT_H_ */
OLDNEW
« no previous file with comments | « no previous file | base/debug/trace_event_impl.cc » ('j') | content/renderer/render_widget.cc » ('J')

Powered by Google App Engine
This is Rietveld 408576698