On Thu, Feb 11, 2016 at 1:59 PM, Gabriel Goh <[email protected]> wrote:
> Let's say I have a program which returns
>
> data = ccall(getcfunction())
>
> data is a pointer to a C-struct,
>
> dataload = unsafe_load(data)
>
> which in turn contains a field a which is a 2D array, a pointer to some
> pointers of size 4, say.
>
> julia> pointer_to_array(dataload.a,4)
> Ptr{Node} @0x3b8f66c0
> Ptr{Node} @0x3b8f66f0
> Ptr{Node} @0x3b8f6750
> Ptr{Node} @0x3b8f6810
>
> Each pointer has an array of size 2. So this is a 4x2 2 dimensional array
>
> julia> [pointer_to_array(L,2) for L in pointer_to_array(dataload.a,4)]
> [Node(1,9.424044618506457),Node(2,11.88905969931336)]
> [Node(1,9.678805056283334),Node(2,9.845676112951852)]
> [Node(1,8.210282978159183),Node(2,11.911456933936952)]
> [Node(1,11.916394646460297),Node(2,10.57806221488004)]
>
> My problem is that the data the second pointers are pointing to seems to be
> invisible to the garbage collector, and gets corrupted once in a while.
>
> Turning off garbage collection seems to fix the problem, and forcing more
> garbage collections increase the severity of it.
>
> Is there an easy way to "tell" julia that I want this whole struct
> untouched?

I assume by "the second pointers" you mean the memory pointed to by
`L` in the code above. If that is the case, the question is how is the
memory they are pointing to being managed. Are they allocated by the C
function and needs to be manually free'd (and when are you freeing it
now) or are they pointing to a julia buffer you allocate?

>
> Thanks!
>
> Gabe

Reply via email to