On Wed, Jul 3, 2019 at 1:32 PM K.S. Bhaskar <ksbhas...@gmail.com> wrote:
>
> https://github.com/golang/go/issues/13347#issuecomment-158568326 seems to 
> suggest runtime.KeepAlive() is not needed but it does not seem definitive.
>
> If there is a function such as the one below (from 
> https://gitlab.com/YottaDB/Lang/YDBGo/blob/47f5960d03b2c00ae33222ec1d3bdc60a98226c1/buffer_t.go#L151)
>  in an application that has Go structures with pointers to C structures and 
> which uses Finalizers to free the C structures when the Go structures are 
> collected, is the runtime.KeepAlive(ibuft) required to guarantee that ibuft 
> is never collected by the Go garbage collector until after the return from 
> Free()?
>
> // Calls C.free on any C memory owned by this internalBuffer
>
> func (ibuft *internalBufferT) Free() {
>
>         printEntry("internalBufferT.Free()")
>
>         if nil == ibuft {
>
>                return
>
>         }
>
>         cbuftptr := ibuft.cbuft
>
>         if nil != cbuftptr {
>
>                // ydb_buffer_t block exists - free its buffer first if it 
> exists
>
>                if nil != cbuftptr.buf_addr {
>
>                        C.free(unsafe.Pointer(cbuftptr.buf_addr))
>
>                }
>
>                C.free(unsafe.Pointer(cbuftptr))
>
>                ibuft.cbuft = nil
>
>         }
>
>         runtime.KeepAlive(ibuft)

In the exact code I don't think the runtime.KeepAlive is needed,
because the assignment "ibuft.cbuft = nil" should keep ibuft alive.

But if I were writing that code I would definitely write the
runtime.KeepAlive.  Follow a simple rule: if you use
runtime.SetFinalizer on instances of a type, then always use
runtime.KeepAlive in every method of that type.  It costs you
essentially nothing and may save your program from memory corruption.

Ian

-- 
You received this message because you are subscribed to the Google Groups 
"golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to golang-nuts+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/golang-nuts/CAOyqgcV-TyZ_t7p%2BZrKbNbpA%3DOEqzg2KhuZrvqO%3DP6vEJYhUFw%40mail.gmail.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to