add 'cl_shutdown()' in destructor of class EQL

This commit is contained in:
polos 2021-04-30 16:09:01 +02:00
parent 7b692f4e12
commit 44056e0853
5 changed files with 20 additions and 6 deletions

View file

@ -177,7 +177,8 @@ void iniCLFunctions() {
DEFUN ("%qvariant-equal", qvariant_equal2, 2)
DEFUN ("qvariant-from-value", qvariant_from_value, 2)
DEFUN ("qvariant-value", qvariant_value, 1)
DEFUN ("qversion", qversion, 0) }
DEFUN ("qversion", qversion, 0)
DEFUN ("%set-shutdown-p", set_shutdown_p, 1) }
// QtObject methods
@ -1854,6 +1855,10 @@ cl_object qset_gc(cl_object l_obj) {
_garbage_collection_ = (l_obj != ECL_NIL);
ecl_return1(ecl_process_env(), l_obj); }
cl_object set_shutdown_p(cl_object l_obj) {
EQL::cl_shutdown_p = (l_obj != ECL_NIL);
ecl_return1(ecl_process_env(), l_obj); }
enum { GarbageCollection = 1 };
cl_object qdelete2(cl_object l_obj, cl_object l_later) {

View file

@ -295,6 +295,7 @@ cl_object qvariant_equal2 (cl_object, cl_object);
cl_object qvariant_from_value (cl_object, cl_object);
cl_object qvariant_value (cl_object);
cl_object qversion ();
cl_object set_shutdown_p (cl_object);
struct EQL_EXPORT QtObject {
void* pointer;

View file

@ -41,18 +41,22 @@ EQL::EQL() : QObject() {
#ifdef COMPILE_ANDROID
qInstallMessageHandler(logMessageHandler); // see above
#endif
if(!cl_booted) {
if(!cl_booted_p) {
cl_boot(1, (char**)_argv_); }
iniCLFunctions();
LObjects::ini(this);
ecl_init_module(NULL, ini_EQL); } // see "src/make.lisp"
EQL::~EQL() {
if(!EQL::cl_shutdown_p) {
cl_shutdown(); }}
void EQL::ini(char** argv) {
cl_booted = true;
cl_booted_p = true;
cl_boot(1, argv); }
void EQL::ini(int argc, char** argv) {
cl_booted = true;
cl_booted_p = true;
cl_boot(argc, argv); }
static void safe_eval_debug(const char* lisp_code) {
@ -222,7 +226,8 @@ void EQL::runOnUiThread(void* function_or_closure) {
CL_CATCH_ALL_END; }
EQL::EvalMode EQL::evalMode = DieOnError;
bool EQL::cl_booted = false;
bool EQL::cl_booted_p = false;
bool EQL::cl_shutdown_p = false;
bool EQL::return_value_p = false;
bool EQL::qexec = true;
QEventLoop* EQL::eventLoop = 0;

View file

@ -25,6 +25,7 @@ class EQL_EXPORT EQL : public QObject {
Q_OBJECT
public:
EQL();
~EQL();
enum EvalMode {
DebugOnError,
@ -32,7 +33,8 @@ public:
DieOnError,
};
static bool cl_booted;
static bool cl_booted_p;
static bool cl_shutdown_p;
static bool return_value_p;
static bool qexec;
static const char version[];

View file

@ -751,6 +751,7 @@
(qfun (qapp) "aboutToQuit")
(qfun (qapp) "quit")
(ffi:c-inline nil nil :void "cl_shutdown();" :one-liner t :side-effects t)
(%set-shutdown-p t) ; prevent multiple calls of 'cl_shutdown()', see 'eql.cpp:~EQL()'
(if (minusp exit-status)
(ffi:c-inline nil nil :void "abort();" :one-liner t :side-effects t)
(ffi:c-inline (exit-status) (:int) :void "exit(#0);" :one-liner t :side-effects t)))