From: Braden M. <br...@us...> - 2007-04-27 03:01:28
|
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> |