From 17275060c9e80147aa80ec1271bc10d72a27897b Mon Sep 17 00:00:00 2001
From: Mathieu Faverge <mathieu.faverge@inria.fr>
Date: Wed, 30 Sep 2020 15:41:19 +0200
Subject: [PATCH] Fix the double free issue by using the C allocated array

---
 wrappers/julia/spm_user.jl | 14 ++++++--------
 1 file changed, 6 insertions(+), 8 deletions(-)

diff --git a/wrappers/julia/spm_user.jl b/wrappers/julia/spm_user.jl
index ec389061..98282a87 100755
--- a/wrappers/julia/spm_user.jl
+++ b/wrappers/julia/spm_user.jl
@@ -45,7 +45,6 @@ n    = dim1 * dim2 * dim3
 nnz  = (2*(dim1)-1) * dim2 * dim3 + (dim2-1)*dim1*dim3 + dim2*dim1*(dim3-1)
 
 #Create the spm out of the internal data
-
 spm.spmInit( Aptr )
 A.mtxtype = spm.SpmSymmetric
 A.flttype = spm.SpmDouble
@@ -55,11 +54,14 @@ A.nnz     = nnz
 A.dof     = 1
 
 spm.spmUpdateComputedFields( Aptr )
+
+# Allocate the arrays of the spm through C functions
 spm.spmAlloc( Aptr )
 
-row = zeros( spm.spm_int_t, nnz )
-col = zeros( spm.spm_int_t, nnz )
-val = zeros( Cdouble, nnz )
+# Get the pointer to the allocated arrays
+row = unsafe_wrap(Array, A.rowptr, A.nnzexp, own = false)
+col = unsafe_wrap(Array, A.colptr, A.nnzexp, own = false)
+val = unsafe_wrap(Array{Cdouble,1}, convert( Ptr{Cdouble}, A.values ), A.nnzexp, own = false)
 
 m = 1
 for i in 1:dim1
@@ -115,10 +117,6 @@ if m != nnz+1
     println( "m ", m, "nnz ", nnz )
 end
 
-A.colptr = pointer( col )
-A.rowptr = pointer( row )
-A.values = pointer( val )
-
 A2 = spm.spmatrix_t( zero )
 A2ptr = Ptr{spm.spmatrix_t}( pointer_from_objref(A2) )
 rc = spm.spmCheckAndCorrect( Aptr, A2ptr )
-- 
GitLab