Browse Source

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

rdb 4 years ago
parent
commit
402c303dba
3 changed files with 23 additions and 7 deletions
  1. 6 6
      panda/src/event/asyncFuture.I
  2. 16 0
      panda/src/event/asyncFuture.cxx
  3. 1 1
      panda/src/event/asyncFuture.h

+ 6 - 6
panda/src/event/asyncFuture.I

@@ -93,11 +93,6 @@ set_result(std::nullptr_t) {
   set_result(nullptr, nullptr);
   set_result(nullptr, nullptr);
 }
 }
 
 
-INLINE void AsyncFuture::
-set_result(TypedObject *result) {
-  set_result(result, nullptr);
-}
-
 INLINE void AsyncFuture::
 INLINE void AsyncFuture::
 set_result(TypedReferenceCount *result) {
 set_result(TypedReferenceCount *result) {
   set_result(result, result);
   set_result(result, result);
@@ -110,7 +105,12 @@ set_result(TypedWritableReferenceCount *result) {
 
 
 INLINE void AsyncFuture::
 INLINE void AsyncFuture::
 set_result(const EventParameter &result) {
 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());
+  }
 }
 }
 
 
 /**
 /**

+ 16 - 0
panda/src/event/asyncFuture.cxx

@@ -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.
  * 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.
  * Calling this marks the future as done and schedules the done callbacks.

+ 1 - 1
panda/src/event/asyncFuture.h

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