Skip to content
Snippets Groups Projects
Commit ed217292 authored by Vladislav Shpilevoy's avatar Vladislav Shpilevoy Committed by Kirill Yukhin
Browse files

error: export error_unref() function

C struct error objects can be created directly only in C.
C-side increments their reference counter when pushes to the Lua
stack.

It is not going to be so convenient soon. error_unpack() function
will be used in netbox to decode error object via Lua FFI.

Such error object will have 0 refs and no Lua GC callback
established. Because it won't be pushed on Lua stack natually,
from Lua C. To make such errors alive their reference counter
will be incremented and error_unref() will be set as GC callback.

Follow up for #4398
parent 345877df
No related branches found
No related tags found
No related merge requests found
...@@ -242,6 +242,7 @@ box_error_last ...@@ -242,6 +242,7 @@ box_error_last
box_error_clear box_error_clear
box_error_set box_error_set
error_set_prev error_set_prev
error_unref
box_latch_new box_latch_new
box_latch_delete box_latch_delete
box_latch_lock box_latch_lock
......
...@@ -31,6 +31,26 @@ ...@@ -31,6 +31,26 @@
#include "diag.h" #include "diag.h"
#include "fiber.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 int
error_set_prev(struct error *e, struct error *prev) error_set_prev(struct error *e, struct error *prev)
{ {
......
...@@ -118,25 +118,8 @@ error_ref(struct error *e) ...@@ -118,25 +118,8 @@ error_ref(struct error *e)
e->refs++; e->refs++;
} }
static inline void void
error_unref(struct error *e) 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;
}
}
/** /**
* Unlink error from its effect. For instance: * Unlink error from its effect. For instance:
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment