Skip to content

Instantly share code, notes, and snippets.

@xxuejie
Created December 8, 2012 03:37
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save xxuejie/4238475 to your computer and use it in GitHub Desktop.
Save xxuejie/4238475 to your computer and use it in GitHub Desktop.
Cannot call longjmp twice on the same jmp_buf
$ clang setjmp-twice.c
$ ./a.out
Normal execution path of first function!
Exception execution path of first function!
Exception execution path of first function!
Calling longjmp the second time!
$ emcc setjmp-twice.c
$ node a.out.js
Normal execution path of first function!
Exception execution path of first function!
/Users/rafael/develop/tmp/a.out.js:2361
} } catch(e) { if (!setjmped) throw(e); setjmped = false; if (!e.longjmp) th
^
[object Object]
#include <setjmp.h>
#include <stdio.h>
typedef struct {
jmp_buf* jmp;
} jmp_state;
void second_func(jmp_state* s);
void first_func(jmp_state* s) {
jmp_buf* prev_jmp = s->jmp;
jmp_buf c_jmp;
int once = 0;
if (setjmp(c_jmp) == 0) {
printf("Normal execution path of first function!\n");
s->jmp = &c_jmp;
second_func(s);
} else {
printf("Exception execution path of first function!\n");
if (!once) {
once = 1;
longjmp(*(s->jmp), 1);
} else {
printf("Calling longjmp the second time!\n");
}
}
}
void second_func(jmp_state* s) {
longjmp(*(s->jmp), 1);
}
int main(int argc, char *argv[]) {
jmp_state s;
s.jmp = NULL;
first_func(&s);
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment