android13/hardware/google/graphics/common/libhwc2.1/ExynosHWCDebug.cpp

129 lines
4.1 KiB
C++

/*
* Copyright (C) 2012 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "ExynosHWCDebug.h"
#include "ExynosDisplay.h"
#include <sync/sync.h>
#include "exynos_sync.h"
uint32_t mErrLogSize = 0;
uint32_t mFenceLogSize = 0;
int32_t saveErrorLog(const String8 &errString, ExynosDisplay *display)
{
int32_t ret = NO_ERROR;
if (mErrLogSize >= ERR_LOG_SIZE)
return -1;
FILE *pFile = NULL;
char filePath[128];
sprintf(filePath, "%s/hwc_error_log.txt", ERROR_LOG_PATH0);
pFile = fopen(filePath, "a");
if (pFile == NULL) {
ALOGE("Fail to open file %s/hwc_error_log.txt, error: %s", ERROR_LOG_PATH0, strerror(errno));
sprintf(filePath, "%s/hwc_error_log.txt", ERROR_LOG_PATH1);
pFile = fopen(filePath, "a");
}
if (pFile == NULL) {
ALOGE("Fail to open file %s/hwc_error_log.txt, error: %s", ERROR_LOG_PATH1, strerror(errno));
return -errno;
}
mErrLogSize = ftell(pFile);
if (mErrLogSize >= ERR_LOG_SIZE) {
if (pFile != NULL)
fclose(pFile);
return -1;
}
String8 saveString;
struct timeval tv;
gettimeofday(&tv, NULL);
if (display != NULL) {
saveString.appendFormat("%s %s %" PRIu64 ": %s\n", getLocalTimeStr(tv).string(),
display->mDisplayName.string(), display->mErrorFrameCount,
errString.string());
} else {
saveString.appendFormat("%s : %s\n", getLocalTimeStr(tv).string(), errString.string());
}
if (pFile != NULL) {
fwrite(saveString.string(), 1, saveString.size(), pFile);
mErrLogSize = (uint32_t)ftell(pFile);
ret = mErrLogSize;
fclose(pFile);
}
return ret;
}
int32_t saveFenceTrace(ExynosDisplay *display) {
int32_t ret = NO_ERROR;
if (mFenceLogSize >= FENCE_ERR_LOG_SIZE)
return -1;
FILE *pFile = NULL;
char filePath[128];
sprintf(filePath, "%s/hwc_fence_state.txt", ERROR_LOG_PATH0);
pFile = fopen(filePath, "a");
if (pFile == NULL) {
ALOGE("Fail to open file %s/hwc_fence_state.txt, error: %s", ERROR_LOG_PATH0, strerror(errno));
sprintf(filePath, "%s/hwc_fence_state.txt", ERROR_LOG_PATH1);
pFile = fopen(filePath, "a");
}
if (pFile == NULL) {
ALOGE("Fail to open file %s, error: %s", ERROR_LOG_PATH1, strerror(errno));
return -errno;
}
mFenceLogSize = ftell(pFile);
if (mFenceLogSize >= FENCE_ERR_LOG_SIZE) {
if (pFile != NULL)
fclose(pFile);
return -1;
}
ExynosDevice *device = display->mDevice;
String8 saveString;
struct timeval tv;
gettimeofday(&tv, NULL);
saveString.appendFormat("\n====== Fences at time:%s ======\n", getLocalTimeStr(tv).string());
if (device != NULL) {
for (const auto &[fd, info] : device->mFenceInfos) {
saveString.appendFormat("---- Fence FD : %d, Display(%d) ----\n", fd, info.displayId);
saveString.appendFormat("usage: %d, dupFrom: %d, pendingAllowed: %d, leaking: %d\n",
info.usage, info.dupFrom, info.pendingAllowed, info.leaking);
for (const auto &trace : info.traces) {
saveString.appendFormat("> dir: %d, type: %d, ip: %d, time:%s\n", trace.direction,
trace.type, trace.ip, getLocalTimeStr(trace.time).string());
}
}
}
if (pFile != NULL) {
fwrite(saveString.string(), 1, saveString.size(), pFile);
mFenceLogSize = (uint32_t)ftell(pFile);
ret = mFenceLogSize;
fclose(pFile);
}
return ret;
}