diff options
author | thakis@chromium.org <thakis@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-10-02 03:24:13 +0000 |
---|---|---|
committer | thakis@chromium.org <thakis@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-10-02 03:24:13 +0000 |
commit | 3cafc369b174594f0f7e873890aff267233d2209 (patch) | |
tree | 3def7c63b322ae96439fc13c0103ab7407ccd4f0 /chrome/browser/gtk/owned_widget_gtk.cc | |
parent | 6de328fddf450413595d75c2fe3cf2c34f7cee4f (diff) | |
download | chromium_src-3cafc369b174594f0f7e873890aff267233d2209.zip chromium_src-3cafc369b174594f0f7e873890aff267233d2209.tar.gz chromium_src-3cafc369b174594f0f7e873890aff267233d2209.tar.bz2 |
Revert 61269 (broke lots of browser and ui tests, like on your try run) - [GTK] delay reference count check in OwnedWidgetGtk
It's a common problem that a GtkWidget will be referenced by an event that's currently on the callstack. These ref holders ignore the "destroy" signal, so when we go to destroy the owned widget, the refcount == 1 DCHECK fails. This change delays that DCHECK until the current stack has unwound, so we don't have to keep running into this.
BUG=none
TEST=in debug builds, Escape in a constrained window doesn't DCHECK, dragging a tab doesn't cause a DCHECK, pressing the custom frame [x] in lucid doesn't DCHECK; in general, no additional DCHECKs
Review URL: http://codereview.chromium.org/3416032
TBR=estade@chromium.org
Review URL: http://codereview.chromium.org/3564007
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@61283 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/gtk/owned_widget_gtk.cc')
-rw-r--r-- | chrome/browser/gtk/owned_widget_gtk.cc | 39 |
1 files changed, 3 insertions, 36 deletions
diff --git a/chrome/browser/gtk/owned_widget_gtk.cc b/chrome/browser/gtk/owned_widget_gtk.cc index c646cd7..2315371 100644 --- a/chrome/browser/gtk/owned_widget_gtk.cc +++ b/chrome/browser/gtk/owned_widget_gtk.cc @@ -6,32 +6,7 @@ #include <gtk/gtk.h> -#include "base/debug_util.h" #include "base/logging.h" -#include "base/message_loop.h" - -namespace { - -class CheckWidgetRefCountTask : public Task { - public: - CheckWidgetRefCountTask(GtkWidget* widget, const std::string& stack) - : widget_(widget), stack_(stack) {} - - virtual ~CheckWidgetRefCountTask() {} - - virtual void Run() { - // NOTE: Assumes some implementation details about glib internals. - DCHECK_EQ(G_OBJECT(widget_)->ref_count, 1U) << - " with Destroy() stack: \n" << stack_; - g_object_unref(widget_); - } - - private: - GtkWidget* widget_; - std::string stack_; -}; - -} // namespace OwnedWidgetGtk::~OwnedWidgetGtk() { DCHECK(!widget_) << "You must explicitly call OwnerWidgetGtk::Destroy()."; @@ -59,16 +34,8 @@ void OwnedWidgetGtk::Destroy() { widget_ = NULL; gtk_widget_destroy(widget); -#ifndef NDEBUG DCHECK(!g_object_is_floating(widget)); - - std::string stack(StackTrace().AsString()); -#else - std::string stack; -#endif - - // Make sure all other ref holders let go of their references (but delay - // the check because some ref holders won't let go immediately). - MessageLoop::current()->PostTask( - FROM_HERE, new CheckWidgetRefCountTask(widget, stack)); + // NOTE: Assumes some implementation details about glib internals. + DCHECK_EQ(G_OBJECT(widget)->ref_count, 1U); + g_object_unref(widget); } |