#ifndef SP_E_H_
#define SP_E_H_
/*
* sophia database
* sphia.org
*
* Copyright (c) Dmitry Simonenko
* BSD License
*/
typedef struct spe spe;
#define SPENONE 0
#define SPE 1
#define SPEOOM 2
#define SPESYS 4
#define SPEIO 8
#define SPEF 16
struct spe {
spspinlock lock;
int type;
int errno_;
char e[256];
};
static inline void
sp_einit(spe *e) {
e->type = SPENONE;
e->e[0] = 0;
sp_lockinit(&e->lock);
}
static inline void
sp_efree(spe *e) {
sp_lockfree(&e->lock);
}
static inline int
sp_eis(spe *e) {
sp_lock(&e->lock);
register int is = e->type != SPENONE;
sp_unlock(&e->lock);
return is;
}
static inline void
sp_esetfatal(spe *e) {
sp_lock(&e->lock);
assert(e->type != SPENONE);
e->type |= SPEF;
sp_unlock(&e->lock);
}
static inline int
sp_eisfatal(spe *e) {
sp_lock(&e->lock);
register int is = e->type != SPENONE;
sp_unlock(&e->lock);
return is;
}
static inline int
sp_echeck(spe *e) {
sp_lock(&e->lock);
register int panic = 0;
if (spunlikely(e->type != SPENONE)) {
panic = (e->type & SPEF) > 0;
if (splikely(! panic)) {
e->type = SPENONE;
e->e[0] = 0;
}
}
sp_unlock(&e->lock);
return panic;
}
static inline void
sp_edup(spe *dst, spe *src) {
sp_lock(&dst->lock);
sp_lock(&src->lock);
dst->type = src->type;
dst->errno_ = src->errno_;
memcpy(dst->e, src->e, sizeof(dst->e));
sp_unlock(&src->lock);
sp_unlock(&dst->lock);
}
void sp_vef(spe *e, int type, va_list args);
static inline int
sp_ef(spe *e, int type, ...) {
va_list args;
va_start(args, type);
sp_vef(e, type, args);
va_end(args);
return -1;
}
#endif