diff --git a/applications/test/dynamicLibrary/Make/files b/applications/test/dynamicLibrary/Make/files new file mode 100644 index 0000000000..54ed5e99bc --- /dev/null +++ b/applications/test/dynamicLibrary/Make/files @@ -0,0 +1,3 @@ +Test-dynamicLibrary.C + +EXE = $(FOAM_USER_APPBIN)/Test-dynamicLibrary diff --git a/applications/test/dynamicLibrary/Make/options b/applications/test/dynamicLibrary/Make/options new file mode 100644 index 0000000000..75c7356f1c --- /dev/null +++ b/applications/test/dynamicLibrary/Make/options @@ -0,0 +1,2 @@ +EXE_INC = +EXE_LIBS = diff --git a/applications/test/dynamicLibrary/Test-dynamicLibrary.C b/applications/test/dynamicLibrary/Test-dynamicLibrary.C new file mode 100644 index 0000000000..ee7009b961 --- /dev/null +++ b/applications/test/dynamicLibrary/Test-dynamicLibrary.C @@ -0,0 +1,143 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | www.openfoam.com + \\/ M anipulation | +------------------------------------------------------------------------------- + Copyright (C) 2020 OpenCFD Ltd. +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM 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. + + OpenFOAM 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 OpenFOAM. If not, see . + +Application + Test-dynamicLibrary + +Description + Test loading/unloading of libraries + +\*---------------------------------------------------------------------------*/ + +#include "argList.H" +#include "profiling.H" +#include "DynamicList.H" + +using namespace Foam; + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +int main(int argc, char *argv[]) +{ + argList::addNote("Low-level test of library load/unload"); + + profiling::disable(); // No profiling output + argList::noBanner(); + argList::noParallel(); + argList::removeOption("case"); + argList::removeOption("noFunctionObjects"); + argList::addBoolOption("no-close", "Skip dlclose"); + argList::addBoolOption("quiet", "Disable verbosity"); + + argList::addArgument("lib..."); + argList::noMandatoryArgs(); // Arguments are optional + + argList args(argc, argv, false, true); + + const bool noClose = args.found("no-close"); + const bool verbose = !args.found("quiet"); + + //- Pointers to the loaded libraries + DynamicList libPtrs_; + + //- Names of loaded libraries, or of libraries to be loaded + DynamicList libNames_; + + label nbad = 0; + wordHashSet loaded; + + for (int argi = 1; argi < args.size(); ++argi) + { + const fileName libName(fileName::validate(args[argi])); + + if (libName.empty()) + { + continue; + } + + void* ptr = Foam::dlOpen(libName, false); + + if (!ptr) + { + ++nbad; + } + else + { + libPtrs_.append(ptr); + libNames_.append(libName); + + if (verbose) + { + const word addr(Foam::name(ptr)); + + if (loaded.insert(addr)) + { + InfoErr << "Can load " << libName << nl; + } + else + { + InfoErr << "Already loaded " << libName << nl; + } + } + } + } + + if (!noClose) + { + forAllReverse(libPtrs_, i) + { + void* ptr = libPtrs_[i]; + + if (ptr == nullptr) + { + libNames_[i].clear(); + continue; + } + + const bool ok = Foam::dlClose(ptr); + + if (verbose) + { + if (ok) + { + InfoErr << "Closed "; + } + else + { + InfoErr << "Failed closing "; + } + + InfoErr + << libNames_[i] + << " with handle " << Foam::name(ptr) << nl; + } + } + } + + return 0; +} + + +// ************************************************************************* // diff --git a/src/OpenFOAM/db/Time/Time.C b/src/OpenFOAM/db/Time/Time.C index cccda67da8..dbc1c8214c 100644 --- a/src/OpenFOAM/db/Time/Time.C +++ b/src/OpenFOAM/db/Time/Time.C @@ -471,7 +471,7 @@ Foam::Time::Time if (enableLibs) { - libs_.open(controlDict_, "libs"); + libs_.open("libs", controlDict_); } // Explicitly set read flags on objectRegistry so anything constructed @@ -553,12 +553,9 @@ Foam::Time::Time // Libraries // // * enable by default unless '-no-libs' option was used - if (!args.found("no-libs")) + if (enableLibs && !args.found("no-libs")) { - if (enableLibs) - { - libs_.open(controlDict_, "libs"); - } + libs_.open("libs", controlDict_); } // Explicitly set read flags on objectRegistry so anything constructed @@ -634,7 +631,7 @@ Foam::Time::Time if (enableLibs) { - libs_.open(controlDict_, "libs"); + libs_.open("libs", controlDict_); } @@ -708,7 +705,7 @@ Foam::Time::Time if (enableLibs) { - libs_.open(controlDict_, "libs"); + libs_.open("libs", controlDict_); } setMonitoring(); // for profiling etc diff --git a/src/OpenFOAM/db/Time/Time.H b/src/OpenFOAM/db/Time/Time.H index 4d080a48cd..75f0a01eae 100644 --- a/src/OpenFOAM/db/Time/Time.H +++ b/src/OpenFOAM/db/Time/Time.H @@ -130,14 +130,14 @@ public: private: - // Private data + // Private Data //- Profiling trigger for time-loop (for run, loop) mutable std::unique_ptr loopProfiling_; - //- Any loaded dynamic libraries. Make sure to construct before - // reading controlDict. - dlLibraryTable libs_; + //- Any loaded dynamic libraries + // Construct before reading controlDict + mutable dlLibraryTable libs_; //- The controlDict unwatchedIOdictionary controlDict_; @@ -145,7 +145,7 @@ private: protected: - // Protected data + // Protected Data label startTimeIndex_; @@ -502,14 +502,8 @@ public: return functionObjects_; } - //- External access to the loaded libraries - const dlLibraryTable& libs() const - { - return libs_; - } - - //- External access to the loaded libraries - dlLibraryTable& libs() + //- Mutable access to the loaded dynamic libraries + dlLibraryTable& libs() const { return libs_; } diff --git a/src/OpenFOAM/db/dictionary/functionEntries/codeStream/codeStream.C b/src/OpenFOAM/db/dictionary/functionEntries/codeStream/codeStream.C index 72a1f92778..0d877cb5f6 100644 --- a/src/OpenFOAM/db/dictionary/functionEntries/codeStream/codeStream.C +++ b/src/OpenFOAM/db/dictionary/functionEntries/codeStream/codeStream.C @@ -6,7 +6,7 @@ \\/ M anipulation | ------------------------------------------------------------------------------- Copyright (C) 2011-2017 OpenFOAM Foundation - Copyright (C) 2018-2019 OpenCFD Ltd. + Copyright (C) 2018-2020 OpenCFD Ltd. ------------------------------------------------------------------------------- License This file is part of OpenFOAM. @@ -73,7 +73,7 @@ Foam::dlLibraryTable& Foam::functionEntries::codeStream::libs ( dict.topDict() ); - return const_cast(d.time()).libs(); + return d.time().libs(); } @@ -145,18 +145,13 @@ Foam::functionEntries::codeStream::getFunction if (isA(topDict)) { - // Cached access to dl libs. Guarantees clean up upon destruction - // of Time. - dlLibraryTable& dlLibs = libs(parentDict); - if (dlLibs.open(libPath, false)) - { - lib = dlLibs.findLibrary(libPath); - } + // Cached access to libs, with cleanup upon termination + lib = libs(parentDict).open(libPath, false); } else { // Uncached opening of libPath. Do not complain if cannot be loaded - lib = dlOpen(libPath, false); + lib = Foam::dlOpen(libPath, false); } } @@ -299,14 +294,13 @@ Foam::functionEntries::codeStream::getFunction if (isA(topDict)) { - // Cached access to dl libs. Guarantees clean up upon destruction - // of Time. - dlLibraryTable& dlLibs = libs(parentDict); - + // Cached access to libs, with cleanup upon termination DebugPout << "Opening cached dictionary:" << libPath << endl; - if (!dlLibs.open(libPath, false)) + lib = libs(parentDict).open(libPath, false); + + if (!lib) { FatalIOErrorInFunction(parentDict) << "Failed loading library " << libPath << nl @@ -314,8 +308,6 @@ Foam::functionEntries::codeStream::getFunction << " in system/controlDict?" << exit(FatalIOError); } - - lib = dlLibs.findLibrary(libPath); } else { @@ -323,7 +315,7 @@ Foam::functionEntries::codeStream::getFunction DebugPout << "Opening uncached dictionary:" << libPath << endl; - lib = dlOpen(libPath, true); + lib = Foam::dlOpen(libPath, true); } } @@ -346,7 +338,7 @@ Foam::functionEntries::codeStream::getFunction streamingFunctionType function = reinterpret_cast ( - dlSym(lib, dynCode.codeName()) + Foam::dlSym(lib, dynCode.codeName()) ); diff --git a/src/OpenFOAM/db/dynamicLibrary/codedBase/codedBase.C b/src/OpenFOAM/db/dynamicLibrary/codedBase/codedBase.C index c4429222cb..0f6cc586d9 100644 --- a/src/OpenFOAM/db/dynamicLibrary/codedBase/codedBase.C +++ b/src/OpenFOAM/db/dynamicLibrary/codedBase/codedBase.C @@ -98,12 +98,7 @@ void* Foam::codedBase::loadLibrary { // Avoid compilation by loading an existing library - void* handle = - ( - !libPath.empty() && libs().open(libPath, false) - ? libs().findLibrary(libPath) - : nullptr - ); + void* handle = libs().open(libPath, false); if (!handle) { @@ -115,25 +110,9 @@ void* Foam::codedBase::loadLibrary // Manual execution of code after loading. // This is mandatory for codedBase. - void* rawSymbol = dlSymFind(handle, funcName); + const bool ok = libs().loadHook(handle, funcName, false); - if (rawSymbol) - { - loaderType fun = reinterpret_cast(rawSymbol); - - if (fun) - { - (*fun)(true); // force load - } - else - { - FatalIOErrorInFunction(context.dict()) - << "Failed symbol lookup " << funcName.c_str() << nl - << "from " << libPath << nl - << exit(FatalIOError); - } - } - else + if (!ok) { FatalIOErrorInFunction(context.dict()) << "Failed symbol lookup " << funcName.c_str() << nl @@ -160,12 +139,7 @@ void Foam::codedBase::unloadLibrary const dynamicCodeContext& context ) const { - void* handle = - ( - !libPath.empty() && libs().open(libPath, false) - ? libs().findLibrary(libPath) - : nullptr - ); + void* handle = libs().open(libPath, false); if (!handle) { @@ -175,23 +149,13 @@ void Foam::codedBase::unloadLibrary // Manual execution of code before unloading. // This is mandatory for codedBase. - void* rawSymbol = dlSymFind(handle, funcName); + const bool ok = libs().unloadHook(handle, funcName, false); - if (rawSymbol) + if (!ok) { - loaderType fun = reinterpret_cast(rawSymbol); - - if (fun) - { - (*fun)(false); // force unload - } - else - { - FatalIOErrorInFunction(context.dict()) - << "Failed symbol lookup " << funcName.c_str() << nl - << "from " << libPath << nl - << exit(FatalIOError); - } + IOWarningInFunction(context.dict()) + << "Failed looking up symbol " << funcName << nl + << "from " << libPath << nl; } if (!libs().close(libPath, false)) @@ -389,7 +353,7 @@ void Foam::codedBase::updateLibrary unloadLibrary ( oldLibPath_, - dynamicCode::libraryBaseName(oldLibPath_), + dlLibraryTable::basename(oldLibPath_), context ); diff --git a/src/OpenFOAM/db/dynamicLibrary/codedBase/codedBase.H b/src/OpenFOAM/db/dynamicLibrary/codedBase/codedBase.H index e0bae03e59..0892d7ed53 100644 --- a/src/OpenFOAM/db/dynamicLibrary/codedBase/codedBase.H +++ b/src/OpenFOAM/db/dynamicLibrary/codedBase/codedBase.H @@ -6,7 +6,7 @@ \\/ M anipulation | ------------------------------------------------------------------------------- Copyright (C) 2011-2016 OpenFOAM Foundation - Copyright (C) 2016-2019 OpenCFD Ltd. + Copyright (C) 2016-2020 OpenCFD Ltd. ------------------------------------------------------------------------------- License This file is part of OpenFOAM. @@ -49,6 +49,7 @@ SourceFiles #include "dictionary.H" #include "dynamicCodeContext.H" +#include "fileName.H" // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // @@ -75,13 +76,6 @@ class codedBase mutable fileName oldLibPath_; - // Data Types - - //- Global loader/unloader function type - // Called with true on load, false on unload. - typedef void (*loaderType)(bool); - - // Private Member Functions //- Load specified library and execute funcName(true) @@ -107,12 +101,6 @@ class codedBase const dynamicCodeContext& context ) const; - //- No copy construct - codedBase(const codedBase&) = delete; - - //- No copy assignment - void operator=(const codedBase&) = delete; - protected: @@ -148,7 +136,7 @@ protected: //- or use the codeDict() to generate one void updateLibrary(const word& name) const; - //- Get the loaded dynamic libraries + //- Mutable access to the loaded dynamic libraries virtual dlLibraryTable& libs() const = 0; //- Adapt the context for the current object @@ -168,6 +156,13 @@ protected: virtual const dictionary& codeDict() const = 0; + //- No copy construct + codedBase(const codedBase&) = delete; + + //- No copy assignment + void operator=(const codedBase&) = delete; + + public: //- Runtime type information @@ -176,7 +171,7 @@ public: // Constructors - //- Construct null + //- Default construct codedBase() = default; diff --git a/src/OpenFOAM/db/dynamicLibrary/dlLibraryTable/dlLibraryTable.C b/src/OpenFOAM/db/dynamicLibrary/dlLibraryTable/dlLibraryTable.C index 3fb1c99437..54b3feca21 100644 --- a/src/OpenFOAM/db/dynamicLibrary/dlLibraryTable/dlLibraryTable.C +++ b/src/OpenFOAM/db/dynamicLibrary/dlLibraryTable/dlLibraryTable.C @@ -29,7 +29,15 @@ License #include "dlLibraryTable.H" #include "OSspecific.H" #include "IOstreams.H" -#include "int.H" + +// Could be constexpr in the header if required +#ifdef __APPLE__ + #define EXT_SO "dylib" +#elif defined _WIN32 + #define EXT_SO "dll" +#else + #define EXT_SO "so" +#endif // * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * // @@ -38,6 +46,115 @@ namespace Foam defineTypeNameAndDebug(dlLibraryTable, 0); } +std::unique_ptr Foam::dlLibraryTable::global_(nullptr); + + +// * * * * * * * * * * * * * Static Member Functions * * * * * * * * * * * * // + +Foam::word Foam::dlLibraryTable::basename(const fileName& libPath) +{ + word libName(libPath.nameLessExt()); + libName.removeStart("lib"); // Remove leading 'lib' from name + return libName; +} + + +Foam::word Foam::dlLibraryTable::fullname(word libName) +{ + if (libName.empty()) + { + return libName; + } + + // Add leading 'lib' and trailing '.so' + return "lib" + libName.ext(EXT_SO); +} + + +Foam::dlLibraryTable& Foam::dlLibraryTable::libs() +{ + if (!global_) + { + global_.reset(new dlLibraryTable{}); + } + + return *global_; +} + + +bool Foam::dlLibraryTable::functionHook +( + const bool load, + void* handle, + const std::string& funcName, + const bool verbose, + const std::string& context +) +{ + if (!handle || funcName.empty()) + { + return false; + } + + bool ok = false; + + void* symbol = Foam::dlSymFind(handle, funcName); + + if (symbol) + { + // Execute loader/unloader code + try + { + loaderType fun = reinterpret_cast(symbol); + + if (fun) + { + (*fun)(load); + ok = true; + } + } + catch (...) + {} + } + + if (verbose && !ok) + { + auto& err = WarningInFunction + << "Failed symbol lookup " << funcName.c_str() << nl; + + if (!context.empty()) + { + err << "from " << context.c_str() << nl; + } + } + + return ok; +} + + +bool Foam::dlLibraryTable::loadHook +( + void* handle, + const std::string& funcName, + const bool verbose, + const std::string& context +) +{ + return functionHook(true, handle, funcName, verbose, context); +} + + +bool Foam::dlLibraryTable::unloadHook +( + void* handle, + const std::string& funcName, + const bool verbose, + const std::string& context +) +{ + return functionHook(false, handle, funcName, verbose, context); +} + // * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * // @@ -84,14 +201,39 @@ Foam::dlLibraryTable::dlLibraryTable Foam::dlLibraryTable::dlLibraryTable ( - const dictionary& dict, - const word& libsEntry + std::initializer_list libNames, + bool verbose ) { - dlLibraryTable::open(dict, libsEntry); + dlLibraryTable::open(libNames, verbose); } +Foam::dlLibraryTable::dlLibraryTable +( + const word& libsEntry, + const dictionary& dict, + bool verbose +) +{ + fileNameList libNames; + dict.readIfPresent(libsEntry, libNames); + dlLibraryTable::open(libNames, verbose); +} + + +Foam::dlLibraryTable::dlLibraryTable +( + const dictionary& dict, + const word& libsEntry, + bool verbose + +) +: + dlLibraryTable(libsEntry, dict, verbose) +{} + + // * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * // Foam::dlLibraryTable::~dlLibraryTable() @@ -132,6 +274,30 @@ Foam::label Foam::dlLibraryTable::size() const } +Foam::List Foam::dlLibraryTable::loaded() const +{ + List list(libNames_.size()); + + label nLoaded = 0; + + forAll(libNames_, i) + { + void* ptr = libPtrs_[i]; + const fileName& libName = libNames_[i]; + + if (ptr != nullptr && !libName.empty()) + { + list[nLoaded] = libName; + ++nLoaded; + } + } + + list.resize(nLoaded); + + return list; +} + + void Foam::dlLibraryTable::clear(bool verbose) { label nLoaded = 0; @@ -231,12 +397,14 @@ bool Foam::dlLibraryTable::open(bool verbose) forAll(libPtrs_, i) { + void* ptr = libPtrs_[i]; const fileName& libName = libNames_[i]; - if (libPtrs_[i] == nullptr && !libName.empty()) + if (ptr == nullptr && !libName.empty()) { ++nCand; - void* ptr = openLibrary(libName, verbose); + + ptr = openLibrary(libName, verbose); if (ptr) { @@ -260,6 +428,7 @@ void* Foam::dlLibraryTable::open bool verbose ) { + // Handles empty name silently void* ptr = openLibrary(libName, verbose); if (ptr) @@ -278,7 +447,34 @@ bool Foam::dlLibraryTable::open bool verbose ) { - label nOpen = 0; + decltype(libNames.size()) nOpen = 0; + + for (const fileName& libName : libNames) + { + const label index = libNames_.find(libName); + + if (index >= 0 && libPtrs_[index] != nullptr) + { + // Already known and opened + ++nOpen; + } + else if (dlLibraryTable::open(libName, verbose)) + { + ++nOpen; + } + } + + return nOpen && nOpen == libNames.size(); +} + + +bool Foam::dlLibraryTable::open +( + std::initializer_list libNames, + bool verbose +) +{ + decltype(libNames.size()) nOpen = 0; for (const fileName& libName : libNames) { @@ -307,13 +503,19 @@ bool Foam::dlLibraryTable::close { const label index = libNames_.rfind(libName); - if (index < 0) + if (index < 0 || libName.empty()) { return false; } void* ptr = libPtrs_[index]; + if (ptr == nullptr) + { + libNames_[index].clear(); + return false; + } + DebugInFunction << "Closing " << libName << " with handle " << Foam::name(ptr) << nl; @@ -323,7 +525,23 @@ bool Foam::dlLibraryTable::close libPtrs_[index] = nullptr; libNames_[index].clear(); - if (!ok && verbose) + if (ok) + { + // From man dlopen(3) + // ... + // a dynamically loaded shared object is not deallocated until + // dlclose() has been called on it as many times as dlopen() + // has succeeded on it. + + // Handle aliased library names + for (label idx = 0; (idx = libPtrs_.find(ptr, idx)) >= 0; ++idx) + { + (void) Foam::dlClose(ptr); + libPtrs_[idx] = nullptr; + libNames_[idx].clear(); + } + } + else if (verbose) { WarningInFunction << "Could not close " << libName << endl; @@ -337,7 +555,7 @@ void* Foam::dlLibraryTable::findLibrary(const fileName& libName) { const label index = libNames_.rfind(libName); - if (index < 0) + if (index < 0 || libName.empty()) { return nullptr; } @@ -346,26 +564,29 @@ void* Foam::dlLibraryTable::findLibrary(const fileName& libName) } +bool Foam::dlLibraryTable::open +( + const word& libsEntry, + const dictionary& dict, + bool verbose +) +{ + fileNameList libNames; + return + ( + dict.readIfPresent(libsEntry, libNames) + && dlLibraryTable::open(libNames, verbose) + ); +} + + bool Foam::dlLibraryTable::open ( const dictionary& dict, const word& libsEntry ) { - fileNameList libNames; - dict.readIfPresent(libsEntry, libNames); - - label nOpen = 0; - - for (const fileName& libName : libNames) - { - if (dlLibraryTable::open(libName)) // verbose = true - { - ++nOpen; - } - } - - return nOpen && nOpen == libNames.size(); + return dlLibraryTable::open(libsEntry, dict, true); // verbose = true } @@ -381,7 +602,7 @@ Foam::Ostream& Foam::operator<< os << token::BEGIN_LIST << nl; - // Lengths of pointers/names are guaranteed interally to be identical + // Lengths of pointers/names are guaranteed internally to be identical forAll(tbl.pointers(), i) { const void* ptr = tbl.pointers()[i]; diff --git a/src/OpenFOAM/db/dynamicLibrary/dlLibraryTable/dlLibraryTable.H b/src/OpenFOAM/db/dynamicLibrary/dlLibraryTable/dlLibraryTable.H index b48f02f322..a89df8f908 100644 --- a/src/OpenFOAM/db/dynamicLibrary/dlLibraryTable/dlLibraryTable.H +++ b/src/OpenFOAM/db/dynamicLibrary/dlLibraryTable/dlLibraryTable.H @@ -30,6 +30,10 @@ Class Description A table of dynamically loaded libraries. +SeeAlso + Foam::dlOpen + Foam::dlClose + SourceFiles dlLibraryTable.C dlLibraryTableTemplates.C @@ -40,7 +44,9 @@ SourceFiles #define dlLibraryTable_H #include "DynamicList.H" +#include "fileName.H" #include "InfoProxy.H" +#include // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // @@ -57,15 +63,35 @@ Ostream& operator<<(Ostream& os, const InfoProxy& info); class dlLibraryTable { + // Static Data + + //- Global singleton of dynamic libraries + static std::unique_ptr global_; + + // Private Data + //- Pointers to the loaded libraries DynamicList libPtrs_; + //- Names of loaded libraries, or of libraries to be loaded DynamicList libNames_; // Private Member Functions + //- Load/unload hook. + // \return true if the function was found and executed + static bool functionHook + ( + const bool load, //!< true = on-load, false = on-unload + void* handle, //!< library handle + const std::string& funcName, + const bool verbose, + const std::string& context + ); + + //- Open specified library name and return pointer. // Warning messages, but no additional side-effects. void* openLibrary(const fileName& libName, bool verbose); @@ -73,9 +99,17 @@ class dlLibraryTable public: - // Declare name of the class and its debug switch + // Public Data Types + + //- Global loader/unloader function type (C-linkage) + // Called with true on load, false on unload. + typedef void (*loaderType)(bool); + + + //- Declare name of the class and its debug switch ClassName("dlLibraryTable"); + // Generated Methods //- Default construct @@ -96,22 +130,82 @@ public: // Constructors - //- Open specified libraries. Ignores duplicate names. + //- Open specified libraries, warn by default if problems occur + // Ignores duplicate names. explicit dlLibraryTable ( const UList& libNames, bool verbose = true ); - //- Open all libraries listed in the 'libsEntry' entry in the - //- given dictionary. Verbose = true. - dlLibraryTable(const dictionary& dict, const word& libsEntry); + //- Open specified libraries, warn by default if problems occur + // Ignores duplicate names. + explicit dlLibraryTable + ( + std::initializer_list libNames, + bool verbose = true + ); + + //- Open libraries listed in 'libsEntry' entry in the dictionary, + //- warn by default if problems occur + dlLibraryTable + ( + const word& libsEntry, + const dictionary& dict, + bool verbose = true + ); + + //- Open libraries listed in 'libsEntry' entry in the dictionary, + //- warn by default if problems occur + dlLibraryTable + ( + const dictionary& dict, + const word& libsEntry, + bool verbose = true + ); //- Destructor. Closes all libraries loaded by the table. ~dlLibraryTable(); + // Static Member Functions + + //- Library basename without leading 'lib' or trailing '.so' + static word basename(const fileName& libPath); + + //- Library fullname, prefix with 'lib', suffix with '.so' + // \note the suffix is system-dependent + static word fullname(word libName); + + //- Table of global libraries + static dlLibraryTable& libs(); + + //- Low-level interface to execute global "void funcName(true)" + //- from the library, typically for additional loading. + // If called, it should be the first step after opening a library. + // \return true if the function was found and executed + static bool loadHook + ( + void* handle, + const std::string& funcName, + const bool verbose = false, + const std::string& context = "" //!< Calling context for warnings + ); + + //- Low-level interface to execute global "void funcName(false)" + //- from the library, typically for unloading. + // If called, it should be the last step before closing a library. + // \return true if the function was found and executed + static bool unloadHook + ( + void* handle, + const std::string& funcName, + const bool verbose = false, + const std::string& context = "" //!< Calling context for warnings + ); + + // Member Functions //- True if there are no libraries loaded by the table @@ -120,6 +214,9 @@ public: //- The number of libraries loaded by the table label size() const; + //- Names of the libraries in use + List loaded() const; + //- Names of the libraries in use, or requested const UList& names() const { @@ -147,21 +244,41 @@ public: //- These names will normally have been added with the append() method. bool open(bool verbose = true); - //- Open the named library, optionally warn if problems occur + //- Open the named library, warn by default if problems occur. + // An empty name is a silent no-op and always returns nullptr. + // \return a pointer to the library opened, or nullptr on failure. void* open(const fileName& libName, bool verbose = true); - //- Open the named libraries, optionally warn if problems occur + //- Open the named libraries, warn by default if problems occur. // Ignores duplicate names. bool open(const UList& libNames, bool verbose = true); + //- Open the named libraries, warn by default if problems occur. + // Ignores duplicate names. + bool open + ( + std::initializer_list libNames, + bool verbose = true + ); + //- Close the named library, optionally warn if problems occur + // Using an empty name is a no-op and always returns false. bool close(const fileName& libName, bool verbose = true); //- Find the handle of the named library + // Using an empty name is a no-op and always returns nullptr. void* findLibrary(const fileName& libName); - //- Open all libraries listed in the 'libsEntry' entry in the - //- given dictionary. + //- Open libraries listed in the 'libsEntry' entry in the dictionary. + bool open + ( + const word& libsEntry, + const dictionary& dict, + bool verbose = true + ); + + //- Open libraries listed in the 'libsEntry' entry in the dictionary. + // Verbose = true bool open(const dictionary& dict, const word& libsEntry); //- Open all libraries listed in the 'libsEntry' entry in the @@ -172,7 +289,8 @@ public: ( const dictionary& dict, const word& libsEntry, - const TablePtr& tablePtr + const TablePtr& tablePtr, + bool verbose = true ); diff --git a/src/OpenFOAM/db/dynamicLibrary/dlLibraryTable/dlLibraryTableTemplates.C b/src/OpenFOAM/db/dynamicLibrary/dlLibraryTable/dlLibraryTableTemplates.C index ff39cebf17..8c558acf8b 100644 --- a/src/OpenFOAM/db/dynamicLibrary/dlLibraryTable/dlLibraryTableTemplates.C +++ b/src/OpenFOAM/db/dynamicLibrary/dlLibraryTable/dlLibraryTableTemplates.C @@ -6,7 +6,7 @@ \\/ M anipulation | ------------------------------------------------------------------------------- Copyright (C) 2011-2015 OpenFOAM Foundation - Copyright (C) 2018 OpenCFD Ltd. + Copyright (C) 2018-2020 OpenCFD Ltd. ------------------------------------------------------------------------------- License This file is part of OpenFOAM. @@ -28,7 +28,6 @@ License #include "dlLibraryTable.H" #include "dictionary.H" -#include "fileNameList.H" // * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // @@ -37,23 +36,24 @@ bool Foam::dlLibraryTable::open ( const dictionary& dict, const word& libsEntry, - const TablePtr& tablePtr + const TablePtr& tablePtr, + bool verbose ) { - fileNameList libNames; + List libNames; dict.readIfPresent(libsEntry, libNames); label nOpen = 0; for (const fileName& libName : libNames) { - const label nEntries = (tablePtr ? tablePtr->size() : 0); + const label nEntries = (tablePtr ? tablePtr->size() : -1); - if (dlLibraryTable::open(libName)) + if (dlLibraryTable::open(libName, verbose)) { ++nOpen; - if (debug && (!tablePtr || tablePtr->size() <= nEntries)) + if (debug && tablePtr != nullptr && tablePtr->size() <= nEntries) { WarningInFunction << "library " << libName @@ -61,12 +61,6 @@ bool Foam::dlLibraryTable::open << nl << endl; } } - else - { - WarningInFunction - << "Could not open library " << libName - << nl << endl; - } } return nOpen && nOpen == libNames.size(); diff --git a/src/OpenFOAM/db/dynamicLibrary/dynamicCode/dynamicCode.C b/src/OpenFOAM/db/dynamicLibrary/dynamicCode/dynamicCode.C index d5bc748266..23941dc0e4 100644 --- a/src/OpenFOAM/db/dynamicLibrary/dynamicCode/dynamicCode.C +++ b/src/OpenFOAM/db/dynamicLibrary/dynamicCode/dynamicCode.C @@ -6,7 +6,7 @@ \\/ M anipulation | ------------------------------------------------------------------------------- Copyright (C) 2011-2016 OpenFOAM Foundation - Copyright (C) 2016-2019 OpenCFD Ltd. + Copyright (C) 2016-2020 OpenCFD Ltd. ------------------------------------------------------------------------------- License This file is part of OpenFOAM. @@ -28,6 +28,7 @@ License #include "dynamicCode.H" #include "dynamicCodeContext.H" +#include "dlLibraryTable.H" #include "argList.H" #include "stringOps.H" #include "Fstream.H" @@ -37,15 +38,6 @@ License #include "dictionary.H" #include "foamVersion.H" -#ifdef __APPLE__ - #define EXT_SO ".dylib" -#elif defined _WIN32 - #define EXT_SO ".dll" -#else - #define EXT_SO ".so" -#endif - - // * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * // int Foam::dynamicCode::allowSystemOperations @@ -103,14 +95,6 @@ void Foam::dynamicCode::checkSecurity } -Foam::word Foam::dynamicCode::libraryBaseName(const fileName& libPath) -{ - word libName(libPath.nameLessExt()); - libName.removeStart("lib"); // Remove leading 'lib' from name - return libName; -} - - // * * * * * * * * * * * * Protected Member Functions * * * * * * * * * * * // void Foam::dynamicCode::copyAndFilter @@ -157,7 +141,7 @@ bool Foam::dynamicCode::resolveTemplates DynamicList& badFiles ) { - // Try to get template from FOAM_CODESTREAM_TEMPLATES + // Try to get template from FOAM_CODE_TEMPLATES const fileName templateDir(Foam::getEnv(codeTemplateEnvName)); bool allOkay = true; @@ -328,13 +312,13 @@ Foam::fileName Foam::dynamicCode::codeRelPath() const Foam::fileName Foam::dynamicCode::libPath() const { - return codeRoot_/libSubDir_/"lib" + codeName_ + EXT_SO; + return codeRoot_/libSubDir_/dlLibraryTable::fullname(codeName_); } Foam::fileName Foam::dynamicCode::libRelPath() const { - return codeRelPath()/libSubDir_/"lib" + codeName_ + EXT_SO; + return codeRelPath()/libSubDir_/dlLibraryTable::fullname(codeName_); } @@ -514,16 +498,10 @@ bool Foam::dynamicCode::wmakeLibso() const // cmd[0] = stringOps::expand("$WM_PROJECT_DIR/wmake/wmake"); // This can take a bit longer, so report that we are starting wmake + // Even with details turned off, we want some feedback - if (Foam::infoDetailLevel > 0) - { - Info<< "Invoking wmake libso " << this->codePath().c_str() << endl; - } - else - { - // Even with details turned off, we want some feedback - Serr<< "Invoking wmake libso " << this->codePath().c_str() << endl; - } + OSstream& os = (Foam::infoDetailLevel > 0 ? Info : Serr); + os << "Invoking wmake libso " << this->codePath().c_str() << endl; if (Foam::system(cmd) == 0) { diff --git a/src/OpenFOAM/db/dynamicLibrary/dynamicCode/dynamicCode.H b/src/OpenFOAM/db/dynamicLibrary/dynamicCode/dynamicCode.H index 486ae3ee17..438219b505 100644 --- a/src/OpenFOAM/db/dynamicLibrary/dynamicCode/dynamicCode.H +++ b/src/OpenFOAM/db/dynamicLibrary/dynamicCode/dynamicCode.H @@ -6,7 +6,7 @@ \\/ M anipulation | ------------------------------------------------------------------------------- Copyright (C) 2011 OpenFOAM Foundation - Copyright (C) 2019 OpenCFD Ltd. + Copyright (C) 2019-2020 OpenCFD Ltd. ------------------------------------------------------------------------------- License This file is part of OpenFOAM. @@ -47,7 +47,7 @@ SourceFiles namespace Foam { -// Forward declarations +// Forward Declarations class dynamicCodeContext; class ISstream; class OSstream; @@ -60,10 +60,12 @@ class SHA1Digest; class dynamicCode { public: + typedef Tuple2 fileAndContent; private: - // Private data + + // Private Data //- Root for dynamic code compilation fileName codeRoot_; @@ -104,7 +106,7 @@ private: protected: - // Static data members + // Static Data Members //- Root of the LIB target for Make/files static const char* const libTargetRoot; @@ -151,7 +153,7 @@ protected: public: - // Static data members + // Static Data Members //- Name of the code template environment variable // Used to located the codeTemplateName @@ -170,15 +172,12 @@ public: //- Check security for creating dynamic code static void checkSecurity(const char* title, const dictionary&); - //- Return the library basename without leading 'lib' or trailing '.so' - static word libraryBaseName(const fileName& libPath); - // Constructors //- Construct for a specified code name and code directory name // Defaults to using the code name for the code directory name - dynamicCode + explicit dynamicCode ( const word& codeName, const word& codeDirName = "" diff --git a/src/OpenFOAM/db/functionObjects/functionObject/functionObject.C b/src/OpenFOAM/db/functionObjects/functionObject/functionObject.C index d4cd1c4e50..edabdf8d0a 100644 --- a/src/OpenFOAM/db/functionObjects/functionObject/functionObject.C +++ b/src/OpenFOAM/db/functionObjects/functionObject/functionObject.C @@ -83,7 +83,7 @@ Foam::autoPtr Foam::functionObject::New if (finder.found()) { - const_cast(runTime).libs().open + runTime.libs().open ( dict, finder.ref().keyword(), @@ -93,7 +93,7 @@ Foam::autoPtr Foam::functionObject::New } // This is the simplified version without compatibility messages - // const_cast(runTime).libs().open + // runTime.libs().open // ( // dict, // "libs", diff --git a/src/OpenFOAM/db/functionObjects/functionObjectList/functionObjectList.C b/src/OpenFOAM/db/functionObjects/functionObjectList/functionObjectList.C index 1fe141879a..1c3e756098 100644 --- a/src/OpenFOAM/db/functionObjects/functionObjectList/functionObjectList.C +++ b/src/OpenFOAM/db/functionObjects/functionObjectList/functionObjectList.C @@ -771,7 +771,7 @@ bool Foam::functionObjectList::read() addProfiling(fo, "functionObjects::read"); - const_cast(time_).libs().open + time_.libs().open ( functionsDict, "libs", diff --git a/src/OpenFOAM/fields/pointPatchFields/derived/codedFixedValue/codedFixedValuePointPatchField.C b/src/OpenFOAM/fields/pointPatchFields/derived/codedFixedValue/codedFixedValuePointPatchField.C index 5c62d6a56b..d6e38e9f56 100644 --- a/src/OpenFOAM/fields/pointPatchFields/derived/codedFixedValue/codedFixedValuePointPatchField.C +++ b/src/OpenFOAM/fields/pointPatchFields/derived/codedFixedValue/codedFixedValuePointPatchField.C @@ -66,7 +66,7 @@ const template Foam::dlLibraryTable& Foam::codedFixedValuePointPatchField::libs() const { - return const_cast(this->db().time().libs()); + return this->db().time().libs(); } diff --git a/src/OpenFOAM/fields/pointPatchFields/derived/codedFixedValue/codedFixedValuePointPatchField.H b/src/OpenFOAM/fields/pointPatchFields/derived/codedFixedValue/codedFixedValuePointPatchField.H index c650221279..451361c6c1 100644 --- a/src/OpenFOAM/fields/pointPatchFields/derived/codedFixedValue/codedFixedValuePointPatchField.H +++ b/src/OpenFOAM/fields/pointPatchFields/derived/codedFixedValue/codedFixedValuePointPatchField.H @@ -106,7 +106,7 @@ class codedFixedValuePointPatchField public fixedValuePointPatchField, protected codedBase { - // Private data + // Private Data //- Dictionary contents for the boundary condition mutable dictionary dict_; @@ -120,7 +120,7 @@ class codedFixedValuePointPatchField const IOdictionary& dict() const; - //- Get the loaded dynamic libraries + //- Mutable access to the loaded dynamic libraries virtual dlLibraryTable& libs() const; //- Adapt the context for the current object diff --git a/src/OpenFOAM/global/argList/argList.C b/src/OpenFOAM/global/argList/argList.C index 1984b16c7f..eae9002067 100644 --- a/src/OpenFOAM/global/argList/argList.C +++ b/src/OpenFOAM/global/argList/argList.C @@ -854,8 +854,8 @@ Foam::argList::argList if (strcmp(optName, "lib") == 0) { // The '-lib' option: - // Append name(s) to libs_ for later opening - libs_.append(this->getList(argi)); + // Append name(s) to libs for later opening + libs().append(this->getList(argi)); } else if (strcmp(optName, "debug-switch") == 0) { @@ -1066,8 +1066,8 @@ void Foam::argList::parse jobInfo.add("foamBuild", build); } - // Load additional libraries - libs_.open(bannerEnabled()); + // Load additional libraries (verbosity according to banner setting) + libs().open(bannerEnabled()); } @@ -1253,7 +1253,7 @@ void Foam::argList::parse // Disable any parallel comms happening inside the fileHandler // since we are on master. This can happen e.g. inside - // the masterUncollated/collated handler. + // the masterUncollated/collated handler. const bool oldParRun = Pstream::parRun(); Pstream::parRun() = false; diff --git a/src/OpenFOAM/global/argList/argList.H b/src/OpenFOAM/global/argList/argList.H index 38dd63fea7..75ffd9dbef 100644 --- a/src/OpenFOAM/global/argList/argList.H +++ b/src/OpenFOAM/global/argList/argList.H @@ -142,7 +142,7 @@ class argList HashTable options_; //- Additional libraries - dlLibraryTable libs_; + mutable dlLibraryTable libs_; word executable_; fileName rootPath_; @@ -346,11 +346,8 @@ public: //- Return the ParRunControl inline const ParRunControl& parRunControl() const; - //- Access to the loaded libraries - inline const dlLibraryTable& libs() const; - - //- Access to the loaded libraries - inline dlLibraryTable& libs(); + //- Mutable access to the loaded dynamic libraries + inline dlLibraryTable& libs() const; //- The number of arguments inline label size() const noexcept; diff --git a/src/OpenFOAM/global/argList/argListI.H b/src/OpenFOAM/global/argList/argListI.H index 6e78c3afa4..ed6f1fe59c 100644 --- a/src/OpenFOAM/global/argList/argListI.H +++ b/src/OpenFOAM/global/argList/argListI.H @@ -6,7 +6,7 @@ \\/ M anipulation | ------------------------------------------------------------------------------- Copyright (C) 2011-2013 OpenFOAM Foundation - Copyright (C) 2017-2019 OpenCFD Ltd. + Copyright (C) 2017-2020 OpenCFD Ltd. ------------------------------------------------------------------------------- License This file is part of OpenFOAM. @@ -112,13 +112,7 @@ inline const Foam::ParRunControl& Foam::argList::parRunControl() const } -inline const Foam::dlLibraryTable& Foam::argList::libs() const -{ - return libs_; -} - - -inline Foam::dlLibraryTable& Foam::argList::libs() +inline Foam::dlLibraryTable& Foam::argList::libs() const { return libs_; } diff --git a/src/OpenFOAM/matrices/lduMatrix/solvers/GAMG/GAMGAgglomerations/GAMGAgglomeration/GAMGAgglomeration.C b/src/OpenFOAM/matrices/lduMatrix/solvers/GAMG/GAMGAgglomerations/GAMGAgglomeration/GAMGAgglomeration.C index fcdea118cb..28a7cf8349 100644 --- a/src/OpenFOAM/matrices/lduMatrix/solvers/GAMG/GAMGAgglomerations/GAMGAgglomeration/GAMGAgglomeration.C +++ b/src/OpenFOAM/matrices/lduMatrix/solvers/GAMG/GAMGAgglomerations/GAMGAgglomeration/GAMGAgglomeration.C @@ -308,7 +308,7 @@ const Foam::GAMGAgglomeration& Foam::GAMGAgglomeration::New controlDict.getOrDefault("agglomerator", "faceAreaPair") ); - const_cast(mesh.thisDb().time()).libs().open + mesh.thisDb().time().libs().open ( controlDict, "geometricGAMGAgglomerationLibs", @@ -362,7 +362,7 @@ const Foam::GAMGAgglomeration& Foam::GAMGAgglomeration::New controlDict.getOrDefault("agglomerator", "faceAreaPair") ); - const_cast(mesh.thisDb().time()).libs().open + mesh.thisDb().time().libs().open ( controlDict, "algebraicGAMGAgglomerationLibs", @@ -408,7 +408,7 @@ Foam::autoPtr Foam::GAMGAgglomeration::New controlDict.getOrDefault("agglomerator", "faceAreaPair") ); - const_cast(mesh.thisDb().time()).libs().open + mesh.thisDb().time().libs().open ( controlDict, "geometricGAMGAgglomerationLibs", diff --git a/src/dynamicFvMesh/dynamicFvMesh/dynamicFvMeshNew.C b/src/dynamicFvMesh/dynamicFvMesh/dynamicFvMeshNew.C index 8b85cbb172..c1c8e7409d 100644 --- a/src/dynamicFvMesh/dynamicFvMesh/dynamicFvMeshNew.C +++ b/src/dynamicFvMesh/dynamicFvMesh/dynamicFvMeshNew.C @@ -58,7 +58,7 @@ Foam::autoPtr Foam::dynamicFvMesh::New(const IOobject& io) Info<< "Selecting dynamicFvMesh " << modelType << endl; - const_cast(io.time()).libs().open + io.time().libs().open ( dict, "dynamicFvMeshLibs", diff --git a/src/dynamicMesh/motionSolvers/displacement/codedPoints0/codedPoints0MotionSolver.C b/src/dynamicMesh/motionSolvers/displacement/codedPoints0/codedPoints0MotionSolver.C index 00d7950235..9f91588cde 100644 --- a/src/dynamicMesh/motionSolvers/displacement/codedPoints0/codedPoints0MotionSolver.C +++ b/src/dynamicMesh/motionSolvers/displacement/codedPoints0/codedPoints0MotionSolver.C @@ -89,7 +89,7 @@ void Foam::codedPoints0MotionSolver::prepare Foam::dlLibraryTable& Foam::codedPoints0MotionSolver::libs() const { - return const_cast(mesh().time()).libs(); + return mesh().time().libs(); } diff --git a/src/dynamicMesh/motionSolvers/displacement/codedPoints0/codedPoints0MotionSolver.H b/src/dynamicMesh/motionSolvers/displacement/codedPoints0/codedPoints0MotionSolver.H index f5fcc800c3..47afa827fd 100644 --- a/src/dynamicMesh/motionSolvers/displacement/codedPoints0/codedPoints0MotionSolver.H +++ b/src/dynamicMesh/motionSolvers/displacement/codedPoints0/codedPoints0MotionSolver.H @@ -103,7 +103,7 @@ protected: // Protected Member Functions - //- Get the loaded dynamic libraries + //- Mutable access to the loaded dynamic libraries virtual dlLibraryTable& libs() const; //- Adapt the context for the current object diff --git a/src/dynamicMesh/motionSolvers/displacement/displacement/displacementMotionSolver.C b/src/dynamicMesh/motionSolvers/displacement/displacement/displacementMotionSolver.C index aa45b6ec2a..3217fff6a1 100644 --- a/src/dynamicMesh/motionSolvers/displacement/displacement/displacementMotionSolver.C +++ b/src/dynamicMesh/motionSolvers/displacement/displacement/displacementMotionSolver.C @@ -94,7 +94,7 @@ Foam::displacementMotionSolver::New { Info<< "Selecting motion solver: " << solverTypeName << endl; - const_cast(mesh.time()).libs().open + mesh.time().libs().open ( solverDict, "motionSolverLibs", diff --git a/src/dynamicMesh/motionSolvers/motionSolver/motionSolver.C b/src/dynamicMesh/motionSolvers/motionSolver/motionSolver.C index d255a3ada1..097f766100 100644 --- a/src/dynamicMesh/motionSolvers/motionSolver/motionSolver.C +++ b/src/dynamicMesh/motionSolvers/motionSolver/motionSolver.C @@ -116,7 +116,7 @@ Foam::autoPtr Foam::motionSolver::New Info<< "Selecting motion solver: " << solverName << nl; - const_cast(mesh.time()).libs().open + mesh.time().libs().open ( solverDict, "motionSolverLibs", diff --git a/src/finiteVolume/cfdTools/general/fvOptions/fvOption.C b/src/finiteVolume/cfdTools/general/fvOptions/fvOption.C index a98f83db1f..e905a5ff52 100644 --- a/src/finiteVolume/cfdTools/general/fvOptions/fvOption.C +++ b/src/finiteVolume/cfdTools/general/fvOptions/fvOption.C @@ -79,7 +79,7 @@ Foam::autoPtr Foam::fv::option::New Info<< indent << "Selecting finite volume options type " << modelType << endl; - const_cast(mesh.time()).libs().open + mesh.time().libs().open ( coeffs, "libs", diff --git a/src/finiteVolume/expressions/base/fvExprDriver.C b/src/finiteVolume/expressions/base/fvExprDriver.C index 2cd6623292..b363296dc4 100644 --- a/src/finiteVolume/expressions/base/fvExprDriver.C +++ b/src/finiteVolume/expressions/base/fvExprDriver.C @@ -112,7 +112,6 @@ Foam::expressions::fvExprDriver::fvExprDriver storedVariables_(), specialVariablesIndex_(-1), otherMeshName_(), - libs_(), writer_(nullptr) {} @@ -128,7 +127,6 @@ Foam::expressions::fvExprDriver::fvExprDriver storedVariables_(rhs.storedVariables_), specialVariablesIndex_(rhs.specialVariablesIndex_), otherMeshName_(), - libs_(), writer_(nullptr) {} @@ -165,12 +163,15 @@ bool Foam::expressions::fvExprDriver::readDict { expressions::exprDriver::readDict(dict); - // wordList plugins; + // fileNameList plugins; // if (dict.readIfPresent("functionPlugins", plugins)) // { - // for (const word& plugin : plugins) + // for (const fileName& libName : plugins) // { - // libs_.open("libswak" + plugin + "FunctionPlugin.so"); + // this->runTime().libs().open + // ( + // "libswak" + libName + "FunctionPlugin" // verbose = true + // ); // } // } diff --git a/src/finiteVolume/expressions/base/fvExprDriver.H b/src/finiteVolume/expressions/base/fvExprDriver.H index dd1d5aec04..e532636b2d 100644 --- a/src/finiteVolume/expressions/base/fvExprDriver.H +++ b/src/finiteVolume/expressions/base/fvExprDriver.H @@ -69,7 +69,6 @@ SourceFiles #include "pointMesh.H" #include "volFields.H" #include "topoSetSource.H" -#include "dlLibraryTable.H" #include "runTimeSelectionTables.H" // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // @@ -118,9 +117,6 @@ class fvExprDriver //- The name of the other mesh (if it is to be required) word otherMeshName_; - //- Additional libraries - dlLibraryTable libs_; - //- Writing and restoring autoPtr writer_; diff --git a/src/finiteVolume/fields/fvPatchFields/derived/codedFixedValue/codedFixedValueFvPatchField.C b/src/finiteVolume/fields/fvPatchFields/derived/codedFixedValue/codedFixedValueFvPatchField.C index 09740bbbbd..bf82722232 100644 --- a/src/finiteVolume/fields/fvPatchFields/derived/codedFixedValue/codedFixedValueFvPatchField.C +++ b/src/finiteVolume/fields/fvPatchFields/derived/codedFixedValue/codedFixedValueFvPatchField.C @@ -66,7 +66,7 @@ const Foam::IOdictionary& Foam::codedFixedValueFvPatchField::dict() const template Foam::dlLibraryTable& Foam::codedFixedValueFvPatchField::libs() const { - return const_cast(this->db().time().libs()); + return this->db().time().libs(); } diff --git a/src/finiteVolume/fields/fvPatchFields/derived/codedFixedValue/codedFixedValueFvPatchField.H b/src/finiteVolume/fields/fvPatchFields/derived/codedFixedValue/codedFixedValueFvPatchField.H index 3e05751b7e..992cc77a08 100644 --- a/src/finiteVolume/fields/fvPatchFields/derived/codedFixedValue/codedFixedValueFvPatchField.H +++ b/src/finiteVolume/fields/fvPatchFields/derived/codedFixedValue/codedFixedValueFvPatchField.H @@ -121,7 +121,7 @@ class codedFixedValueFvPatchField const IOdictionary& dict() const; - //- Get the loaded dynamic libraries + //- Mutable access to the loaded dynamic libraries virtual dlLibraryTable& libs() const; //- Adapt the context for the current object diff --git a/src/finiteVolume/fields/fvPatchFields/derived/codedMixed/codedMixedFvPatchField.C b/src/finiteVolume/fields/fvPatchFields/derived/codedMixed/codedMixedFvPatchField.C index 7b2c9e8607..ad721c0b37 100644 --- a/src/finiteVolume/fields/fvPatchFields/derived/codedMixed/codedMixedFvPatchField.C +++ b/src/finiteVolume/fields/fvPatchFields/derived/codedMixed/codedMixedFvPatchField.C @@ -65,7 +65,7 @@ const Foam::IOdictionary& Foam::codedMixedFvPatchField::dict() const template Foam::dlLibraryTable& Foam::codedMixedFvPatchField::libs() const { - return const_cast(this->db().time().libs()); + return this->db().time().libs(); } diff --git a/src/finiteVolume/fields/fvPatchFields/derived/codedMixed/codedMixedFvPatchField.H b/src/finiteVolume/fields/fvPatchFields/derived/codedMixed/codedMixedFvPatchField.H index 07d8abdd64..cf941e0906 100644 --- a/src/finiteVolume/fields/fvPatchFields/derived/codedMixed/codedMixedFvPatchField.H +++ b/src/finiteVolume/fields/fvPatchFields/derived/codedMixed/codedMixedFvPatchField.H @@ -104,7 +104,7 @@ SourceFiles namespace Foam { -// Forward declaration of classes +// Forward Declarations class dynamicCode; class dynamicCodeContext; class IOdictionary; @@ -119,7 +119,7 @@ class codedMixedFvPatchField public mixedFvPatchField, public codedBase { - // Private data + // Private Data //- Dictionary contents for the boundary condition mutable dictionary dict_; @@ -133,7 +133,12 @@ class codedMixedFvPatchField const IOdictionary& dict() const; - //- Get the loaded dynamic libraries + +protected: + + // Protected Member Functions + + //- Mutable access to the loaded dynamic libraries virtual dlLibraryTable& libs() const; //- Adapt the context for the current object diff --git a/src/functionObjects/utilities/codedFunctionObject/codedFunctionObject.C b/src/functionObjects/utilities/codedFunctionObject/codedFunctionObject.C index 8e2fe43451..d96810f03b 100644 --- a/src/functionObjects/utilities/codedFunctionObject/codedFunctionObject.C +++ b/src/functionObjects/utilities/codedFunctionObject/codedFunctionObject.C @@ -96,7 +96,7 @@ void Foam::functionObjects::codedFunctionObject::prepare Foam::dlLibraryTable& Foam::functionObjects::codedFunctionObject::libs() const { - return const_cast(time_).libs(); + return time_.libs(); } diff --git a/src/functionObjects/utilities/codedFunctionObject/codedFunctionObject.H b/src/functionObjects/utilities/codedFunctionObject/codedFunctionObject.H index c0914e2031..8d10c295af 100644 --- a/src/functionObjects/utilities/codedFunctionObject/codedFunctionObject.H +++ b/src/functionObjects/utilities/codedFunctionObject/codedFunctionObject.H @@ -60,6 +60,7 @@ Usage #{ // Lookup U const volVectorField& U = mesh().lookupObject("U"); + // Write mag(U)().write(); #}; @@ -99,7 +100,7 @@ class codedFunctionObject { protected: - // Protected data + // Protected Data //- Input dictionary dictionary dict_; @@ -118,7 +119,7 @@ protected: // Protected Member Functions - //- Get the loaded dynamic libraries + //- Mutable access to the loaded dynamic libraries virtual dlLibraryTable& libs() const; //- Adapt the context for the current object diff --git a/src/fvOptions/sources/general/codedSource/CodedSource.C b/src/fvOptions/sources/general/codedSource/CodedSource.C index 72f4137d84..9998e8a8b7 100644 --- a/src/fvOptions/sources/general/codedSource/CodedSource.C +++ b/src/fvOptions/sources/general/codedSource/CodedSource.C @@ -87,7 +87,7 @@ void Foam::fv::CodedSource::prepare template Foam::dlLibraryTable& Foam::fv::CodedSource::libs() const { - return const_cast(mesh_.time()).libs(); + return mesh_.time().libs(); } diff --git a/src/fvOptions/sources/general/codedSource/CodedSource.H b/src/fvOptions/sources/general/codedSource/CodedSource.H index 592e1bc40a..2d488f9433 100644 --- a/src/fvOptions/sources/general/codedSource/CodedSource.H +++ b/src/fvOptions/sources/general/codedSource/CodedSource.H @@ -126,7 +126,6 @@ class CodedSource public cellSetOption, protected codedBase { - protected: // Protected Data @@ -143,7 +142,7 @@ protected: // Protected Member Functions - //- Get the loaded dynamic libraries + //- Mutable access to the loaded dynamic libraries virtual dlLibraryTable& libs() const; //- Adapt the context for the current object diff --git a/src/meshTools/PatchFunction1/CodedField/CodedField.C b/src/meshTools/PatchFunction1/CodedField/CodedField.C index 0ab0fc4b17..d09455f7a0 100644 --- a/src/meshTools/PatchFunction1/CodedField/CodedField.C +++ b/src/meshTools/PatchFunction1/CodedField/CodedField.C @@ -27,16 +27,13 @@ License #include "dynamicCode.H" -// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * // +// * * * * * * * * * * * * Protected Member Functions * * * * * * * * * * * // template Foam::dlLibraryTable& Foam::PatchFunction1Types::CodedField::libs() const { - const dlLibraryTable& timeLibs = - this->patch_.boundaryMesh().mesh().time().libs(); - - return const_cast(timeLibs); + return this->patch_.boundaryMesh().mesh().time().libs(); } diff --git a/src/meshTools/PatchFunction1/CodedField/CodedField.H b/src/meshTools/PatchFunction1/CodedField/CodedField.H index d79bfc605f..27666ecdb6 100644 --- a/src/meshTools/PatchFunction1/CodedField/CodedField.H +++ b/src/meshTools/PatchFunction1/CodedField/CodedField.H @@ -88,7 +88,7 @@ namespace PatchFunction1Types { /*---------------------------------------------------------------------------*\ - Class CodedField Declaration + Class CodedField Declaration \*---------------------------------------------------------------------------*/ template @@ -109,7 +109,15 @@ class CodedField // Private Member Functions - //- Get the loaded dynamic libraries + //- Get reference to the underlying Function1 + const PatchFunction1& redirectFunction() const; + + +protected: + + // Protected Member Functions + + //- Mutable access to the loaded dynamic libraries virtual dlLibraryTable& libs() const; //- Adapt the context for the current object @@ -121,9 +129,6 @@ class CodedField // Clear the ptr to the redirected object virtual void clearRedirect() const; - //- Get reference to the underlying Function1 - const PatchFunction1& redirectFunction() const; - // Get the (sub)dictionary to initialize the codeContext virtual const dictionary& codeDict(const dictionary& fullDict) const;