tbm_sync: Add tbm_sync_fence_is_signaled 66/317666/2
authorChangyeon Lee <cyeon.lee@samsung.com>
Fri, 13 Sep 2024 02:52:23 +0000 (11:52 +0900)
committerChangyeon Lee <cyeon.lee@samsung.com>
Fri, 13 Sep 2024 03:16:42 +0000 (12:16 +0900)
Change-Id: I7140aa69ee9553801e3e513f59a67580543978cf

include/tbm_sync.h
src/tbm_sync.c

index c391d5d..b2225d7 100644 (file)
@@ -51,6 +51,13 @@ int tbm_sync_fence_wait(tbm_fd fence, int timeout);
  */
 tbm_fd tbm_sync_fence_merge(const char *name, tbm_fd fence1, tbm_fd fence2);
 
+/**
+ * @brief Get signaled of fence
+ * @param[in] fence fence object
+ * @return 0 on active, 1 on signaled, -1 on error
+ */
+int tbm_sync_fence_is_signaled(tbm_fd fence);
+
 #ifdef __cplusplus
 }
 #endif
index 1501567..335bf08 100644 (file)
@@ -223,4 +223,40 @@ tbm_sync_fence_merge(const char *name, tbm_fd fence1, tbm_fd fence2)
 
        return data.fence;
 }
+
+int
+tbm_sync_fence_is_signaled(tbm_fd fence)
+{
+       struct sync_file_info info;
+       int signaled;
+       int ret;
+
+       memset(&info, 0, sizeof(info));
+       ret = ioctl(fence, SYNC_IOC_FILE_INFO, &info);
+       if (ret < 0 && errno == ENOTTY) {
+               struct sync_fence_info_data *legacy_info;
+
+               legacy_info = calloc(1, sizeof *legacy_info);
+               if (!legacy_info)
+                       return -1;
+
+               legacy_info->len = sizeof *legacy_info;
+               ret = ioctl(fence, SYNC_IOC_LEGACY_FENCE_INFO, legacy_info);
+               if ((ret < 0) || (legacy_info->status < 0)) {
+                       free(legacy_info);
+                       _log_errno();
+                       return -1;
+               }
+
+               signaled = legacy_info->status;
+               free(legacy_info);
+
+               return signaled;
+       } else if ((ret < 0) || (info.status < 0)) {
+               _log_errno();
+               return -1;
+       }
+
+       return info.status;
+}
 /* LCOV_EXCL_STOP */