diff --git a/src/App/Application.cpp b/src/App/Application.cpp index e092f1d5c4..dd34602d9b 100644 --- a/src/App/Application.cpp +++ b/src/App/Application.cpp @@ -84,6 +84,7 @@ #include "Annotation.h" #include "Application.h" +#include "CleanupProcess.h" #include "ComplexGeoData.h" #include "DocumentObjectFileIncluded.h" #include "DocumentObjectGroup.h" @@ -1699,6 +1700,8 @@ void Application::destruct() cleanupUnits(); #endif + CleanupProcess::callCleanup(); + // not initialized or double destruct! assert(_pcSingleton); delete _pcSingleton; diff --git a/src/App/CMakeLists.txt b/src/App/CMakeLists.txt index c809a0aeec..044825fdac 100644 --- a/src/App/CMakeLists.txt +++ b/src/App/CMakeLists.txt @@ -271,6 +271,7 @@ SET(FreeCADApp_CPP_SRCS ApplicationPy.cpp AutoTransaction.cpp Branding.cpp + CleanupProcess.cpp Color.cpp ColorModel.cpp ComplexGeoData.cpp @@ -296,6 +297,7 @@ SET(FreeCADApp_HPP_SRCS Application.h AutoTransaction.h Branding.h + CleanupProcess.h Color.h ColorModel.h ComplexGeoData.h diff --git a/src/App/CleanupProcess.cpp b/src/App/CleanupProcess.cpp new file mode 100644 index 0000000000..30fbd35ae2 --- /dev/null +++ b/src/App/CleanupProcess.cpp @@ -0,0 +1,47 @@ +// SPDX-License-Identifier: LGPL-2.1-or-later + +/*************************************************************************** + * Copyright (c) 2024 Werner Mayer * + * * + * This file is part of FreeCAD. * + * * + * FreeCAD is free software: you can redistribute it and/or modify it * + * under the terms of the GNU Lesser General Public License as * + * published by the Free Software Foundation, either version 2.1 of the * + * License, or (at your option) any later version. * + * * + * FreeCAD 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 * + * Lesser General Public License for more details. * + * * + * You should have received a copy of the GNU Lesser General Public * + * License along with FreeCAD. If not, see * + * . * + * * + **************************************************************************/ + +#include "PreCompiled.h" +#include + +#include "CleanupProcess.h" + + +using namespace App; + +namespace +{ + static std::list> cleanup_funcs; // NOLINT +} + +void CleanupProcess::registerCleanup(const std::function& func) +{ + cleanup_funcs.push_back(func); +} + +void CleanupProcess::callCleanup() +{ + for (const auto& func : cleanup_funcs) { + func(); + } +} diff --git a/src/App/CleanupProcess.h b/src/App/CleanupProcess.h new file mode 100644 index 0000000000..a5d9281b4f --- /dev/null +++ b/src/App/CleanupProcess.h @@ -0,0 +1,57 @@ +// SPDX-License-Identifier: LGPL-2.1-or-later + +/*************************************************************************** + * Copyright (c) 2024 Werner Mayer * + * * + * This file is part of FreeCAD. * + * * + * FreeCAD is free software: you can redistribute it and/or modify it * + * under the terms of the GNU Lesser General Public License as * + * published by the Free Software Foundation, either version 2.1 of the * + * License, or (at your option) any later version. * + * * + * FreeCAD 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 * + * Lesser General Public License for more details. * + * * + * You should have received a copy of the GNU Lesser General Public * + * License along with FreeCAD. If not, see * + * . * + * * + **************************************************************************/ + +#ifndef APP_CLEANUPPROCESS_H +#define APP_CLEANUPPROCESS_H + +#include +#include + +namespace App +{ + +/*! + * \brief The CleanupProcess class + */ +class AppExport CleanupProcess +{ +public: + /*! + * \brief registerCleanup + * \param func + * This adds a callback function that will be called when the application + * is about to be shut down. + * @note A callback function is only about to free resources. Accessing + * stuff of the application like parameter groups should be avoided. + */ + static void registerCleanup(const std::function& func); + /*! + * \brief callCleanup + * Calls the functions that are registered with \a registerCleanup. + */ + static void callCleanup(); +}; + +} + +#endif // APP_CLEANUPPROCESS_H