event: Make AsyncFuture::set_result() slightly more robust

This commit is contained in:
rdb 2021-03-01 14:28:12 +01:00
parent f6b1b6dbb0
commit 402c303dba
3 changed files with 23 additions and 7 deletions

View File

@ -93,11 +93,6 @@ set_result(std::nullptr_t) {
set_result(nullptr, nullptr);
}
INLINE void AsyncFuture::
set_result(TypedObject *result) {
set_result(result, nullptr);
}
INLINE void AsyncFuture::
set_result(TypedReferenceCount *result) {
set_result(result, result);
@ -110,7 +105,12 @@ set_result(TypedWritableReferenceCount *result) {
INLINE void AsyncFuture::
set_result(const EventParameter &result) {
set_result(result.get_ptr(), result.get_ptr());
if (result.is_typed_ref_count()) {
set_result(result.get_typed_ref_count_value());
}
else {
set_result(result.get_ptr());
}
}
/**

View File

@ -176,6 +176,22 @@ notify_done(bool clean_exit) {
}
}
/**
* Sets this future's result as a generic TypedObject.
*/
void AsyncFuture::
set_result(TypedObject *result) {
if (result->is_of_type(TypedWritableReferenceCount::get_class_type())) {
set_result((TypedWritableReferenceCount *)result);
}
else if (result->is_of_type(TypedReferenceCount::get_class_type())) {
set_result((TypedReferenceCount *)result);
}
else {
set_result(result, nullptr);
}
}
/**
* Sets this future's result. Can only be done while the future is not done.
* Calling this marks the future as done and schedules the done callbacks.

View File

@ -88,10 +88,10 @@ PUBLISHED:
public:
INLINE void set_result(std::nullptr_t);
INLINE void set_result(TypedObject *result);
INLINE void set_result(TypedReferenceCount *result);
INLINE void set_result(TypedWritableReferenceCount *result);
INLINE void set_result(const EventParameter &result);
void set_result(TypedObject *result);
void set_result(TypedObject *ptr, ReferenceCount *ref_ptr);
INLINE TypedObject *get_result() const;