nsecs_t Fence::getSignalTime() const { if (mFenceFd == -1) { return -1; } struct sync_fence_info_data* finfo = sync_fence_info(mFenceFd); if (finfo == NULL) { ALOGE("sync_fence_info returned NULL for fd %d", mFenceFd); return -1; } if (finfo->status != 1) { sync_fence_info_free(finfo); return INT64_MAX; } struct sync_pt_info* pinfo = NULL; uint64_t timestamp = 0; while ((pinfo = sync_pt_info(finfo, pinfo)) != NULL) { if (pinfo->timestamp_ns > timestamp) { timestamp = pinfo->timestamp_ns; } } sync_fence_info_free(finfo); return nsecs_t(timestamp); }
void Fence::dump(int fd) { if (-1 == fd) return; struct sync_fence_info_data *info = sync_fence_info(fd); if (info) { struct sync_pt_info *pt_info = NULL; // status: active(0) signaled(1) error(<0) XLOGI("fence(%s) status(%d)", info->name, info->status); // iterate active/error sync points while ((pt_info = sync_pt_info(info, pt_info))) { if (NULL != pt_info && pt_info->status <= 0) { int ts_sec = pt_info->timestamp_ns / 1000000000LL; int ts_usec = (pt_info->timestamp_ns % 1000000000LL) / 1000LL; String8 msg = String8::format( "sync point: timeline(%s) drv(%s) status(%d) sync_drv(%u) timestamp(%d.%06d)", pt_info->obj_name, pt_info->driver_name, pt_info->status, *(uint32_t *)pt_info->driver_data, ts_sec, ts_usec); XLOGI(msg.string()); } } sync_fence_info_free(info); } }