That usage of setjmp and longjmp are pretty much banned in modern C by every linter. You can only call setjmp/longjmp within the current call stack (at least that's my understanding) - intermixing the context switch to Go would not be correct.
Just have a wrapper on f2() that takes the setjmp address() and set it and call f2(). -----Original Message----- >From: p...@cpan.org >Sent: Dec 9, 2019 12:30 PM >To: Ian Lance Taylor <i...@golang.org> >Cc: golang-nuts <golang-nuts@googlegroups.com> >Subject: Re: [go-nuts] cgo & long jump > >On Monday 09 December 2019 10:18:26 Ian Lance Taylor wrote: >> On Mon, Dec 9, 2019 at 8:57 AM <p...@cpan.org> wrote: >> > >> > I would like to ask some technical question about cgo and long jumps. >> > >> > In Go I have written shared library which exports C API and therefore >> > can be called by other C applications. This my library is compiling with >> > cgo, more precisely via: go build -buildmode=c-shared -compiler gc >> > >> > Now I would like to call from my Go library some C function which may >> > call longjmp(). And setjmp() was already called by application which is >> > using my Go library. >> > >> > It is possible to call from Go C function which calls longjmp() which >> > jumps outside of that my Go library? What would happen with Go garbage >> > collector and "defer" code? >> > >> > To imagine, whole stack looks like this: >> > >> > +------------------------------------------+ >> > | C application | >> > | main(): | >> > | call setjmp() | >> > | call f1() from Go library | >> > | ... | >> > +------------------------------------------+ >> > | Go library with exported C f1() function | >> > | f1(): | >> > | do something in Go | >> > | call f2() from C library | >> > | ... | >> > | return from f1() | >> > +------------------------------------------+ >> > | C library with exported f2() function | >> > | f2(): | >> > | do something in C | >> > | if error call longjmp() | >> > | else return from f2() | >> > +------------------------------------------+ >> > >> > And if longjmp() is called then it jumps to main() where setjmp() was >> > called. So effectively f1() function (in Go) does not return. >> >> I'm pretty sure that won't work at all. Sorry. > >Hi Ian! Thank you for your answer. > >I was trying to find any resource on Internet about long jumps and >"import C" but neither in official Go documentation nor in any other >blog post is written about it. > >There are many resources how Go is (fully) compatible with C and can >call C functions, but absolutely zero information how it is implemented >nor what would happen with such core feature of C language as long jumps >or signals. > >> Certainly no Go deferred functions will be run. I don't think this >> would break the garbage collector as such, but I expect that it would >> break the Go scheduler. In the best case you'll be left with a >> dangling goroutine that will never be run and never go away. > >So should I interpret your answer as long jumps are not supported and >caller of C function from Go must ensure that called C function would >not call longjmp()? > > >And another interesting question, it is possible to call longjmp() from >Go code? To throw C exception back to the main C application. > >-- >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/20191209183039.khrexxnpedzitepy%40pali. -- 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/168169317.2354.1575919493589%40wamui-lola.atl.sa.earthlink.net.