blob: e42ec69c11b5fcd5e972197191957b9225615d1c [file] [log] [blame]
/* 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,...) {set_errstr(x, ##__VA_ARGS__); \
longjmp(&get_cur_errbuf()->jmpbuf, 1);}
#define nexterror() {errpop(errstack, ARRAY_SIZE(errstack), &curindex, \
prev_errbuf); \
longjmp(&(get_cur_errbuf())->jmpbuf, 1);}
#define poperror() {errpop(errstack, ARRAY_SIZE(errstack), &curindex, \
prev_errbuf);}
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 */