summaryrefslogtreecommitdiff
path: root/src/lib/eina/eina_promise.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/eina/eina_promise.c')
-rw-r--r--src/lib/eina/eina_promise.c30
1 files changed, 26 insertions, 4 deletions
diff --git a/src/lib/eina/eina_promise.c b/src/lib/eina/eina_promise.c
index 93e70948e5..e8ef06d781 100644
--- a/src/lib/eina/eina_promise.c
+++ b/src/lib/eina/eina_promise.c
@@ -169,11 +169,11 @@ _eina_promise_then_calls(_Eina_Promise_Default_Owner* promise)
if (error)
{
if (callback->error_cb)
- (*callback->error_cb)(callback->data, &promise->promise.error);
+ (*callback->error_cb)(callback->data, promise->promise.error, &promise->promise.vtable);
}
else if (callback->callback)
{
- (*callback->callback)(callback->data, &promise->value[0]);
+ (*callback->callback)(callback->data, &promise->value[0], &promise->promise.vtable);
}
free(callback);
_eina_promise_unref(&promise->promise);
@@ -240,8 +240,23 @@ _eina_promise_value_get(_Eina_Promise_Default const* p)
}
}
+static void *
+_eina_promise_release_value_ownership(_Eina_Promise_Default* p)
+{
+ _Eina_Promise_Default_Owner* promise = EINA_PROMISE_GET_OWNER(p);
+ if (promise->promise.has_finished && !promise->promise.has_errored)
+ {
+ promise->promise.value_free_cb = NULL;
+ return (void*)&promise->value[0];
+ }
+ else
+ {
+ return NULL;
+ }
+}
+
static void
-_eina_promise_owner_value_set(_Eina_Promise_Default_Owner* promise, void* data, Eina_Promise_Free_Cb free)
+_eina_promise_owner_value_set(_Eina_Promise_Default_Owner* promise, const void* data, Eina_Promise_Free_Cb free)
{
if (data && promise->promise.value_size)
{
@@ -481,6 +496,7 @@ eina_promise_default_add(int value_size)
p->promise.vtable.ref = EINA_FUNC_PROMISE_REF(_eina_promise_ref);
p->promise.vtable.unref = EINA_FUNC_PROMISE_UNREF(_eina_promise_unref);
p->promise.vtable.value_size_get = EINA_FUNC_PROMISE_VALUE_SIZE_GET(_eina_promise_value_size_get);
+ p->promise.vtable.release_value_ownership = EINA_FUNC_PROMISE_RELEASE_VALUE_OWNERSHIP(_eina_promise_release_value_ownership);
p->promise.has_finished = p->promise.has_errored =
p->promise.is_cancelled = p->promise.is_manual_then = EINA_FALSE;
p->promise.is_first_then = EINA_TRUE;
@@ -781,7 +797,7 @@ eina_promise_then(Eina_Promise* promise, Eina_Promise_Cb callback,
}
EAPI void
-eina_promise_owner_value_set(Eina_Promise_Owner* promise, void* value, Eina_Promise_Free_Cb free)
+eina_promise_owner_value_set(Eina_Promise_Owner* promise, const void* value, Eina_Promise_Free_Cb free)
{
promise->value_set(promise, value, free);
}
@@ -847,6 +863,12 @@ eina_promise_buffer_get(Eina_Promise* promise)
return promise->buffer_get(promise);
}
+EAPI void *
+eina_promise_release_value_ownership(Eina_Promise* promise)
+{
+ return promise->release_value_ownership(promise);
+}
+
EAPI size_t
eina_promise_value_size_get(Eina_Promise const* promise)
{