Skip to content

Commit 5064333

Browse files
authored
Merge pull request #34 from SCIP-Interfaces/rs/memleak
deal with memory leaks, by implementing finalizer and MPB's `freemodel!`
2 parents 29a3f51 + ac6da83 commit 5064333

File tree

3 files changed

+21
-4
lines changed

3 files changed

+21
-4
lines changed

src/mpb_interface.jl

+8-1
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,14 @@ numvar(m::SCIPMathProgModel) = _getNumVars(m)
1818
"The number of proper constraints, excluding those from lazy callbacks."
1919
numconstr(m::SCIPMathProgModel) = _getNumConss(m)
2020

21-
freemodel!(m::SCIPMathProgModel) = error("Not implemented for SCIP.jl!")
21+
function freemodel!(m::SCIPMathProgModel)
22+
if m.inner.ptr_model != C_NULL
23+
# call finalizer directly
24+
freescip(m.inner)
25+
else
26+
Base.warn_once("Tried to free already freed model, ignoring.")
27+
end
28+
end
2229

2330
# TODO: mapping for :SemiCont, :SemiInt
2431
const vartypemap = Dict{Symbol, Cint}(

src/types.jl

+11-1
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,21 @@ type SCIPModel
1313
# TODO: check return code (everywhere!)
1414
ccall((:CSIPcreateModel, libcsip), Cint, (Ptr{Ptr{Void}}, ), _arr)
1515
m = new(_arr[1], options)
16-
# QUESTION: Why is _arr not garbage-collected?
16+
@assert m.ptr_model != C_NULL
17+
18+
finalizer(m, freescip)
1719
return m
1820
end
1921
end
2022

23+
function freescip(m::SCIPModel)
24+
# avoid double free
25+
if m.ptr_model != C_NULL
26+
_freeModel(m)
27+
m.ptr_model = C_NULL
28+
end
29+
end
30+
2131
# Linear Quadratic Model
2232

2333
type SCIPLinearQuadraticModel <: AbstractLinearQuadraticModel

src/wrapper.jl

+2-2
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,8 @@ function _patchVersion()
1010
ccall((:CSIPpatchVersion, libcsip), Cint, ())
1111
end
1212

13-
function _freeModel(model::SCIPMathProgModel)
14-
ccall((:CSIPfreeModel, libcsip), Cint, (Ptr{Void}, ), model.inner.ptr_model)
13+
function _freeModel(inner::SCIPModel)
14+
ccall((:CSIPfreeModel, libcsip), Cint, (Ptr{Void}, ), inner.ptr_model)
1515
end
1616

1717
function _addVar(model::SCIPMathProgModel, lowerbound::Cdouble,

0 commit comments

Comments
 (0)