blob: 7768bf05e3a53d6992c04d71954f2c1e24bfa03b [file] [log] [blame]
/* 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);