From 42704cd3579ae59d1bb474052fc2909248e83cb6 Mon Sep 17 00:00:00 2001 From: David Rose Date: Wed, 24 Jun 2009 06:40:30 +0000 Subject: [PATCH] egad, it's really working --- direct/src/plugin/p3dInstance.cxx | 7 +++-- direct/src/plugin/p3dInstanceManager.cxx | 10 +++---- direct/src/plugin/p3dSession.cxx | 35 ++++++++++++------------ direct/src/plugin_npapi/ppInstance.cxx | 11 ++++++-- direct/src/plugin_npapi/startup.cxx | 4 +++ direct/src/showbase/VFSImporter.py | 31 +++++++++++++-------- 6 files changed, 59 insertions(+), 39 deletions(-) diff --git a/direct/src/plugin/p3dInstance.cxx b/direct/src/plugin/p3dInstance.cxx index 5a686402f4..efa0681dc1 100644 --- a/direct/src/plugin/p3dInstance.cxx +++ b/direct/src/plugin/p3dInstance.cxx @@ -255,7 +255,8 @@ feed_url_stream(int unique_id, size_t this_data_size) { Downloads::iterator di = _downloads.find(unique_id); if (di == _downloads.end()) { - nout << "Unexpected feed_url_stream for " << unique_id << "\n"; + nout << "Unexpected feed_url_stream for " << unique_id << "\n" + << flush; // Don't know this request. return false; } @@ -267,7 +268,7 @@ feed_url_stream(int unique_id, if (!download_ok || download->get_download_finished()) { // All done. - nout << "completed download " << unique_id << "\n"; + nout << "completed download " << unique_id << "\n" << flush; _downloads.erase(di); delete download; } @@ -313,7 +314,7 @@ start_download(P3DDownload *download) { assert(inserted); nout << "beginning download " << download_id << ": " << download->get_url() - << "\n"; + << "\n" << flush; P3D_request *request = new P3D_request; request->_instance = this; diff --git a/direct/src/plugin/p3dInstanceManager.cxx b/direct/src/plugin/p3dInstanceManager.cxx index 06c6d19f37..fbb11c3eae 100644 --- a/direct/src/plugin/p3dInstanceManager.cxx +++ b/direct/src/plugin/p3dInstanceManager.cxx @@ -35,7 +35,6 @@ P3DInstanceManager *P3DInstanceManager::_global_ptr; //////////////////////////////////////////////////////////////////// P3DInstanceManager:: P3DInstanceManager() { - nout << "creating instance manager\n"; _is_initialized = false; _unique_session_index = 0; @@ -93,10 +92,10 @@ initialize() { _platform = P3D_PLUGIN_PLATFORM; nout << "_root_dir = " << _root_dir << ", download = " - << _download_url << "\n"; + << _download_url << "\n" << flush; if (_root_dir.empty()) { - nout << "Could not find root directory.\n"; + nout << "Could not find root directory.\n" << flush; return false; } @@ -131,7 +130,7 @@ bool P3DInstanceManager:: start_instance(P3DInstance *inst, const string &p3d_filename, const P3D_token tokens[], size_t num_tokens) { if (inst->is_started()) { - nout << "Instance started twice: " << inst << "\n"; + nout << "Instance started twice: " << inst << "\n" << flush; return false; } inst->set_fparams(P3DFileParams(p3d_filename, tokens, num_tokens)); @@ -159,6 +158,7 @@ start_instance(P3DInstance *inst, const string &p3d_filename, //////////////////////////////////////////////////////////////////// void P3DInstanceManager:: finish_instance(P3DInstance *inst) { + nout << "finish_instance(" << inst << ")\n" << flush; Instances::iterator ii; ii = _instances.find(inst); assert(ii != _instances.end()); @@ -541,7 +541,7 @@ find_root_dir() const { } // Couldn't find a directory. Bail. - nout << "Couldn't find a root directory.\n"; + nout << "Couldn't find a root directory.\n" << flush; return string(); #else // _WIN32 diff --git a/direct/src/plugin/p3dSession.cxx b/direct/src/plugin/p3dSession.cxx index 477813b47e..79098e9ec6 100644 --- a/direct/src/plugin/p3dSession.cxx +++ b/direct/src/plugin/p3dSession.cxx @@ -86,13 +86,16 @@ P3DSession:: // Also close the pipe, to help underscore the point. _pipe_write.close(); - _pipe_read.close(); + + // Closing _pipe_read before the thread has stopped can result in + // a hang. Don't need to close it yet. + // _pipe_read.close(); #ifdef _WIN32 // Now give the process a chance to terminate itself cleanly. if (WaitForSingleObject(_p3dpython_handle, 2000) == WAIT_TIMEOUT) { // It didn't shut down cleanly, so kill it the hard way. - nout << "Terminating process.\n"; + nout << "Terminating process.\n" << flush; TerminateProcess(_p3dpython_handle, 2); } @@ -298,18 +301,18 @@ start_p3dpython() { #endif if (!started_p3dpython) { - nout << "Failed to create process.\n"; + nout << "Failed to create process.\n" << flush; return; } _p3dpython_running = true; - nout << "Created child process\n"; + nout << "Created child process\n" << flush; if (!_pipe_read) { - nout << "unable to open read pipe\n"; + nout << "unable to open read pipe\n" << flush; } if (!_pipe_write) { - nout << "unable to open write pipe\n"; + nout << "unable to open write pipe\n" << flush; } spawn_read_thread(); @@ -366,7 +369,6 @@ join_read_thread() { return; } - nout << "session waiting for thread\n"; _read_thread_continue = false; _pipe_read.close(); @@ -379,7 +381,6 @@ join_read_thread() { void *return_val; pthread_join(_read_thread, &return_val); #endif - nout << "session done waiting for thread\n"; _started_read_thread = false; } @@ -391,20 +392,20 @@ join_read_thread() { //////////////////////////////////////////////////////////////////// void P3DSession:: rt_thread_run() { - nout << "session thread reading.\n"; + nout << "session thread reading.\n" << flush; while (_read_thread_continue) { TiXmlDocument *doc = new TiXmlDocument; _pipe_read >> *doc; if (!_pipe_read || _pipe_read.eof()) { // Some error on reading. Abort. - nout << "Error on session reading.\n"; + nout << "Error on session reading.\n" << flush; rt_terminate(); return; } // Successfully read an XML document. - nout << "Session got request: " << *doc << "\n"; + nout << "Session got request: " << *doc << "\n" << flush; // TODO: feed the request up to the parent. delete doc; @@ -486,7 +487,7 @@ win_create_process(const string &program, const string &start_dir, // Create the pipe to the process. if (!CreatePipe(&r_to, &w_to, NULL, 0)) { - nout << "failed to create pipe\n"; + nout << "failed to create pipe\n" << flush; } else { // Make sure the right end of the pipe is inheritable. SetHandleInformation(r_to, HANDLE_FLAG_INHERIT, HANDLE_FLAG_INHERIT); @@ -495,7 +496,7 @@ win_create_process(const string &program, const string &start_dir, // Create the pipe from the process. if (!CreatePipe(&r_from, &w_from, NULL, 0)) { - nout << "failed to create pipe\n"; + nout << "failed to create pipe\n" << flush; } else { // Make sure the right end of the pipe is inheritable. SetHandleInformation(w_from, HANDLE_FLAG_INHERIT, HANDLE_FLAG_INHERIT); @@ -515,7 +516,7 @@ win_create_process(const string &program, const string &start_dir, error_handle = handle; SetHandleInformation(error_handle, HANDLE_FLAG_INHERIT, HANDLE_FLAG_INHERIT); } else { - nout << "Unable to open " << output_filename << "\n"; + nout << "Unable to open " << output_filename << "\n" << flush; } } @@ -614,7 +615,7 @@ posix_create_process(const string &program, const string &start_dir, int logfile_fd = open(output_filename.c_str(), O_WRONLY | O_CREAT | O_TRUNC, 0666); if (logfile_fd < 0) { - nout << "Unable to open " << output_filename << "\n"; + nout << "Unable to open " << output_filename << "\n" << flush; } else { dup2(logfile_fd, STDERR_FILENO); close(logfile_fd); @@ -629,7 +630,7 @@ posix_create_process(const string &program, const string &start_dir, close(from_fd[0]); if (chdir(start_dir.c_str()) < 0) { - nout << "Could not chdir to " << start_dir << "\n"; + nout << "Could not chdir to " << start_dir << "\n" << flush; _exit(1); } @@ -645,7 +646,7 @@ posix_create_process(const string &program, const string &start_dir, ptrs.push_back((char *)NULL); execle(program.c_str(), program.c_str(), (char *)0, &ptrs[0]); - nout << "Failed to exec " << program << "\n"; + nout << "Failed to exec " << program << "\n" << flush; _exit(1); } diff --git a/direct/src/plugin_npapi/ppInstance.cxx b/direct/src/plugin_npapi/ppInstance.cxx index 099a4498e8..41d466400c 100644 --- a/direct/src/plugin_npapi/ppInstance.cxx +++ b/direct/src/plugin_npapi/ppInstance.cxx @@ -68,7 +68,7 @@ PPInstance(NPMIMEType pluginType, NPP instance, uint16 mode, PPInstance:: ~PPInstance() { logfile - << "destructing " << this << "\n" << flush; + << "destructing " << this << ", " << _p3d_inst << "\n" << flush; if (_p3d_inst != NULL) { P3D_instance_finish(_p3d_inst); @@ -124,6 +124,7 @@ new_stream(NPMIMEType type, NPStream *stream, bool seekable, uint16 *stype) { if (!_started_instance_data) { stream->notifyData = new PPDownloadRequest(PPDownloadRequest::RT_instance_data); *stype = NP_ASFILEONLY; + _started_instance_data = true; return NPERR_NO_ERROR; } @@ -433,8 +434,12 @@ send_window() { parent_window._hwnd = (HWND)(_window.window); #endif + // Actually, we set up the window starting at (0, 0), instead of + // whatever Mozilla tells us, because the window handle we get is a + // specially created window that is already aligned to where we want + // our window to be. P3D_instance_setup_window - (_p3d_inst, P3D_WT_toplevel, - _window.x, _window.y, _window.width, _window.height, + (_p3d_inst, P3D_WT_embedded, + 0, 0, _window.width, _window.height, parent_window); } diff --git a/direct/src/plugin_npapi/startup.cxx b/direct/src/plugin_npapi/startup.cxx index 157d4b914f..5f6b30bb1b 100644 --- a/direct/src/plugin_npapi/startup.cxx +++ b/direct/src/plugin_npapi/startup.cxx @@ -213,8 +213,12 @@ NP_Shutdown(void) { RELEASE_LOCK(_timer_lock); DESTROY_LOCK(_timer_lock); + logfile << "unloading plugin\n" << flush; + unload_plugin(); + logfile << "done shutdown\n" << flush; + // Not clear whether there's a return value or not. Some versions // of the API have different opinions on this. return NPERR_NO_ERROR; diff --git a/direct/src/showbase/VFSImporter.py b/direct/src/showbase/VFSImporter.py index b2b6330cc5..026212be26 100644 --- a/direct/src/showbase/VFSImporter.py +++ b/direct/src/showbase/VFSImporter.py @@ -101,7 +101,7 @@ class VFSLoader: code = self._read_code() if not code: - raise ImportError + raise ImportError, 'No Python code in %s' % (fullname) mod = sys.modules.setdefault(fullname, new.module(fullname)) mod.__file__ = self.filename.cStr() @@ -128,7 +128,7 @@ class VFSLoader: def _read_source(self): """ Returns the Python source for this file, if it is - available, or None if it is not. """ + available, or None if it is not. May raise IOError. """ if self.fileType == FTPythonCompiled or \ self.fileType == FTCompiledModule: @@ -136,10 +136,7 @@ class VFSLoader: filename = Filename(self.filename) filename.setExtension('py') - try: - file = open(filename, 'rU') - except IOError: - return None + file = open(filename, 'rU') return file.read() def _import_compiled_module(self, fullname): @@ -179,14 +176,16 @@ class VFSLoader: def _read_code(self): """ Returns the Python compiled code object for this file, if - it is available, or None if it is not. """ + it is available, or None if it is not. May raise IOError, + ValueError, SyntaxError, or a number of other errors generated + by the low-level system. """ if self.fileType == FTPythonCompiled: # It's a pyc file; just read it directly. pycVfile = vfs.getFile(self.filename, False) if pycVfile: return self._loadPyc(pycVfile, None) - return None + raise IOError, 'Could not read %s' % (self.filename) elif self.fileType == FTCompiledModule: return None @@ -205,7 +204,10 @@ class VFSLoader: code = None if t_pyc and t_pyc >= self.timestamp: - code = self._loadPyc(pycVfile, self.timestamp) + try: + code = self._loadPyc(pycVfile, self.timestamp) + except ValueError: + code = None if not code: source = self._read_source() @@ -216,20 +218,27 @@ class VFSLoader: return code def _loadPyc(self, vfile, timestamp): - """ Reads and returns the marshal data from a .pyc file. """ + """ Reads and returns the marshal data from a .pyc file. + Raises ValueError if there is a problem. """ + code = None f = open(vfile, 'rb') if f.read(4) == imp.get_magic(): t = struct.unpack('