On Friday, December 30, 2016 at 1:26:26 PM UTC-8, Justin Israel wrote:
>
> Hi,
>
> Regarding this thread:
> https://forum.golangbridge.org/t/curious-about-runtime-keepalive-usage/3530
>
> And also the original problem example from Russ:
> https://github.com/golang/go/issues/15277#issuecomment-221768072
>
> ... I just wanted to get clarification on this situation:
>
> func f(ptr *Object) {
>     C.doStuff(ptr.c_ptr)
> }
> func main() {
>     f(NewObject())
> }
>
> ​
>
>
Yes, in this situation it is possible that the finalizer of ptr is executed 
before C.doStuff is executed.  You will need a runtime.KeepAlive(ptr) call 
after the C.doStuff call.
(I'm assuming NewObject sets up a finalizer on the returned Object.)

 

> If someone were to create a transient object as an argument to a function 
> call (keeping no reference to it), and then the function uses a field that 
> is a C pointer to call into a C function, would it be possible for the 
> wrapping Go object to get collected and trigger a finalizer which could 
> cause the C memory to get freed during that C calls?
>
> And another variation, just in case this makes a difference:
>
> func f(ptr *Object) {
>     c_ptr := ptr.c_ptr
>     C.doStuff(c_ptr)
>     C.doStuff2(c_ptr)
> }
>
> ​
>

Same thing here.
 

> Basically, I wasn't sure whether the ptr object would be considered live 
> or not, based on whether the caller hangs onto it or not.
>
> Justin
>
>
>
>

-- 
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.
For more options, visit https://groups.google.com/d/optout.

Reply via email to