rollback r1891

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@1892 0039d316-1c4b-4281-b951-d872f2087c98


CrOS-Libchrome-Original-Commit: 08de3cde4d95e9c962aee2386d7297d561404513
diff --git a/base/message_loop.cc b/base/message_loop.cc
index 4f6f2fd..fffeb09 100644
--- a/base/message_loop.cc
+++ b/base/message_loop.cc
@@ -100,28 +100,26 @@
   FOR_EACH_OBSERVER(DestructionObserver, destruction_observers_,
                     WillDestroyCurrentMessageLoop());
 
-  DCHECK(!state_);
-
-  // Clean up any unprocessed tasks, but take care: deleting a task could
-  // result in the addition of more tasks (e.g., via DeleteSoon).  We set a
-  // limit on the number of times we will allow a deleted task to generate more
-  // tasks.  Normally, we should only pass through this loop once or twice.  If
-  // we end up hitting the loop limit, then it is probably due to one task that
-  // is being stubborn.  Inspect the queues to see who is left.
-  bool did_work;
-  for (int i = 0; i < 100; ++i) {
-    DeletePendingTasks();
-    ReloadWorkQueue();
-    // If we end up with empty queues, then break out of the loop.
-    did_work = DeletePendingTasks();
-    if (!did_work)
-      break;
-  }
-  DCHECK(!did_work);
-
   // OK, now make it so that no one can find us.
   tls_index_.Set(NULL);
 
+  DCHECK(!state_);
+
+  // Most tasks that have not been Run() are deleted in the |timer_manager_|
+  // destructor after we remove our tls index.  We delete the tasks in our
+  // queues here so their destuction is similar to the tasks in the
+  // |timer_manager_|.
+  DeletePendingTasks();
+  ReloadWorkQueue();
+  DeletePendingTasks();
+
+  // Delete tasks in the delayed work queue.
+  while (!delayed_work_queue_.empty()) {
+    Task* task = delayed_work_queue_.top().task;
+    delayed_work_queue_.pop();
+    delete task;
+  }
+
 #if defined(OS_WIN)
   // Match timeBeginPeriod() from construction.
   timeEndPeriod(1);
@@ -332,26 +330,20 @@
   }
 }
 
-bool MessageLoop::DeletePendingTasks() {
-  bool did_work = !work_queue_.empty();
-  while (!work_queue_.empty()) {
-    Task* task = work_queue_.front().task;
-    work_queue_.pop();
-    delete task;
+void MessageLoop::DeletePendingTasks() {
+  /* Comment this out as it's causing crashes.
+  while (!work_queue_.Empty()) {
+    Task* task = work_queue_.Pop();
+    if (task->is_owned_by_message_loop())
+      delete task;
   }
-  did_work |= !deferred_non_nestable_work_queue_.empty();
-  while (!deferred_non_nestable_work_queue_.empty()) {
-    Task* task = deferred_non_nestable_work_queue_.front().task;
-    deferred_non_nestable_work_queue_.pop();
-    delete task;
+
+  while (!delayed_non_nestable_queue_.Empty()) {
+    Task* task = delayed_non_nestable_queue_.Pop();
+    if (task->is_owned_by_message_loop())
+      delete task;
   }
-  did_work |= !delayed_work_queue_.empty();
-  while (!delayed_work_queue_.empty()) {
-    Task* task = delayed_work_queue_.top().task;
-    delayed_work_queue_.pop();
-    delete task;
-  }
-  return did_work;
+  */
 }
 
 bool MessageLoop::DoWork() {