diff --git a/docs/src/reference/advanced.md b/docs/src/reference/advanced.md index 77cf76eca..3ebbe2d8c 100644 --- a/docs/src/reference/advanced.md +++ b/docs/src/reference/advanced.md @@ -37,9 +37,9 @@ MPI.infoval ## Error handler objects ```@docs -MPI.Errhandler -MPI.get_errorhandler -MPI.set_errorhandler! +MPI.ErrorHandler +MPI.get_error_handler +MPI.set_error_handler! ``` ## Miscellaneous diff --git a/src/MPI.jl b/src/MPI.jl index fd0485cfa..ed2632dc5 100644 --- a/src/MPI.jl +++ b/src/MPI.jl @@ -91,7 +91,7 @@ include("collective.jl") include("topology.jl") include("onesided.jl") include("io.jl") -include("errhandler.jl") +include("errorhandler.jl") include("mpiexec_wrapper.jl") include("deprecated.jl") diff --git a/src/deprecated.jl b/src/deprecated.jl index a0ea33d6f..279525e4c 100644 --- a/src/deprecated.jl +++ b/src/deprecated.jl @@ -235,3 +235,7 @@ import Base: @deprecate dims .= Dims_create(nnodes, dims), false) @deprecate(Cart_coords!(comm::Comm, rank::Integer, coords::MPIBuffertype{Cint}), coords .= Cart_coords(comm, rank), false) + +@deprecate(get_errorhandler(obj), get_errorhandler(obj), false) +@deprecate(set_errorhandler!(obj, errhandler), set_errorhandler!(obj, errhandler), false) +@deprecate(Errhandler(args...), ErrorHandler(args...), false) diff --git a/src/errhandler.jl b/src/errhandler.jl deleted file mode 100644 index 9ad300a1d..000000000 --- a/src/errhandler.jl +++ /dev/null @@ -1,88 +0,0 @@ -""" - MPI.Errhandler - -An MPI error handler object. Currently only two are supported: - -- `ERRORS_ARE_FATAL` (default): program will immediately abort -- `ERRORS_RETURN`: program will throw an `MPIError`. -""" -mutable struct Errhandler - val::MPI_Errhandler -end -Base.:(==)(a::Errhandler, b::Errhandler) = a.val == b.val -Base.cconvert(::Type{MPI_Errhandler}, errhandler::Errhandler) = errhandler -Base.unsafe_convert(::Type{MPI_Errhandler}, errhandler::Errhandler) = errhandler.val -Base.unsafe_convert(::Type{Ptr{MPI_Errhandler}}, errhandler::Errhandler) = convert(Ptr{MPI_Errhandler}, pointer_from_objref(errhandler)) - -const ERRHANDLER_NULL = Errhandler(Consts.MPI_ERRHANDLER_NULL[]) -const ERRORS_ARE_FATAL = Errhandler(Consts.MPI_ERRORS_ARE_FATAL[]) -const ERRORS_RETURN = Errhandler(Consts.MPI_ERRORS_RETURN[] ) -add_load_time_hook!(() -> ERRHANDLER_NULL.val = Consts.MPI_ERRHANDLER_NULL[] ) -add_load_time_hook!(() -> ERRORS_ARE_FATAL.val = Consts.MPI_ERRORS_ARE_FATAL[]) -add_load_time_hook!(() -> ERRORS_RETURN.val = Consts.MPI_ERRORS_RETURN[] ) - -Errhandler() = Errhandler(ERRHANDLER_NULL.val) - -function free(errh::Errhandler) - if errh != ERRHANDLER_NULL && errh != ERRORS_ARE_FATAL && errh != ERRORS_RETURN && !Finalized() - # int MPI_Errhandler_free(MPI_Errhandler *errhandler) - @mpichk ccall((:MPI_Errhandler_free, libmpi), Cint, (Ptr{MPI_Errhandler},), errh) - end - return nothing -end - -function set_default_error_handler_return() - set_errorhandler!(COMM_SELF, ERRORS_RETURN) - set_errorhandler!(COMM_WORLD, ERRORS_RETURN) -end - -""" - MPI.get_errorhandler(comm::MPI.Comm) - MPI.get_errorhandler(win::MPI.Win) - MPI.get_errorhandler(file::MPI.File.FileHandle) - -Get the current [`Errhandler`](@ref) for the relevant MPI object. - -# See also -- [`set_errorhandler!`](@ref) -""" -function get_errorhandler(comm::Comm) - errh = Errhandler() - @mpichk ccall((:MPI_Comm_get_errhandler, libmpi), Cint, (MPI_Comm, Ptr{MPI_Errhandler}), comm, errh) - return errh -end -function get_errorhandler(win::Win) - errh = Errhandler() - @mpichk ccall((:MPI_Win_get_errhandler, libmpi), Cint, (MPI_Win, Ptr{MPI_Errhandler}), win, errh) - return errh -end -function get_errorhandler(file::File.FileHandle) - errh = Errhandler() - @mpichk ccall((:MPI_File_get_errhandler, libmpi), Cint, (MPI_File, Ptr{MPI_Errhandler}), file, errh) - return errh -end - -""" - MPI.set_errorhandler!(comm::MPI.Comm, errh::Errhandler) - MPI.set_errorhandler!(win::MPI.Win, errh::Errhandler) - MPI.set_errorhandler!(file::MPI.File.FileHandle, errh::Errhandler) - -Set the [`Errhandler`](@ref) for the relevant MPI object. - -# See also -- [`get_errorhandler`](@ref) -""" -function set_errorhandler!(comm::Comm, errh::Errhandler) - @mpichk ccall((:MPI_Comm_set_errhandler, libmpi), Cint, (MPI_Comm, MPI_Errhandler), comm, errh) - return nothing -end -function set_errorhandler!(win::Win, errh::Errhandler) - @mpichk ccall((:MPI_Win_set_errhandler, libmpi), Cint, (MPI_Win, MPI_Errhandler), win, errh) - return nothing -end -function set_errorhandler!(file::File.FileHandle, errh::Errhandler) - @mpichk ccall((:MPI_File_set_errhandler, libmpi), Cint, (MPI_File, MPI_Errhandler), file, errh) - return nothing -end - - diff --git a/src/errorhandler.jl b/src/errorhandler.jl new file mode 100644 index 000000000..a8404e867 --- /dev/null +++ b/src/errorhandler.jl @@ -0,0 +1,88 @@ +""" + MPI.ErrorHandler + +An MPI error handler object. Currently only two are supported: + +- `ERRORS_ARE_FATAL` (default): program will immediately abort +- `ERRORS_RETURN`: program will throw an `MPIError`. +""" +mutable struct ErrorHandler + val::MPI_Errhandler +end +Base.:(==)(a::ErrorHandler, b::ErrorHandler) = a.val == b.val +Base.cconvert(::Type{MPI_Errhandler}, errhandler::ErrorHandler) = errhandler +Base.unsafe_convert(::Type{MPI_Errhandler}, errhandler::ErrorHandler) = errhandler.val +Base.unsafe_convert(::Type{Ptr{MPI_ErrorHandler}}, errhandler::ErrorHandler) = convert(Ptr{MPI_Errhandler}, pointer_from_objref(errhandler)) + +const ERRHANDLER_NULL = ErrorHandler(Consts.MPI_ERRHANDLER_NULL[]) +const ERRORS_ARE_FATAL = ErrorHandler(Consts.MPI_ERRORS_ARE_FATAL[]) +const ERRORS_RETURN = ErrorHandler(Consts.MPI_ERRORS_RETURN[] ) +add_load_time_hook!(() -> ERRHANDLER_NULL.val = Consts.MPI_ERRHANDLER_NULL[] ) +add_load_time_hook!(() -> ERRORS_ARE_FATAL.val = Consts.MPI_ERRORS_ARE_FATAL[]) +add_load_time_hook!(() -> ERRORS_RETURN.val = Consts.MPI_ERRORS_RETURN[] ) + +ErrorHandler() = ErrorHandler(ERRHANDLER_NULL.val) + +function free(errh::ErrorHandler) + if errh != ERRHANDLER_NULL && errh != ERRORS_ARE_FATAL && errh != ERRORS_RETURN && !Finalized() + # int MPI_Errhandler_free(MPI_Errhandler *errhandler) + @mpichk ccall((:MPI_Errhandler_free, libmpi), Cint, (Ptr{MPI_Errhandler},), errh) + end + return nothing +end + +function set_default_error_handler_return() + set_error_handler!(COMM_SELF, ERRORS_RETURN) + set_error_handler!(COMM_WORLD, ERRORS_RETURN) +end + +""" + MPI.get_error_handler(comm::MPI.Comm) + MPI.get_error_handler(win::MPI.Win) + MPI.get_error_handler(file::MPI.File.FileHandle) + +Get the current [`ErrorHandler`](@ref) for the relevant MPI object. + +# See also +- [`set_error_handler!`](@ref) +""" +function get_error_handler(comm::Comm) + errh = ErrorHandler() + @mpichk ccall((:MPI_Comm_get_errhandler, libmpi), Cint, (MPI_Comm, Ptr{MPI_Errhandler}), comm, errh) + return errh +end +function get_error_handler(win::Win) + errh = ErrorHandler() + @mpichk ccall((:MPI_Win_get_errhandler, libmpi), Cint, (MPI_Win, Ptr{MPI_Errhandler}), win, errh) + return errh +end +function get_error_handler(file::File.FileHandle) + errh = ErrorHandler() + @mpichk ccall((:MPI_File_get_errhandler, libmpi), Cint, (MPI_File, Ptr{MPI_Errhandler}), file, errh) + return errh +end + +""" + MPI.set_error_handler!(comm::MPI.Comm, errh::ErrorHandler) + MPI.set_error_handler!(win::MPI.Win, errh::ErrorHandler) + MPI.set_error_handler!(file::MPI.File.FileHandle, errh::ErrorHandler) + +Set the [`ErrorHandler`](@ref) for the relevant MPI object. + +# See also +- [`get_error_handler`](@ref) +""" +function set_error_handler!(comm::Comm, errh::ErrorHandler) + @mpichk ccall((:MPI_Comm_set_errhandler, libmpi), Cint, (MPI_Comm, MPI_Errhandler), comm, errh) + return nothing +end +function set_error_handler!(win::Win, errh::ErrorHandler) + @mpichk ccall((:MPI_Win_set_errhandler, libmpi), Cint, (MPI_Win, MPI_Errhandler), win, errh) + return nothing +end +function set_error_handler!(file::File.FileHandle, errh::ErrorHandler) + @mpichk ccall((:MPI_File_set_errhandler, libmpi), Cint, (MPI_File, MPI_Errhandler), file, errh) + return nothing +end + + diff --git a/test/test_errorhandler.jl b/test/test_errorhandler.jl index 8bb8fe9e7..f4f21b8fd 100644 --- a/test/test_errorhandler.jl +++ b/test/test_errorhandler.jl @@ -2,9 +2,9 @@ using MPI, Test MPI.Init() @test MPI.ERRORS_ARE_FATAL != MPI.ERRORS_RETURN -@test MPI.get_errorhandler(MPI.COMM_SELF) == MPI.ERRORS_RETURN +@test MPI.get_error_handler(MPI.COMM_SELF) == MPI.ERRORS_RETURN @test_throws MPI.MPIError MPI.Send(rand(10), 2, 0, MPI.COMM_SELF) -MPI.set_errorhandler!(MPI.COMM_SELF, MPI.ERRORS_ARE_FATAL) -@test MPI.get_errorhandler(MPI.COMM_SELF) == MPI.ERRORS_ARE_FATAL +MPI.set_error_handler!(MPI.COMM_SELF, MPI.ERRORS_ARE_FATAL) +@test MPI.get_error_handler(MPI.COMM_SELF) == MPI.ERRORS_ARE_FATAL