diff --git a/extra/exports b/extra/exports index 946739805ea39a4da51073729d909644e79997fb..3317ddbda5630f95db6dc1a6dfd18e9222e33827 100644 --- a/extra/exports +++ b/extra/exports @@ -242,6 +242,7 @@ box_error_last box_error_clear box_error_set error_set_prev +error_unref box_latch_new box_latch_delete box_latch_lock diff --git a/src/lib/core/diag.c b/src/lib/core/diag.c index e143db18d90f0a6037b815c1e48e7a032d1a48c5..787f0f82a06bfbf4322a6b65e17f42e5329ac4f4 100644 --- a/src/lib/core/diag.c +++ b/src/lib/core/diag.c @@ -31,6 +31,26 @@ #include "diag.h" #include "fiber.h" +void +error_unref(struct error *e) +{ + assert(e->refs > 0); + struct error *to_delete = e; + while (--to_delete->refs == 0) { + /* Unlink error from lists completely.*/ + struct error *cause = to_delete->cause; + assert(to_delete->effect == NULL); + if (to_delete->cause != NULL) { + to_delete->cause->effect = NULL; + to_delete->cause = NULL; + } + to_delete->destroy(to_delete); + if (cause == NULL) + return; + to_delete = cause; + } +} + int error_set_prev(struct error *e, struct error *prev) { diff --git a/src/lib/core/diag.h b/src/lib/core/diag.h index 7a5454d1c1eed6d9b3b66ee61c59c3917cd11473..beb6a75289681f2caac1acd13541ba5a2e98fc8b 100644 --- a/src/lib/core/diag.h +++ b/src/lib/core/diag.h @@ -118,25 +118,8 @@ error_ref(struct error *e) e->refs++; } -static inline void -error_unref(struct error *e) -{ - assert(e->refs > 0); - struct error *to_delete = e; - while (--to_delete->refs == 0) { - /* Unlink error from lists completely.*/ - struct error *cause = to_delete->cause; - assert(to_delete->effect == NULL); - if (to_delete->cause != NULL) { - to_delete->cause->effect = NULL; - to_delete->cause = NULL; - } - to_delete->destroy(to_delete); - if (cause == NULL) - return; - to_delete = cause; - } -} +void +error_unref(struct error *e); /** * Unlink error from its effect. For instance: