OLD | NEW |
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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 #include "base/tracked_objects.h" | 5 #include "base/tracked_objects.h" |
6 | 6 |
7 #include <math.h> | 7 #include <math.h> |
8 | 8 |
9 #include "base/format_macros.h" | 9 #include "base/format_macros.h" |
10 #include "base/message_loop.h" | 10 #include "base/message_loop.h" |
(...skipping 524 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
535 } | 535 } |
536 | 536 |
537 // static | 537 // static |
538 TrackedTime ThreadData::Now() { | 538 TrackedTime ThreadData::Now() { |
539 if (kTrackAllTaskObjects && tracking_status()) | 539 if (kTrackAllTaskObjects && tracking_status()) |
540 return TrackedTime::Now(); | 540 return TrackedTime::Now(); |
541 return TrackedTime(); // Super fast when disabled, or not compiled. | 541 return TrackedTime(); // Super fast when disabled, or not compiled. |
542 } | 542 } |
543 | 543 |
544 // static | 544 // static |
545 void ThreadData::ShutdownSingleThreadedCleanup() { | 545 void ThreadData::ShutdownSingleThreadedCleanup(bool leak) { |
546 // This is only called from test code, where we need to cleanup so that | 546 // This is only called from test code, where we need to cleanup so that |
547 // additional tests can be run. | 547 // additional tests can be run. |
548 // We must be single threaded... but be careful anyway. | 548 // We must be single threaded... but be careful anyway. |
549 if (!InitializeAndSetTrackingStatus(false)) | 549 if (!InitializeAndSetTrackingStatus(false)) |
550 return; | 550 return; |
551 ThreadData* thread_data_list; | 551 ThreadData* thread_data_list; |
552 ThreadDataPool* final_pool; | 552 ThreadDataPool* final_pool; |
553 { | 553 { |
554 base::AutoLock lock(*list_lock_); | 554 base::AutoLock lock(*list_lock_); |
555 thread_data_list = all_thread_data_list_head_; | 555 thread_data_list = all_thread_data_list_head_; |
556 all_thread_data_list_head_ = NULL; | 556 all_thread_data_list_head_ = NULL; |
557 final_pool = unregistered_thread_data_pool_; | 557 final_pool = unregistered_thread_data_pool_; |
558 unregistered_thread_data_pool_ = NULL; | 558 unregistered_thread_data_pool_ = NULL; |
559 } | 559 } |
560 | 560 |
561 // Put most global static back in pristine shape. | 561 // Put most global static back in pristine shape. |
562 thread_number_counter_ = 0; | 562 thread_number_counter_ = 0; |
563 tls_index_.Set(NULL); | 563 tls_index_.Set(NULL); |
564 status_ = UNINITIALIZED; | 564 status_ = UNINITIALIZED; |
565 | 565 |
566 // To avoid any chance of racing in unit tests, which is the only place we | 566 // To avoid any chance of racing in unit tests, which is the only place we |
567 // call this function, we will leak all the data structures we recovered. | 567 // call this function, we may sometimes leak all the data structures we |
568 // These structures could plausibly be used by other threads in earlier tests | 568 // recovered, as they may still be in use on threads from prior tests! |
569 // that are still running. | 569 if (leak) |
570 return; | 570 return; |
571 | 571 |
572 // If we wanted to cleanup (on a single thread), here is what we would do. | 572 // When we want to cleanup (on a single thread), here is what we do. |
573 | 573 |
574 if (final_pool) { | 574 if (final_pool) { |
575 // The thread_data_list contains *all* the instances, and we'll use it to | 575 // The thread_data_list contains *all* the instances, and we'll use it to |
576 // delete them. This pool has pointers to some instances, and we just | 576 // delete them. This pool has pointers to some instances, and we just |
577 // have to drop those pointers (and not do the deletes here). | 577 // have to drop those pointers (and not do the deletes here). |
578 while (!final_pool->empty()) | 578 while (!final_pool->empty()) |
579 final_pool->pop(); | 579 final_pool->pop(); |
580 delete final_pool; | 580 delete final_pool; |
581 } | 581 } |
582 | 582 |
(...skipping 552 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1135 (combined_selectors_ & BIRTH_THREAD) ? "*" : | 1135 (combined_selectors_ & BIRTH_THREAD) ? "*" : |
1136 sample.birth().birth_thread()->thread_name().c_str(), | 1136 sample.birth().birth_thread()->thread_name().c_str(), |
1137 (combined_selectors_ & DEATH_THREAD) ? "*" : | 1137 (combined_selectors_ & DEATH_THREAD) ? "*" : |
1138 sample.DeathThreadName().c_str()); | 1138 sample.DeathThreadName().c_str()); |
1139 sample.birth().location().Write(!(combined_selectors_ & BIRTH_FILE), | 1139 sample.birth().location().Write(!(combined_selectors_ & BIRTH_FILE), |
1140 !(combined_selectors_ & BIRTH_FUNCTION), | 1140 !(combined_selectors_ & BIRTH_FUNCTION), |
1141 output); | 1141 output); |
1142 } | 1142 } |
1143 | 1143 |
1144 } // namespace tracked_objects | 1144 } // namespace tracked_objects |
OLD | NEW |