Update of /cvsroot/openvrml/openvrml/src/openvrml-xembed
In directory sc8-pr-cvs3.sourceforge.net:/tmp/cvs-serv27131/src/openvrml-xembed
Modified Files:
Tag: OpenVRML-0_16-BRANCH
gtkvrmlbrowser.cpp
Log Message:
gtk_vrml_browser_load_url needs to spawn a new thread. Otherwise we can hold up the main event loop and deadlock.
Index: gtkvrmlbrowser.cpp
===================================================================
RCS file: /cvsroot/openvrml/openvrml/src/openvrml-xembed/gtkvrmlbrowser.cpp,v
retrieving revision 1.1.2.6
retrieving revision 1.1.2.7
diff -C2 -d -r1.1.2.6 -r1.1.2.7
*** gtkvrmlbrowser.cpp 22 Apr 2007 09:09:19 -0000 1.1.2.6
--- gtkvrmlbrowser.cpp 27 Apr 2007 03:01:26 -0000 1.1.2.7
***************
*** 110,113 ****
--- 110,114 ----
GIOChannel * request_channel_;
boost::mutex request_channel_mutex_;
+ boost::thread_group thread_group_;
public:
***************
*** 115,118 ****
--- 116,121 ----
virtual ~browser() OPENVRML_NOTHROW;
+ void create_thread(const boost::function0<void> & threadfunc);
+
private:
virtual std::auto_ptr<openvrml::resource_istream>
***************
*** 156,159 ****
--- 159,164 ----
gpointer);
+ struct load_url;
+
::browser browser_;
::browser_listener browser_listener_;
***************
*** 200,203 ****
--- 205,234 ----
}
+ namespace {
+ struct GtkGLViewer::load_url {
+ load_url(GtkGLViewer & viewer,
+ const std::vector<std::string> & url,
+ const std::vector<std::string> & parameter):
+ viewer_(&viewer),
+ url_(url),
+ parameter_(parameter)
+ {}
+
+ void operator()() const throw ()
+ {
+ {
+ boost::mutex::scoped_lock
+ lock(this->viewer_->browser_initialized_mutex_);
+ this->viewer_->browser_initialized_ = false;
+ }
+ this->viewer_->browser_.load_url(this->url_, this->parameter_);
+ }
+
+ private:
+ GtkGLViewer * const viewer_;
+ const std::vector<std::string> url_, parameter_;
+ };
+ }
+
void gtk_vrml_browser_load_url(GtkVrmlBrowser * const vrml_browser,
const gchar ** url,
***************
*** 212,220 ****
while (parameter && *parameter) { param_vec.push_back(*(parameter++)); }
! {
! boost::mutex::scoped_lock lock(viewer.browser_initialized_mutex_);
! viewer.browser_initialized_ = false;
! }
! viewer.browser_.load_url(url_vec, param_vec);
}
--- 243,248 ----
while (parameter && *parameter) { param_vec.push_back(*(parameter++)); }
! viewer.browser_
! .create_thread(GtkGLViewer::load_url(viewer, url_vec, param_vec));
}
***************
*** 546,550 ****
browser::~browser() OPENVRML_NOTHROW
! {}
std::auto_ptr<openvrml::resource_istream>
--- 574,585 ----
browser::~browser() OPENVRML_NOTHROW
! {
! this->thread_group_.join_all();
! }
!
! void browser::create_thread(const boost::function0<void> & threadfunc)
! {
! this->thread_group_.create_thread(threadfunc);
! }
std::auto_ptr<openvrml::resource_istream>
|