|  | /* Plan9 style error popping.  For details, read Documentation/plan9.txt */ | 
|  |  | 
|  | #pragma once | 
|  |  | 
|  | #include <setjmp.h> | 
|  | #include <kthread.h> | 
|  | #include <error.h> | 
|  |  | 
|  | #define ERRSTACK(x) struct errbuf *prev_errbuf; struct errbuf errstack[(x)];   \ | 
|  | int curindex = 0; | 
|  | #define waserror() setjmp(&(errpush(errstack, ARRAY_SIZE(errstack), &curindex, \ | 
|  | &prev_errbuf)->jmpbuf)) | 
|  |  | 
|  | /* In syscall.h, but want to avoid circular include issues. */ | 
|  | extern void set_error(int error, const char *fmt, ...); | 
|  | extern struct errbuf *get_cur_errbuf(void); | 
|  |  | 
|  | #define error_jmp() longjmp(&get_cur_errbuf()->jmpbuf, 1) | 
|  |  | 
|  | #define error(e, x, ...)						\ | 
|  | do {								\ | 
|  | set_error(e, x, ##__VA_ARGS__);				\ | 
|  | error_jmp();						\ | 
|  | } while(0) | 
|  | #define nexterror() longjmp(&(errpop(errstack, ARRAY_SIZE(errstack), &curindex,\ | 
|  | prev_errbuf)->jmpbuf), 1) | 
|  | #define poperror() errpop(errstack, ARRAY_SIZE(errstack), &curindex,	\ | 
|  | prev_errbuf) | 
|  | /* Give Akaros people a hint that we need a real error message. */ | 
|  | #define ERROR_FIXME "This space in %s@%d needs filling in.", __FILE__, __LINE__ | 
|  |  | 
|  | struct errbuf *errpush(struct errbuf *errstack, int stacksize, int *curindex, | 
|  | struct errbuf **prev_errbuf); | 
|  | struct errbuf *errpop(struct errbuf *errstack, int stacksize, int *curindex, | 
|  | struct errbuf *prev_errbuf); |