From 9063047b1185fb3e0592f91c55c8088ddb96d427 Mon Sep 17 00:00:00 2001 From: Fredrik Ekre Date: Thu, 24 Apr 2025 16:42:13 +0200 Subject: [PATCH] Delete lock interface implementation from UmfpackLU --- src/solvers/umfpack.jl | 47 ++++++++++++++---------------------------- test/umfpack.jl | 2 -- 2 files changed, 16 insertions(+), 33 deletions(-) diff --git a/src/solvers/umfpack.jl b/src/solvers/umfpack.jl index 6e35ef95..b267f0b6 100644 --- a/src/solvers/umfpack.jl +++ b/src/solvers/umfpack.jl @@ -263,9 +263,11 @@ has_refinement(F::UmfpackLU) = has_refinement(F.control) has_refinement(control::AbstractVector) = control[JL_UMFPACK_IRSTEP] > 0 # auto magick resize, should this only expand and not shrink? -getworkspace(F::UmfpackLU) = @lock F.lock begin - return resize!(F.workspace, F, has_refinement(F); expand_only=true) +function getworkspace(F::UmfpackLU) + @lock F.lock begin + return resize!(F.workspace, F, has_refinement(F); expand_only = true) end +end UmfpackWS(F::UmfpackLU{Tv, Ti}, refinement::Bool=has_refinement(F)) where {Tv, Ti} = UmfpackWS( Vector{Ti}(undef, size(F, 2)), @@ -297,29 +299,12 @@ Base.copy(F::T, ws=UmfpackWS(F)) where {T <: ATLU} = Base.transpose(F::UmfpackLU) = TransposeFactorization(F) -function Base.lock(f::Function, F::UmfpackLU) - lock(F) - try - f() - finally - unlock(F) - end -end -Base.lock(F::UmfpackLU) = if !trylock(F.lock) - @info """waiting for UmfpackLU's lock, it's safe to ignore this message. - see the documentation for Umfpack""" maxlog = 1 - lock(F.lock) -end - -@inline Base.trylock(F::UmfpackLU) = trylock(F.lock) -@inline Base.unlock(F::UmfpackLU) = unlock(F.lock) - show_umf_ctrl(F::UmfpackLU, level::Real=2.0) = - @lock F show_umf_ctrl(F.control, level) + @lock F.lock show_umf_ctrl(F.control, level) show_umf_info(F::UmfpackLU, level::Real=2.0) = - @lock F show_umf_info(F.control, F.info, level) + @lock F.lock show_umf_info(F.control, F.info, level) """ @@ -598,7 +583,7 @@ for itype in UmfpackIndexTypes @eval begin function umfpack_symbolic!(U::UmfpackLU{Float64,$itype}, q::Union{Nothing, StridedVector{$itype}}) _isnotnull(U.symbolic) && return U - @lock U begin + @lock U.lock begin tmp = Ref{Ptr{Cvoid}}(C_NULL) if q === nothing @isok $sym_r(U.m, U.n, U.colptr, U.rowval, U.nzval, tmp, U.control, U.info) @@ -613,7 +598,7 @@ for itype in UmfpackIndexTypes end function umfpack_symbolic!(U::UmfpackLU{ComplexF64,$itype}, q::Union{Nothing, StridedVector{$itype}}) _isnotnull(U.symbolic) && return U - @lock U begin + @lock U.lock begin tmp = Ref{Ptr{Cvoid}}(C_NULL) if q === nothing @isok $sym_c(U.m, U.n, U.colptr, U.rowval, real(U.nzval), imag(U.nzval), tmp, @@ -627,7 +612,7 @@ for itype in UmfpackIndexTypes return U end function umfpack_numeric!(U::UmfpackLU{Float64,$itype}; reuse_numeric=true, q=nothing) - @lock U begin + @lock U.lock begin (reuse_numeric && _isnotnull(U.numeric)) && return U if _isnull(U.symbolic) umfpack_symbolic!(U, q) @@ -643,7 +628,7 @@ for itype in UmfpackIndexTypes return U end function umfpack_numeric!(U::UmfpackLU{ComplexF64,$itype}; reuse_numeric=true, q=nothing) - @lock U begin + @lock U.lock begin (reuse_numeric && _isnotnull(U.numeric)) && return U _isnull(U.symbolic) && umfpack_symbolic!(U, q) tmp = Ref{Ptr{Cvoid}}(C_NULL) @@ -672,7 +657,7 @@ for itype in UmfpackIndexTypes if workspace_W_size(lu) > length(workspace.W) throw(ArgumentError("W should be larger than `workspace_W_size(Af)`")) end - @lock lu begin + @lock lu.lock begin umfpack_numeric!(lu) (size(b, 1) == lu.m) && (size(b) == size(x)) || throw(DimensionMismatch()) @@ -697,7 +682,7 @@ for itype in UmfpackIndexTypes if workspace_W_size(lu) > length(workspace.W) throw(ArgumentError("W should be larger than `workspace_W_size(Af)`")) end - @lock lu begin + @lock lu.lock begin umfpack_numeric!(lu) (size(b, 1) == lu.m) && (size(b) == size(x)) || throw(DimensionMismatch()) @isok $wsol_c(typ, lu.colptr, lu.rowval, lu.nzval, C_NULL, x, C_NULL, b, @@ -707,14 +692,14 @@ for itype in UmfpackIndexTypes end function det(lu::UmfpackLU{Float64,$itype}) mx = Ref{Float64}(zero(Float64)) - @lock lu @isok($det_r(mx, C_NULL, lu.numeric, lu.info)) + @lock lu.lock @isok($det_r(mx, C_NULL, lu.numeric, lu.info)) mx[] end function det(lu::UmfpackLU{ComplexF64,$itype}) mx = Ref{Float64}(zero(Float64)) mz = Ref{Float64}(zero(Float64)) - @lock lu @isok($det_z(mx, mz, C_NULL, lu.numeric, lu.info)) + @lock lu.lock @isok($det_z(mx, mz, C_NULL, lu.numeric, lu.info)) complex(mx[], mz[]) end function logabsdet(F::UmfpackLU{T, $itype}) where {T<:Union{Float64,ComplexF64}} # return log(abs(det)) and sign(det) @@ -1030,7 +1015,7 @@ for Tv in (:Float64, :ComplexF64), Ti in UmfpackIndexTypes _report_symbolic = Symbol(umf_nm("report_symbolic", Tv, Ti)) @eval umfpack_report_symbolic(lu::UmfpackLU{$Tv,$Ti}, level::Real=4; q=nothing) = - @lock lu begin + @lock lu.lock begin umfpack_symbolic!(lu, q) old_prl = lu.control[JL_UMFPACK_PRL] lu.control[JL_UMFPACK_PRL] = level @@ -1040,7 +1025,7 @@ for Tv in (:Float64, :ComplexF64), Ti in UmfpackIndexTypes end _report_numeric = Symbol(umf_nm("report_numeric", Tv, Ti)) @eval umfpack_report_numeric(lu::UmfpackLU{$Tv,$Ti}, level::Real=4; q=nothing) = - @lock lu begin + @lock lu.lock begin umfpack_numeric!(lu; q) old_prl = lu.control[JL_UMFPACK_PRL] lu.control[JL_UMFPACK_PRL] = level diff --git a/test/umfpack.jl b/test/umfpack.jl index a00c4aca..59dc9041 100644 --- a/test/umfpack.jl +++ b/test/umfpack.jl @@ -124,8 +124,6 @@ end umfpack_report(Af) Af1 = lu!(copy(Af)) umfpack_report(Af1) - @test trylock(Af) - @test trylock(Af1) end @testset "test similar" begin