|
From: <br...@us...> - 2009-05-06 09:36:19
|
Revision: 3904
http://openvrml.svn.sourceforge.net/openvrml/?rev=3904&view=rev
Author: braden
Date: 2009-05-06 09:36:16 +0000 (Wed, 06 May 2009)
Log Message:
-----------
Fixed race condition when realizing the OpenvrmlXembedBrowserPlug.
Modified Paths:
--------------
trunk/ChangeLog
trunk/src/openvrml-xembed/browser.cpp
Modified: trunk/ChangeLog
===================================================================
--- trunk/ChangeLog 2009-05-04 06:57:19 UTC (rev 3903)
+++ trunk/ChangeLog 2009-05-06 09:36:16 UTC (rev 3904)
@@ -1,3 +1,18 @@
+2009-05-06 Braden McDaniel <br...@en...>
+
+ Fixed race condition when realizing the OpenvrmlXembedBrowserPlug.
+
+ * src/openvrml-xembed/browser.cpp
+ (OpenvrmlXembedBrowserPrivate_): Changed browser_plug_set_cond to
+ browser_plug_realized_cond to reflect that the condition variable
+ will be signaled after the plug has been realized.
+ (openvrml_xembed_browser_get_id(OpenvrmlXembedBrowser *)):
+ Surround call to gtk_plug_get_id with
+ gdk_threads_enter/gdk_threads_leave.
+ (openvrml_xembed_browser_ready_dispatch(GSource *, GSourceFunc,
+ gpointer)): Realize the browser_plug before signaling the
+ condition variable.
+
2009-05-04 Braden McDaniel <br...@en...>
* src/libopenvrml/openvrml/node.cpp
Modified: trunk/src/openvrml-xembed/browser.cpp
===================================================================
--- trunk/src/openvrml-xembed/browser.cpp 2009-05-04 06:57:19 UTC (rev 3903)
+++ trunk/src/openvrml-xembed/browser.cpp 2009-05-06 09:36:16 UTC (rev 3904)
@@ -120,7 +120,7 @@
browser_listener * listener;
OpenvrmlXembedBrowserPlug * browser_plug;
GMutex * browser_plug_mutex;
- GCond * browser_plug_set_cond;
+ GCond * browser_plug_realized_cond;
bool expect_initial_stream;
};
@@ -237,9 +237,9 @@
browser->priv->listener = new browser_listener(*browser);
browser->priv->browser_control->add_listener(*browser->priv->listener);
- browser->priv->browser_plug = 0;
- browser->priv->browser_plug_mutex = g_mutex_new();
- browser->priv->browser_plug_set_cond = g_cond_new();
+ browser->priv->browser_plug = 0;
+ browser->priv->browser_plug_mutex = g_mutex_new();
+ browser->priv->browser_plug_realized_cond = g_cond_new();
} catch (std::exception & ex) {
//
// ex is most likely std::bad_alloc.
@@ -253,7 +253,7 @@
void openvrml_xembed_browser_finalize(GObject * const obj)
{
OpenvrmlXembedBrowser * const browser = OPENVRML_XEMBED_BROWSER(obj);
- g_cond_free(browser->priv->browser_plug_set_cond);
+ g_cond_free(browser->priv->browser_plug_realized_cond);
g_mutex_free(browser->priv->browser_plug_mutex);
browser->priv->browser_control->remove_listener(*browser->priv->listener);
delete browser->priv->listener;
@@ -448,11 +448,13 @@
g_assert(browser);
g_mutex_lock(browser->priv->browser_plug_mutex);
while (!browser->priv->browser_plug) {
- g_cond_wait(browser->priv->browser_plug_set_cond,
+ g_cond_wait(browser->priv->browser_plug_realized_cond,
browser->priv->browser_plug_mutex);
}
g_assert(browser->priv->browser_plug);
+ gdk_threads_enter();
const guint64 id = gtk_plug_get_id(GTK_PLUG(browser->priv->browser_plug));
+ gdk_threads_leave();
g_mutex_unlock(browser->priv->browser_plug_mutex);
return id;
}
@@ -1269,12 +1271,14 @@
g_mutex_lock(browser_ready_source->ready_browser->priv->browser_plug_mutex);
browser_ready_source->ready_browser->priv->browser_plug =
OPENVRML_XEMBED_BROWSER_PLUG(browser_plug);
+
+ gtk_widget_realize(browser_plug);
+
g_cond_signal(
- browser_ready_source->ready_browser->priv->browser_plug_set_cond);
+ browser_ready_source->ready_browser->priv->browser_plug_realized_cond);
g_mutex_unlock(
browser_ready_source->ready_browser->priv->browser_plug_mutex);
- gtk_widget_realize(browser_plug);
gtk_widget_show_all(browser_plug);
g_source_destroy(source);
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|