| /* Plan9 style error popping.  For details, read Documentation/plan9.txt */ | 
 |  | 
 | #ifndef ROS_KERN_ERR_H | 
 | #define ROS_KERN_ERR_H | 
 |  | 
 | #include <setjmp.h> | 
 | #include <syscall.h> | 
 |  | 
 | struct errbuf { | 
 | 	struct jmpbuf jmpbuf; | 
 | }; | 
 |  | 
 | #define ERRSTACK(x) struct errbuf *prev_errbuf; struct errbuf errstack[(x)];   \ | 
 |                     int curindex = 0; | 
 | #define waserror() (errpush(errstack, ARRAY_SIZE(errstack), &curindex,         \ | 
 |                             &prev_errbuf) ||                                   \ | 
 |                     setjmp(&(get_cur_errbuf()->jmpbuf))) | 
 | #define error(x,...) do {set_errstr(x, ##__VA_ARGS__);                         \ | 
 | 	                     longjmp(&get_cur_errbuf()->jmpbuf, 1);} while(0) | 
 | #define nexterror() do {errpop(errstack, ARRAY_SIZE(errstack), &curindex,      \ | 
 |                             prev_errbuf);                                      \ | 
 |                      longjmp(&(get_cur_errbuf())->jmpbuf, 1);} while (0) | 
 | #define poperror() do {errpop(errstack, ARRAY_SIZE(errstack), &curindex,       \ | 
 |                        prev_errbuf);} while (0) | 
 |  | 
 | int errpush(struct errbuf *errstack, int stacksize, int *curindex, | 
 |             struct errbuf **prev_errbuf); | 
 | void errpop(struct errbuf *errstack, int stacksize, int *curindex, | 
 |             struct errbuf *prev_errbuf); | 
 |  | 
 | #endif /* ROS_KERN_ERR_H */ |