Skip to content

Commit 7542c72

Browse files
andreasnoackKristofferC
authored andcommitted
Add custom deserialize method for UmfpackLU to avoid memory leak (#30425)
Fixes #15450 (cherry picked from commit 356ceee)
1 parent 8c2ef25 commit 7542c72

File tree

3 files changed

+34
-2
lines changed

3 files changed

+34
-2
lines changed

stdlib/SuiteSparse/Project.toml

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,14 @@ uuid = "4607b0f0-06f3-5cda-b6b1-a6196a1729e9"
44
[deps]
55
Libdl = "8f399da3-3557-5675-b5ff-fb832c97cbdb"
66
LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e"
7+
Serialization = "9e88b42a-f829-5b0c-bbe9-9e923198166b"
78
SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf"
89

910
[extras]
10-
Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40"
11-
Random = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c"
1211
DelimitedFiles = "8bb1440f-4735-579b-a4ab-409b98df4dab"
12+
Random = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c"
1313
Serialization = "9e88b42a-f829-5b0c-bbe9-9e923198166b"
14+
Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40"
1415

1516
[targets]
1617
test = ["Test", "Random", "DelimitedFiles", "Serialization"]

stdlib/SuiteSparse/src/umfpack.jl

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@ import LinearAlgebra: Factorization, det, lu, ldiv!
1111
using SparseArrays
1212
import SparseArrays: nnz
1313

14+
import Serialization: AbstractSerializer, deserialize
15+
1416
import ..increment, ..increment!, ..decrement, ..decrement!
1517

1618
include("umfpack_h.jl")
@@ -192,6 +194,22 @@ function show(io::IO, F::UmfpackLU)
192194
F.numeric != C_NULL && print(io, '\n', F.numeric)
193195
end
194196

197+
function deserialize(s::AbstractSerializer, t::Type{UmfpackLU{Tv,Ti}}) where {Tv,Ti}
198+
symbolic = deserialize(s)
199+
numeric = deserialize(s)
200+
m = deserialize(s)
201+
n = deserialize(s)
202+
colptr = deserialize(s)
203+
rowval = deserialize(s)
204+
nzval = deserialize(s)
205+
status = deserialize(s)
206+
obj = UmfpackLU{Tv,Ti}(symbolic, numeric, m, n, colptr, rowval, nzval, status)
207+
208+
finalizer(umfpack_free_symbolic, obj)
209+
210+
return obj
211+
end
212+
195213
## Wrappers for UMFPACK functions
196214

197215
# generate the name of the C function according to the value and integer types

stdlib/SuiteSparse/test/umfpack.jl

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
# This file is a part of Julia. License is MIT: https://julialang.org/license
22

33
using SuiteSparse: increment!
4+
using Serialization
45
using LinearAlgebra: Adjoint, Transpose, SingularException
56

67
@testset "UMFPACK wrappers" begin
@@ -176,4 +177,16 @@ using LinearAlgebra: Adjoint, Transpose, SingularException
176177
end
177178
end
178179

180+
@testset "deserialization" begin
181+
A = sprandn(10, 10, 0.4)
182+
F1 = lu(A)
183+
b = IOBuffer()
184+
serialize(b, F1)
185+
seekstart(b)
186+
F2 = deserialize(b)
187+
for nm in (:colptr, :m, :n, :nzval, :rowval, :status)
188+
@test getfield(F1, nm) == getfield(F2, nm)
189+
end
190+
end
191+
179192
end

0 commit comments

Comments
 (0)