Mercurial > octave
view libgui/src/interpreter-qobject.h @ 28347:00a9a49c7670 stable
improve interpreter shutdown process (bug #56952)
This change is a further attempt to avoid segfaults when shutting down
the interpreter and exiting the GUI event loop. The latest approach
is to have the interpreter signal that it is finished with "normal"
command execution (REPL, command line script, or --eval option code),
then let the GUI thread process any remaining functions in its event
loop(s) then signal back to the interpreter that it is OK to shutdown.
Once the shutdown has happened (which may involve further calls to the
GUI thread while executing atexit functions or finish.m or other
shutdown code, the interpreter signals back to the GUI that shutdown
is complete. At that point, the GUI can delete the interpreter object
and exit.
* ObjectProxy.h, ObjectProxy.cc (ObjectProxy::sendFinalize): New signal.
(ObjectProxy::ObjectProxy): Connect/disconnect sendFinalize signal.
(ObjectProxy::update, ObjectProxy::finalize): Use normal signal/slot
connection.
* interpreter-qobject.h, interpreter-qobject.cc
(interpreter_qobject::ready): Rename from octave_ready_signal. Change
all uses.
(interpreter_qobject::execution_finished): Rename from
octave_finished_singal. Change all uses.
(interpreter_qobject::shutdown_finished): New signal.
(interpreter_qobject::shutdown): New slot.
(interpreter_qobject::execute): After interpreter finishes with normal
execution, simply signal that execution has finished. Don't attempt
to disable connecton to GUI or cleanup/delete interpreter.
* octave-qobject.h, octave-qobject.cc
(base_qobject::handle_interpreter_execution_finished): Rename from
handle_octave_finished): Simply emit a signal requesting an orderly
shutdown of the interpreter. Change all uses.
(base_qobject::handle_interpreter_shutdown_finished): New slot.
(base_qobject::request_interpreter_shutdown): New signal.
(base_qobject::base_qobject): Connect request_interpreter_shutdown to
interpreter_qobject::shutdown slot.
* interpreter.h, interpreter.cc (interpreter::shutdown): Rename from
cleanup and make public.
(interpreter::~interpreter): Don't call cleanup here.
author | John W. Eaton <jwe@octave.org> |
---|---|
date | Fri, 22 May 2020 12:54:13 -0400 |
parents | bd51beb6205e |
children | eb1e10abe9d5 0a5b15007766 |
line wrap: on
line source
//////////////////////////////////////////////////////////////////////// // // Copyright (C) 2011-2020 The Octave Project Developers // // See the file COPYRIGHT.md in the top-level directory of this // distribution or <https://octave.org/copyright/>. // // This file is part of Octave. // // Octave is free software: you can redistribute it and/or modify it // under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Octave is distributed in the hope that it will be useful, but // WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with Octave; see the file COPYING. If not, see // <https://www.gnu.org/licenses/>. // //////////////////////////////////////////////////////////////////////// #if ! defined (octave_interpreter_qobject_h) #define octave_interpreter_qobject_h 1 #include <QObject> #include "qt-interpreter-events.h" namespace octave { class interpreter; class base_qobject; class interpreter_qobject : public QObject { Q_OBJECT public: interpreter_qobject (base_qobject& oct_qobj); ~interpreter_qobject (void) = default; qt_interpreter_events * qt_link (void); void interpreter_event (const fcn_callback& fcn); void interpreter_event (const meth_callback& meth); signals: void ready (void); void execution_finished (int); void shutdown_finished (int); public slots: // Programming Note: With the current design of the interpreter, // additional signals will not be noticed because the execute // function starts the Octave interpreter and it doesn't return // until the interpreter exits. So the Qt event loop running in the // thread where the interpreter_qobject object lives never has a // chance to see another signal. Changing the design of the // terminal widget as proposed and discussed here: // // https://lists.gnu.org/archive/html/octave-maintainers/2019-05/msg00115.html // https://lists.gnu.org/archive/html/octave-maintainers/2019-06/msg00009.html // // coulld solve that problem. Briefly, instead of having the Octave // interpreter block and wait for keyboard input, the terminal // widget would be in charge of accepting keyboard events and use // readline in callback mode. Then the terminal widget and the // interpreter will not block except when executing code. Then we // could have the interpreter qobject directly accept signals. //! Initialize and execute the octave interpreter. void execute (void); void shutdown (int); private: base_qobject& m_octave_qobj; interpreter *m_interpreter; }; } #endif