OSDN Git Service

libui: Change hasSignaled to return optional<bool>
authorDan Stoza <stoza@google.com>
Thu, 13 Oct 2016 16:45:00 +0000 (09:45 -0700)
committerMatthew Bouyack <mbouyack@google.com>
Mon, 17 Oct 2016 18:32:10 +0000 (11:32 -0700)
Since the android::Fence::wait() call can possibly return an error,
we need some way of indicating to the caller of hasSignaled that a
fence that has not yet signaled (because it is in an error state) will
never signal. To do this, we return an optional<bool>, where true and
false indicate both that the fence is valid and that it has or hasn't
signaled. If an error is returned from wait(), we return a default
optional value (that is neither true nor false).

Test: m

Change-Id: Ibce48cd2e71ddb8ccf6cabe3284afe0efca8c132

include/ui/Fence.h

index fa4b9bc..48a7aa3 100644 (file)
@@ -27,6 +27,8 @@
 #include <utils/String8.h>
 #include <utils/Timers.h>
 
+#include <experimental/optional>
+
 struct ANativeWindowBuffer;
 
 namespace android {
@@ -96,16 +98,26 @@ public:
     // occurs then -1 is returned.
     nsecs_t getSignalTime() const;
 
+#if __cplusplus > 201103L
     // hasSignaled returns whether the fence has signaled yet. Prefer this to
     // getSignalTime() or wait() if all you care about is whether the fence has
-    // signaled.
-    inline bool hasSignaled() {
+    // signaled. Returns an optional bool, which will have a value if there was
+    // no error.
+    inline std::experimental::optional<bool> hasSignaled() {
         // The sync_wait call underlying wait() has been measured to be
         // significantly faster than the sync_fence_info call underlying
         // getSignalTime(), which might otherwise appear to be the more obvious
         // way to check whether a fence has signaled.
-        return wait(0) == NO_ERROR;
+        switch (wait(0)) {
+            case NO_ERROR:
+                return true;
+            case -ETIME:
+                return false;
+            default:
+                return {};
+        }
     }
+#endif
 
     // Flattenable interface
     size_t getFlattenedSize() const;