diff options
-rw-r--r-- | base/thread.cc | 6 | ||||
-rw-r--r-- | base/thread.h | 3 | ||||
-rw-r--r-- | chrome/browser/history/history.cc | 26 |
3 files changed, 31 insertions, 4 deletions
diff --git a/base/thread.cc b/base/thread.cc index f447fbb..dcda330 100644 --- a/base/thread.cc +++ b/base/thread.cc @@ -135,6 +135,10 @@ void Thread::StopSoon() { message_loop_->PostTask(FROM_HERE, new ThreadQuitTask()); } +void Thread::Run(MessageLoop* message_loop) { + message_loop->Run(); +} + void Thread::ThreadMain() { // The message loop for this thread. MessageLoop message_loop(startup_data_->options.message_loop_type); @@ -153,7 +157,7 @@ void Thread::ThreadMain() { // startup_data_ can't be touched anymore since the starting thread is now // unlocked. - message_loop.Run(); + Run(message_loop_); // Let the thread do extra cleanup. CleanUp(); diff --git a/base/thread.h b/base/thread.h index d1aae0e..36daa7f 100644 --- a/base/thread.h +++ b/base/thread.h @@ -114,6 +114,9 @@ class Thread : PlatformThread::Delegate { // Called just prior to starting the message loop virtual void Init() {} + // Called to start the message loop + virtual void Run(MessageLoop* message_loop); + // Called just after the message loop ends virtual void CleanUp() {} diff --git a/chrome/browser/history/history.cc b/chrome/browser/history/history.cc index 8310c23..965770f 100644 --- a/chrome/browser/history/history.cc +++ b/chrome/browser/history/history.cc @@ -40,6 +40,7 @@ #include "chrome/browser/history/history_types.h" #include "chrome/browser/history/in_memory_database.h" #include "chrome/browser/history/in_memory_history_backend.h" +#include "chrome/browser/history/visit_log.h" #include "chrome/browser/profile.h" #include "chrome/browser/visitedlink_master.h" #include "chrome/common/chrome_constants.h" @@ -53,7 +54,26 @@ using base::Time; using history::HistoryBackend; -static const char* kHistoryThreadName = "Chrome_HistoryThread"; +namespace { + +class ChromeHistoryThread : public ChromeThread { + public: + ChromeHistoryThread() : ChromeThread(ChromeThread::HISTORY) {} + virtual ~ChromeHistoryThread() { + // We cannot rely on our base class to call Stop() in case we want our + // CleanUp function to run. + Stop(); + } + protected: + virtual void Run(MessageLoop* message_loop) { + // Allocate VisitLog on local stack so it will be saved in crash dump. + history::VisitLog visit_log; + history::InitVisitLog(&visit_log); + message_loop->Run(); + } +}; + +} // namespace // Sends messages from the backend to us on the main thread. This must be a // separate class from the history service so that it can hold a reference to @@ -100,7 +120,7 @@ class HistoryService::BackendDelegate : public HistoryBackend::Delegate { const history::StarID HistoryService::kBookmarkBarID = 1; HistoryService::HistoryService() - : thread_(new base::Thread(kHistoryThreadName)), + : thread_(new ChromeHistoryThread()), profile_(NULL), backend_loaded_(false) { // Is NULL when running generate_profile. @@ -111,7 +131,7 @@ HistoryService::HistoryService() } HistoryService::HistoryService(Profile* profile) - : thread_(new base::Thread(kHistoryThreadName)), + : thread_(new ChromeHistoryThread()), profile_(profile), backend_loaded_(false) { registrar_.Add(this, NotificationType::HISTORY_URLS_DELETED, |