diff options
Diffstat (limited to 'src/c')
-rw-r--r-- | src/c/driver.c | 31 | ||||
-rw-r--r-- | src/c/urweb.c | 22 |
2 files changed, 52 insertions, 1 deletions
diff --git a/src/c/driver.c b/src/c/driver.c index 5300371d..365566c9 100644 --- a/src/c/driver.c +++ b/src/c/driver.c @@ -52,8 +52,37 @@ static pthread_cond_t queue_cond = PTHREAD_COND_INITIALIZER; #define MAX_RETRIES 5 static void *worker(void *data) { - int me = *(int *)data; + int me = *(int *)data, retries_left = MAX_RETRIES;; lw_context ctx = lw_init(1024, 1024); + + while (1) { + failure_kind fk = lw_begin_init(ctx); + + if (fk == SUCCESS) { + lw_db_init(ctx); + printf("Database connection initialized.\n"); + break; + } else if (fk == BOUNDED_RETRY) { + if (retries_left) { + printf("Initialization error triggers bounded retry: %s\n", lw_error_message(ctx)); + --retries_left; + } else { + printf("Fatal initialization error (out of retries): %s\n", lw_error_message(ctx)); + lw_free(ctx); + return NULL; + } + } else if (fk == UNLIMITED_RETRY) + printf("Initialization error triggers unlimited retry: %s\n", lw_error_message(ctx)); + else if (fk == FATAL) { + printf("Fatal initialization error: %s\n", lw_error_message(ctx)); + lw_free(ctx); + return NULL; + } else { + printf("Unknown lw_handle return code!\n"); + lw_free(ctx); + return NULL; + } + } while (1) { char buf[lw_bufsize+1], *back = buf, *s; diff --git a/src/c/urweb.c b/src/c/urweb.c index 3d79e1a3..cc6e4f0b 100644 --- a/src/c/urweb.c +++ b/src/c/urweb.c @@ -16,6 +16,8 @@ struct lw_context { char *heap, *heap_front, *heap_back; char **inputs; + void *db; + jmp_buf jmp_buf; char error_message[ERROR_BUF_LEN]; @@ -34,11 +36,21 @@ lw_context lw_init(size_t page_len, size_t heap_len) { ctx->inputs = calloc(lw_inputs_len, sizeof(char *)); + ctx->db = NULL; + ctx->error_message[0] = 0; return ctx; } +void lw_set_db(lw_context ctx, void *db) { + ctx->db = db; +} + +void *lw_get_db(lw_context ctx) { + return ctx->db; +} + void lw_free(lw_context ctx) { free(ctx->page); free(ctx->heap); @@ -63,8 +75,18 @@ void lw_reset(lw_context ctx) { memset(ctx->inputs, 0, lw_inputs_len * sizeof(char *)); } +void lw_db_init(lw_context); void lw_handle(lw_context, char *); +failure_kind lw_begin_init(lw_context ctx) { + int r = setjmp(ctx->jmp_buf); + + if (r == 0) + lw_db_init(ctx); + + return r; +} + failure_kind lw_begin(lw_context ctx, char *path) { int r = setjmp(ctx->jmp_buf); |