diff --git a/CMakeLists.txt b/CMakeLists.txt index 7037c72..6ca8172 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -20,7 +20,7 @@ # ------------------------------------------------------------------------ # cmake_minimum_required (VERSION 3.8.0) project (PFLOGGER - VERSION 1.4.0 + VERSION 1.4.2 LANGUAGES Fortran) set (CMAKE_MODULE_PATH diff --git a/ChangeLog.md b/ChangeLog.md index 6de515f..772e4f8 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -7,6 +7,24 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +## [1.4.2] - 2020-05-20 + +### Changed + +- Modified name of Pair type in gFTL maps. These are not used within + pFlogger outside of their host modules, but it is more consistent with + the latest gFTL-shared and may help anyone that tries to port with XLF. + + +## [1.4.1] - 2020-05-01 + +### Added +- Added free() methods to various classes to ensure that MPI resources + are deleted at the end of the run. Without this, some MPI flavors + will report an error on MPI_Finalize(). To use: + + call logging%free + ## [1.4.0] - 2020-04-17 ### Added diff --git a/src/AbstractHandler.F90 b/src/AbstractHandler.F90 index 140fbc1..386caf6 100644 --- a/src/AbstractHandler.F90 +++ b/src/AbstractHandler.F90 @@ -44,6 +44,7 @@ module PFL_AbstractHandler procedure :: handle procedure(close), deferred :: close procedure(flush), deferred :: flush + procedure(free), deferred :: free procedure :: set_formatter procedure :: format procedure :: set_level @@ -80,6 +81,11 @@ subroutine flush(this) class(AbstractHandler), intent(in) :: this end subroutine flush + subroutine free(this) + import AbstractHandler + class(AbstractHandler), intent(inout) :: this + end subroutine free + logical function equal(a, b) import AbstractHandler class (AbstractHandler), intent(in) :: a diff --git a/src/AbstractLogger.F90 b/src/AbstractLogger.F90 index fcd1c81..6e4a289 100644 --- a/src/AbstractLogger.F90 +++ b/src/AbstractLogger.F90 @@ -17,6 +17,15 @@ module PFL_AbstractLogger public :: AbstractLogger type, abstract, extends(Filterer) :: AbstractLogger + contains + procedure :: free end type AbstractLogger +contains + +! no op + subroutine free(this) + class(AbstractLogger), intent(inout) :: this + end subroutine free + end module PFL_AbstractLogger diff --git a/src/FileHandler.F90 b/src/FileHandler.F90 index a51c2c9..5291fbf 100644 --- a/src/FileHandler.F90 +++ b/src/FileHandler.F90 @@ -37,6 +37,7 @@ module PFL_FileHandler procedure :: equal procedure :: set_lock procedure :: is_lockable + procedure :: free end type FileHandler interface FileHandler @@ -275,4 +276,14 @@ subroutine set_lock(this, lock) end subroutine set_lock + subroutine free(this) + class (FileHandler), intent(inout) :: this + + if (this%is_lockable()) then + call this%lock%destroy() + deallocate(this%lock) + end if + + end subroutine free + end module PFL_FileHandler diff --git a/src/Logger.F90 b/src/Logger.F90 index 7737a08..13b3d18 100644 --- a/src/Logger.F90 +++ b/src/Logger.F90 @@ -70,6 +70,7 @@ module PFL_Logger procedure :: get_parent procedure :: set_propagate procedure :: get_propagate + procedure :: free end type Logger interface Logger @@ -171,6 +172,21 @@ subroutine add_handler(this, handler) end subroutine add_handler + subroutine free(this) + class (Logger), intent(inout) :: this + class (AbstractHandler), pointer :: handler + + type (HandlerVectorIterator) :: iter + + iter = this%handlers%begin() + do while (iter /= this%handlers%end()) + handler => iter%get() + call handler%free() + call iter%next() + end do + + end subroutine free + !--------------------------------------------------------------------------- !*ROUTINE: remove_handler @@ -181,10 +197,13 @@ subroutine remove_handler(this, handler) class (Logger), intent(inout) :: this class (AbstractHandler), intent(in) :: handler + class (AbstractHandler), pointer :: hdlerPtr integer :: i i = this%handlers%get_index(handler) if (i > 0) then + hdlerPtr=>this%handlers%at(i) + call hdlerPtr%free() call this%handlers%erase(this%handlers%begin() + i - 1) else ! Only can get here if handler not found diff --git a/src/LoggerManager.F90 b/src/LoggerManager.F90 index 0d8e884..1dd32a7 100644 --- a/src/LoggerManager.F90 +++ b/src/LoggerManager.F90 @@ -54,6 +54,7 @@ module PFL_LoggerManager procedure :: build_root_logger procedure :: basic_config + procedure :: free end type LoggerManager @@ -487,4 +488,22 @@ subroutine basic_config(this, unusable, filename, level, stream, force, handlers end subroutine basic_config + subroutine free(this) + class(LoggerManager), intent(inout) :: this + character(len=:), allocatable :: name + type(LoggerIterator) :: iter + class(AbstractLogger), pointer :: loggerPtr + + iter = this%loggers%begin() + do while (iter /= this%loggers%end()) + name = iter%key() + loggerPtr=> this%loggers%at(name) + call loggerPtr%free() + call iter%next() + enddo + + call this%root_node%free() + + end subroutine free + end module PFL_LoggerManager diff --git a/src/MpiLock.F90 b/src/MpiLock.F90 index a1116cb..96471df 100644 --- a/src/MpiLock.F90 +++ b/src/MpiLock.F90 @@ -1,3 +1,6 @@ +! Based upon +! http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.113.30&rep=rep1&type=pdf + module PFL_MpiLock use mpi use PFL_AbstractLock @@ -182,7 +185,8 @@ subroutine destroy(this) call MPI_Free_mem(scratchpad, ierror) end if - call MPI_Comm_free(this%comm, ierror) + !W.J comment out. Does this comm belong to this lock? Maybe not + !call MPI_Comm_free(this%comm, ierror) end subroutine destroy diff --git a/src/StreamHandler.F90 b/src/StreamHandler.F90 index 7e014ba..a79f895 100644 --- a/src/StreamHandler.F90 +++ b/src/StreamHandler.F90 @@ -36,6 +36,7 @@ module PFL_StreamHandler procedure :: set_unit procedure :: emit_message procedure :: close ! noop + procedure :: free ! noop procedure :: flush => flush_unit procedure :: equal end type StreamHandler @@ -143,6 +144,11 @@ subroutine close(this) class (StreamHandler), intent(inout) :: this end subroutine close + ! A no-op routine. + !--------------------------------------------------------------------------- + subroutine free(this) + class (StreamHandler), intent(inout) :: this + end subroutine free !--------------------------------------------------------------------------- ! FUNCTION: diff --git a/src/StringAbstractLoggerPolyMap.F90 b/src/StringAbstractLoggerPolyMap.F90 index 297d646..0c97553 100644 --- a/src/StringAbstractLoggerPolyMap.F90 +++ b/src/StringAbstractLoggerPolyMap.F90 @@ -14,12 +14,14 @@ module PFL_StringAbstractLoggerPolyMap #define _map LoggerMap #define _iterator LoggerIterator +#define _pair StringLoggerPair #include "types/key_deferredLengthString.inc" #define _value class(AbstractLogger) #define _value_allocatable #define _value_equal_defined + #define _alt #define _pair_allocatable #include "templates/map.inc" diff --git a/src/StringFilterMap.F90 b/src/StringFilterMap.F90 index 1e7718d..41b3d48 100644 --- a/src/StringFilterMap.F90 +++ b/src/StringFilterMap.F90 @@ -12,6 +12,7 @@ module PFL_StringFilterMap use PFL_AbstractFilter #define _map FilterMap +#define _pair FilterPair #define _iterator FilterIterator #include "types/key_deferredLengthString.inc" diff --git a/src/StringFormatterMap.F90 b/src/StringFormatterMap.F90 index 3778389..0ccb9ab 100644 --- a/src/StringFormatterMap.F90 +++ b/src/StringFormatterMap.F90 @@ -12,6 +12,7 @@ module PFL_StringFormatterMap use PFL_Formatter #define _map FormatterMap +#define _pair FormatterPair #define _iterator FormatterIterator #include "types/key_deferredLengthString.inc" diff --git a/src/StringHandlerMap.F90 b/src/StringHandlerMap.F90 index fe50e71..6edac42 100644 --- a/src/StringHandlerMap.F90 +++ b/src/StringHandlerMap.F90 @@ -12,6 +12,7 @@ module PFL_StringHandlerMap use PFL_AbstractHandler #define _map HandlerMap +#define _pair HandlerPair #define _iterator HandlerIterator #include "types/key_deferredLengthString.inc" diff --git a/src/StringLockMap.F90 b/src/StringLockMap.F90 index a420cd2..4279228 100644 --- a/src/StringLockMap.F90 +++ b/src/StringLockMap.F90 @@ -12,6 +12,7 @@ module PFL_StringLockMap use PFL_AbstractLock #define _map LockMap +#define _pair LockPair #define _iterator LockIterator #include "types/key_deferredLengthString.inc" diff --git a/tests/MockHandler.F90 b/tests/MockHandler.F90 index 3f2e0da..08fed63 100644 --- a/tests/MockHandler.F90 +++ b/tests/MockHandler.F90 @@ -23,6 +23,7 @@ module MockHandler_mod contains procedure :: emit_message procedure :: close ! noop + procedure :: free ! noop procedure :: flush => flushUnit procedure :: equal end type MockHandler @@ -72,6 +73,9 @@ subroutine close(this) class (MockHandler), intent(inout) :: this end subroutine close + subroutine free(this) + class(MockHandler), intent(inout) :: this + end subroutine free logical function equal(a, b) class (MockHandler), intent(in) :: a