| 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 BASE_TRACKED_OBJECTS_H_ | 5 #ifndef BASE_TRACKED_OBJECTS_H_ |
| 6 #define BASE_TRACKED_OBJECTS_H_ | 6 #define BASE_TRACKED_OBJECTS_H_ |
| 7 | 7 |
| 8 #include <map> | 8 #include <map> |
| 9 #include <set> | 9 #include <set> |
| 10 #include <stack> | 10 #include <stack> |
| (...skipping 222 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 233 | 233 |
| 234 class BASE_EXPORT Births: public BirthOnThread { | 234 class BASE_EXPORT Births: public BirthOnThread { |
| 235 public: | 235 public: |
| 236 Births(const Location& location, const ThreadData& current); | 236 Births(const Location& location, const ThreadData& current); |
| 237 | 237 |
| 238 int birth_count() const; | 238 int birth_count() const; |
| 239 | 239 |
| 240 // When we have a birth we update the count for this birthplace. | 240 // When we have a birth we update the count for this birthplace. |
| 241 void RecordBirth(); | 241 void RecordBirth(); |
| 242 | 242 |
| 243 // When a birthplace is changed (updated), we need to decrement the counter | |
| 244 // for the old instance. | |
| 245 void ForgetBirth(); | |
| 246 | |
| 247 // Hack to quickly reset all counts to zero. | |
| 248 void Clear(); | |
| 249 | |
| 250 private: | 243 private: |
| 251 // The number of births on this thread for our location_. | 244 // The number of births on this thread for our location_. |
| 252 int birth_count_; | 245 int birth_count_; |
| 253 | 246 |
| 254 DISALLOW_COPY_AND_ASSIGN(Births); | 247 DISALLOW_COPY_AND_ASSIGN(Births); |
| 255 }; | 248 }; |
| 256 | 249 |
| 257 //------------------------------------------------------------------------------ | 250 //------------------------------------------------------------------------------ |
| 258 // Basic info summarizing multiple destructions of a tracked object with a | 251 // Basic info summarizing multiple destructions of a tracked object with a |
| 259 // single birthplace (fixed Location). Used both on specific threads, and also | 252 // single birthplace (fixed Location). Used both on specific threads, and also |
| (...skipping 17 matching lines...) Expand all Loading... |
| 277 | 270 |
| 278 // Metrics accessors, used only for serialization and in tests. | 271 // Metrics accessors, used only for serialization and in tests. |
| 279 int count() const; | 272 int count() const; |
| 280 int32 run_duration_sum() const; | 273 int32 run_duration_sum() const; |
| 281 int32 run_duration_max() const; | 274 int32 run_duration_max() const; |
| 282 int32 run_duration_sample() const; | 275 int32 run_duration_sample() const; |
| 283 int32 queue_duration_sum() const; | 276 int32 queue_duration_sum() const; |
| 284 int32 queue_duration_max() const; | 277 int32 queue_duration_max() const; |
| 285 int32 queue_duration_sample() const; | 278 int32 queue_duration_sample() const; |
| 286 | 279 |
| 287 // Reset the max values to zero. | |
| 288 void ResetMax(); | |
| 289 | |
| 290 // Reset all tallies to zero. This is used as a hack on realtime data. | 280 // Reset all tallies to zero. This is used as a hack on realtime data. |
| 291 void Clear(); | 281 void Clear(); |
| 292 | 282 |
| 293 private: | 283 private: |
| 294 // Members are ordered from most regularly read and updated, to least | 284 // Members are ordered from most regularly read and updated, to least |
| 295 // frequently used. This might help a bit with cache lines. | 285 // frequently used. This might help a bit with cache lines. |
| 296 // Number of runs seen (divisor for calculating averages). | 286 // Number of runs seen (divisor for calculating averages). |
| 297 int count_; | 287 int count_; |
| 298 // Basic tallies, used to compute averages. | 288 // Basic tallies, used to compute averages. |
| 299 int32 run_duration_sum_; | 289 int32 run_duration_sum_; |
| (...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 379 // only used by the message loop, which has a well defined thread name. | 369 // only used by the message loop, which has a well defined thread name. |
| 380 static void InitializeThreadContext(const std::string& suggested_name); | 370 static void InitializeThreadContext(const std::string& suggested_name); |
| 381 | 371 |
| 382 // Using Thread Local Store, find the current instance for collecting data. | 372 // Using Thread Local Store, find the current instance for collecting data. |
| 383 // If an instance does not exist, construct one (and remember it for use on | 373 // If an instance does not exist, construct one (and remember it for use on |
| 384 // this thread. | 374 // this thread. |
| 385 // This may return NULL if the system is disabled for any reason. | 375 // This may return NULL if the system is disabled for any reason. |
| 386 static ThreadData* Get(); | 376 static ThreadData* Get(); |
| 387 | 377 |
| 388 // Fills |process_data| with all the recursive results in our process. | 378 // Fills |process_data| with all the recursive results in our process. |
| 389 // During the scavenging, if |reset_max| is true, then the DeathData instances | 379 static void Snapshot(ProcessDataSnapshot* process_data); |
| 390 // max-values are reset to zero during this scan. | |
| 391 static void Snapshot(bool reset_max, ProcessDataSnapshot* process_data); | |
| 392 | 380 |
| 393 // Finds (or creates) a place to count births from the given location in this | 381 // Finds (or creates) a place to count births from the given location in this |
| 394 // thread, and increment that tally. | 382 // thread, and increment that tally. |
| 395 // TallyABirthIfActive will returns NULL if the birth cannot be tallied. | 383 // TallyABirthIfActive will returns NULL if the birth cannot be tallied. |
| 396 static Births* TallyABirthIfActive(const Location& location); | 384 static Births* TallyABirthIfActive(const Location& location); |
| 397 | 385 |
| 398 // Records the end of a timed run of an object. The |completed_task| contains | 386 // Records the end of a timed run of an object. The |completed_task| contains |
| 399 // a pointer to a Births, the time_posted, and a delayed_start_time if any. | 387 // a pointer to a Births, the time_posted, and a delayed_start_time if any. |
| 400 // The |start_of_run| indicates when we started to perform the run of the | 388 // The |start_of_run| indicates when we started to perform the run of the |
| 401 // task. The delayed_start_time is non-null for tasks that were posted as | 389 // task. The delayed_start_time is non-null for tasks that were posted as |
| (...skipping 18 matching lines...) Expand all Loading... |
| 420 const TaskStopwatch& stopwatch); | 408 const TaskStopwatch& stopwatch); |
| 421 | 409 |
| 422 // Record the end of execution in region, generally corresponding to a scope | 410 // Record the end of execution in region, generally corresponding to a scope |
| 423 // being exited. | 411 // being exited. |
| 424 static void TallyRunInAScopedRegionIfTracking( | 412 static void TallyRunInAScopedRegionIfTracking( |
| 425 const Births* birth, | 413 const Births* birth, |
| 426 const TaskStopwatch& stopwatch); | 414 const TaskStopwatch& stopwatch); |
| 427 | 415 |
| 428 const std::string& thread_name() const { return thread_name_; } | 416 const std::string& thread_name() const { return thread_name_; } |
| 429 | 417 |
| 430 // Hack: asynchronously clear all birth counts and death tallies data values | |
| 431 // in all ThreadData instances. The numerical (zeroing) part is done without | |
| 432 // use of a locks or atomics exchanges, and may (for int64 values) produce | |
| 433 // bogus counts VERY rarely. | |
| 434 static void ResetAllThreadData(); | |
| 435 | |
| 436 // Initializes all statics if needed (this initialization call should be made | 418 // Initializes all statics if needed (this initialization call should be made |
| 437 // while we are single threaded). Returns false if unable to initialize. | 419 // while we are single threaded). Returns false if unable to initialize. |
| 438 static bool Initialize(); | 420 static bool Initialize(); |
| 439 | 421 |
| 440 // Sets internal status_. | 422 // Sets internal status_. |
| 441 // If |status| is false, then status_ is set to DEACTIVATED. | 423 // If |status| is false, then status_ is set to DEACTIVATED. |
| 442 // If |status| is true, then status_ is set to, PROFILING_ACTIVE, or | 424 // If |status| is true, then status_ is set to, PROFILING_ACTIVE, or |
| 443 // PROFILING_CHILDREN_ACTIVE. | 425 // PROFILING_CHILDREN_ACTIVE. |
| 444 // If tracking is not compiled in, this function will return false. | 426 // If tracking is not compiled in, this function will return false. |
| 445 // If parent-child tracking is not compiled in, then an attempt to set the | 427 // If parent-child tracking is not compiled in, then an attempt to set the |
| (...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 523 // In this thread's data, record a new birth. | 505 // In this thread's data, record a new birth. |
| 524 Births* TallyABirth(const Location& location); | 506 Births* TallyABirth(const Location& location); |
| 525 | 507 |
| 526 // Find a place to record a death on this thread. | 508 // Find a place to record a death on this thread. |
| 527 void TallyADeath(const Births& birth, | 509 void TallyADeath(const Births& birth, |
| 528 int32 queue_duration, | 510 int32 queue_duration, |
| 529 const TaskStopwatch& stopwatch); | 511 const TaskStopwatch& stopwatch); |
| 530 | 512 |
| 531 // Snapshot (under a lock) the profiled data for the tasks in each ThreadData | 513 // Snapshot (under a lock) the profiled data for the tasks in each ThreadData |
| 532 // instance. Also updates the |birth_counts| tally for each task to keep | 514 // instance. Also updates the |birth_counts| tally for each task to keep |
| 533 // track of the number of living instances of the task. If |reset_max| is | 515 // track of the number of living instances of the task. |
| 534 // true, then the max values in each DeathData instance are reset during the | 516 static void SnapshotAllExecutedTasks(ProcessDataSnapshot* process_data, |
| 535 // scan. | |
| 536 static void SnapshotAllExecutedTasks(bool reset_max, | |
| 537 ProcessDataSnapshot* process_data, | |
| 538 BirthCountMap* birth_counts); | 517 BirthCountMap* birth_counts); |
| 539 | 518 |
| 540 // Snapshots (under a lock) the profiled data for the tasks for this thread | 519 // Snapshots (under a lock) the profiled data for the tasks for this thread |
| 541 // and writes all of the executed tasks' data -- i.e. the data for the tasks | 520 // and writes all of the executed tasks' data -- i.e. the data for the tasks |
| 542 // with with entries in the death_map_ -- into |process_data|. Also updates | 521 // with with entries in the death_map_ -- into |process_data|. Also updates |
| 543 // the |birth_counts| tally for each task to keep track of the number of | 522 // the |birth_counts| tally for each task to keep track of the number of |
| 544 // living instances of the task -- that is, each task maps to the number of | 523 // living instances of the task -- that is, each task maps to the number of |
| 545 // births for the task that have not yet been balanced by a death. If | 524 // births for the task that have not yet been balanced by a death. |
| 546 // |reset_max| is true, then the max values in each DeathData instance are | 525 void SnapshotExecutedTasks(ProcessDataSnapshot* process_data, |
| 547 // reset during the scan. | |
| 548 void SnapshotExecutedTasks(bool reset_max, | |
| 549 ProcessDataSnapshot* process_data, | |
| 550 BirthCountMap* birth_counts); | 526 BirthCountMap* birth_counts); |
| 551 | 527 |
| 552 // Using our lock, make a copy of the specified maps. This call may be made | 528 // Using our lock, make a copy of the specified maps. This call may be made |
| 553 // on non-local threads, which necessitate the use of the lock to prevent | 529 // on non-local threads, which necessitate the use of the lock to prevent |
| 554 // the map(s) from being reallocated while they are copied. If |reset_max| is | 530 // the map(s) from being reallocated while they are copied. |
| 555 // true, then, just after we copy the DeathMap, we will set the max values to | 531 void SnapshotMaps(BirthMap* birth_map, |
| 556 // zero in the active DeathMap (not the snapshot). | |
| 557 void SnapshotMaps(bool reset_max, | |
| 558 BirthMap* birth_map, | |
| 559 DeathMap* death_map, | 532 DeathMap* death_map, |
| 560 ParentChildSet* parent_child_set); | 533 ParentChildSet* parent_child_set); |
| 561 | 534 |
| 562 // Using our lock to protect the iteration, Clear all birth and death data. | |
| 563 void Reset(); | |
| 564 | |
| 565 // This method is called by the TLS system when a thread terminates. | 535 // This method is called by the TLS system when a thread terminates. |
| 566 // The argument may be NULL if this thread has never tracked a birth or death. | 536 // The argument may be NULL if this thread has never tracked a birth or death. |
| 567 static void OnThreadTermination(void* thread_data); | 537 static void OnThreadTermination(void* thread_data); |
| 568 | 538 |
| 569 // This method should be called when a worker thread terminates, so that we | 539 // This method should be called when a worker thread terminates, so that we |
| 570 // can save all the thread data into a cache of reusable ThreadData instances. | 540 // can save all the thread data into a cache of reusable ThreadData instances. |
| 571 void OnThreadTerminationCleanup(); | 541 void OnThreadTerminationCleanup(); |
| 572 | 542 |
| 573 // Cleans up data structures, and returns statics to near pristine (mostly | 543 // Cleans up data structures, and returns statics to near pristine (mostly |
| 574 // uninitialized) state. If there is any chance that other threads are still | 544 // uninitialized) state. If there is any chance that other threads are still |
| (...skipping 209 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 784 ~ProcessDataSnapshot(); | 754 ~ProcessDataSnapshot(); |
| 785 | 755 |
| 786 std::vector<TaskSnapshot> tasks; | 756 std::vector<TaskSnapshot> tasks; |
| 787 std::vector<ParentChildPairSnapshot> descendants; | 757 std::vector<ParentChildPairSnapshot> descendants; |
| 788 int process_id; | 758 int process_id; |
| 789 }; | 759 }; |
| 790 | 760 |
| 791 } // namespace tracked_objects | 761 } // namespace tracked_objects |
| 792 | 762 |
| 793 #endif // BASE_TRACKED_OBJECTS_H_ | 763 #endif // BASE_TRACKED_OBJECTS_H_ |
| OLD | NEW |