On Mon, Feb 15, 2021 at 12:39 PM changkun <h...@changkun.de> wrote:
>
> Thanks for the hint, but I have some follow-up questions:
>
>>
>> Even if there were a way to do this, an atomic variable is not a good
>> synchronization mechanism, because the other side has to poll the
>> variable.
>
> Indeed, it the other side will be a spin loop to poll the atomic variable, 
> which ...
>
>
>>
>> You can do this as a last resort, but it doesn't sound like
>> you are at a last resort here. I suggest that you have your C
>> function call a Go function to write a value on a channel.
>
> seems easy to write than this (?).
>
> Say a Go function foo is called from the C side, to be able to send to the 
> corresponding channel, C must pass that channel to the Go function, which 
> brings to the initial question:  pass a channel from Go to C, is it supported 
> at the moment (?)
>
> How could a Go function be able to send content to differently allocated 
> channels in correspondingly invoked C functions?

For example, on the Go side write

type chanToUse struct {
    c chan int
}

//export MyGoFunction
func MyGoFunction(u unsafe.Pointer, val int) {
    cu = (*chanToUse)(u)
    cu.c <- val
}

    ch := make(chan int)
    ...
    C.MyCFunction(unsafe.Pointer(&chanToUse{ch}))

and on the C side write

void MyCFunction(void *goData) {
    ...
    MyGoFunction(goData, 0);
}

Yes, it's more work.  But it's not a good idea to poll an atomic
variable in Go.  The Go scheduler reacts badly to busy loops.

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--J_RWUhonaDtVh%3DS0ON-6xiqSBJQXEaqLsMtWK%3DV1Q%40mail.gmail.com.

Reply via email to