| 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/threading/thread.h" | 5 #include "base/threading/thread.h" | 
| 6 | 6 | 
| 7 #include <vector> | 7 #include <vector> | 
| 8 | 8 | 
| 9 #include "base/bind.h" | 9 #include "base/bind.h" | 
| 10 #include "base/message_loop.h" | 10 #include "base/message_loop.h" | 
| (...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 98   virtual void WillDestroyCurrentMessageLoop() { | 98   virtual void WillDestroyCurrentMessageLoop() { | 
| 99     event_list_->push_back(THREAD_EVENT_MESSAGE_LOOP_DESTROYED); | 99     event_list_->push_back(THREAD_EVENT_MESSAGE_LOOP_DESTROYED); | 
| 100     event_list_ = NULL; | 100     event_list_ = NULL; | 
| 101   } | 101   } | 
| 102 | 102 | 
| 103  private: | 103  private: | 
| 104   EventList* event_list_; | 104   EventList* event_list_; | 
| 105 }; | 105 }; | 
| 106 | 106 | 
| 107 // Task that adds a destruction observer to the current message loop. | 107 // Task that adds a destruction observer to the current message loop. | 
| 108 class RegisterDestructionObserver : public Task { | 108 void RegisterDestructionObserver(MessageLoop::DestructionObserver* observer) { | 
| 109  public: | 109   MessageLoop::current()->AddDestructionObserver(observer); | 
| 110   explicit RegisterDestructionObserver( | 110 } | 
| 111       MessageLoop::DestructionObserver* observer) |  | 
| 112       : observer_(observer) { |  | 
| 113   } |  | 
| 114 |  | 
| 115   virtual void Run() { |  | 
| 116     MessageLoop::current()->AddDestructionObserver(observer_); |  | 
| 117     observer_ = NULL; |  | 
| 118   } |  | 
| 119 |  | 
| 120  private: |  | 
| 121   MessageLoop::DestructionObserver* observer_; |  | 
| 122 }; |  | 
| 123 | 111 | 
| 124 }  // namespace | 112 }  // namespace | 
| 125 | 113 | 
| 126 TEST_F(ThreadTest, Restart) { | 114 TEST_F(ThreadTest, Restart) { | 
| 127   Thread a("Restart"); | 115   Thread a("Restart"); | 
| 128   a.Stop(); | 116   a.Stop(); | 
| 129   EXPECT_FALSE(a.message_loop()); | 117   EXPECT_FALSE(a.message_loop()); | 
| 130   EXPECT_FALSE(a.IsRunning()); | 118   EXPECT_FALSE(a.IsRunning()); | 
| 131   EXPECT_TRUE(a.Start()); | 119   EXPECT_TRUE(a.Start()); | 
| 132   EXPECT_TRUE(a.message_loop()); | 120   EXPECT_TRUE(a.message_loop()); | 
| (...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 227   { | 215   { | 
| 228     // Start a thread which writes its event into |captured_events|. | 216     // Start a thread which writes its event into |captured_events|. | 
| 229     CaptureToEventList t(&captured_events); | 217     CaptureToEventList t(&captured_events); | 
| 230     EXPECT_TRUE(t.Start()); | 218     EXPECT_TRUE(t.Start()); | 
| 231     EXPECT_TRUE(t.message_loop()); | 219     EXPECT_TRUE(t.message_loop()); | 
| 232     EXPECT_TRUE(t.IsRunning()); | 220     EXPECT_TRUE(t.IsRunning()); | 
| 233 | 221 | 
| 234     // Register an observer that writes into |captured_events| once the | 222     // Register an observer that writes into |captured_events| once the | 
| 235     // thread's message loop is destroyed. | 223     // thread's message loop is destroyed. | 
| 236     t.message_loop()->PostTask( | 224     t.message_loop()->PostTask( | 
| 237         FROM_HERE, | 225         FROM_HERE, base::Bind(&RegisterDestructionObserver, | 
| 238         new RegisterDestructionObserver(&loop_destruction_observer)); | 226                               base::Unretained(&loop_destruction_observer))); | 
| 239 | 227 | 
| 240     // Upon leaving this scope, the thread is deleted. | 228     // Upon leaving this scope, the thread is deleted. | 
| 241   } | 229   } | 
| 242 | 230 | 
| 243   // Check the order of events during shutdown. | 231   // Check the order of events during shutdown. | 
| 244   ASSERT_EQ(static_cast<size_t>(THREAD_NUM_EVENTS), captured_events.size()); | 232   ASSERT_EQ(static_cast<size_t>(THREAD_NUM_EVENTS), captured_events.size()); | 
| 245   EXPECT_EQ(THREAD_EVENT_INIT, captured_events[0]); | 233   EXPECT_EQ(THREAD_EVENT_INIT, captured_events[0]); | 
| 246   EXPECT_EQ(THREAD_EVENT_CLEANUP, captured_events[1]); | 234   EXPECT_EQ(THREAD_EVENT_CLEANUP, captured_events[1]); | 
| 247   EXPECT_EQ(THREAD_EVENT_MESSAGE_LOOP_DESTROYED, captured_events[2]); | 235   EXPECT_EQ(THREAD_EVENT_MESSAGE_LOOP_DESTROYED, captured_events[2]); | 
| 248 } | 236 } | 
| OLD | NEW | 
|---|