Could you run the C code in its own OS thread by
using LockOSThread and then send a signal to that thread directly?


On 15 February 2017 at 18:26, Yucong Sun <sunyuc...@gmail.com> wrote:
> Also, my cleanup function must be tied directly with C loop, because
> they are sharing the same underlaying memory/state  . If I directly
> run cleanup() while C loop was running, there could be race.
>
> So that leaves me with no choice, i must be able to panic on the C
> loop's go-routine on async signals, which I can't do with current
> tools.
>
> On Wed, Feb 15, 2017 at 10:21 AM, Yucong Sun <sunyuc...@gmail.com> wrote:
>> https://play.golang.org/p/7Vz0o4ZoQF
>>
>> shows that your code doesn't really work.  My understanding is once
>> panic reaches the current goroutine's top of callstack, program will
>> crash, there are no attempt to call other goroutine's deferred
>> function.
>>
>> So,  in order to do what I want, i must be able to trigger some sort
>> of inline panic remotely.   Note in the C code this is easy, the
>> signal handler will interrupt current thread, jump directly to the
>> handler code and resume.  If I can do that in golang, i will be able
>> to trigger a panic in main() and do what I want (or do what the old C
>> code does, which i was porting into go)
>>
>> On Wed, Feb 15, 2017 at 10:14 AM, Yucong Sun <sunyuc...@gmail.com> wrote:
>>> Thanks axle,  but are you sure the code would work?  it is essentially
>>> triggering panic on the main go routine while recovering from another
>>> goroutine, isn't that impossible?
>>>
>>> If this is possible, why couldn't I trigger a panic on a goroutine
>>> then recover it from main goroutine?
>>>
>>> On Wed, Feb 15, 2017 at 10:03 AM, Axel Wagner
>>> <axel.wagner...@googlemail.com> wrote:
>>>> First, the code you wrote here doesn't use os/signal, so you can't really
>>>> fault Ian for giving that advice. Here's my understanding:
>>>>
>>>> In general, there are two kinds of signals: synchronous ones, raised e.g. 
>>>> by
>>>> dereferencing invalid memory. They produce a runtime panic at the site that
>>>> produced them in the corresponding goroutine. And asynchronous ones, raised
>>>> e.g. by using the kill command or os.Kill. They do not produce a runtime
>>>> panic but instead need to be handled via os/signal.
>>>>
>>>> Now, to "catch" asynchronous panic's, you need to use os/signal and if you
>>>> need them to produce a runtime-panic on the goroutine running main, you 
>>>> need
>>>> to read from that channel in main and produce a panic whenever you read a
>>>> value. You could, for example, do this:
>>>>
>>>> func main() {
>>>>     ch := make(chan os.Signal)
>>>>     signal.Notify(ch, mySignals)
>>>>
>>>>     errs := make(chan interface{})
>>>>
>>>>     go func() {
>>>>         defer func() {
>>>>             errs <- recover()
>>>>         }()
>>>>         for {
>>>>             C.do_something()
>>>>         }
>>>>     }()
>>>>
>>>>     for {
>>>>         select {
>>>>         case s := <-ch:
>>>>             panic(fmt.Sprintf("received signal: %v", s))
>>>>         case v := <-errs:
>>>>             panic(fmt.Sprintf("recovered runtime panic in C-code: %v", v))
>>>>         }
>>>>     }
>>>> }
>>>>
>>>> this will get asynchronous signals via os/signal and synchronous signals in
>>>> the C-code raising runtime-panics via recover.
>>>>
>>>> Now, what is *not* possible, is to somehow recover from runtime panics
>>>> caused by synchronous signals in *other* goroutines. The spec is pretty
>>>> clear about that; a panic that isn't recovered will cause the program to
>>>> crash.
>>>>
>>>> Hope this helps.
>>>>
>>>> On Wed, Feb 15, 2017 at 6:44 PM, Yucong Sun <sunyuc...@gmail.com> wrote:
>>>>>
>>>>> hi,
>>>>>
>>>>> Maybe I wasn't clear, I am indeed using os.signal package. But it doesn't
>>>>> do what I want!  I want to trigger a panic in main function , seems there 
>>>>> is
>>>>> no way to do it by using a signal channel .
>>>>>
>>>>> Thanks
>>>>>
>>>>> --
>>>>> 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.
>>>>
>>>>
>
> --
> 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.

-- 
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