From b325d4b74c9879f313f33dd0053736ede675dabe Mon Sep 17 00:00:00 2001 From: caozhijun Date: Fri, 13 Oct 2023 11:49:14 +0800 Subject: [PATCH] Signed-off-by: c459517356 decrease handle close g_fd --- .../innerkits/frameintf/rtg_interface.cpp | 196 ++++++++---------- 1 file changed, 87 insertions(+), 109 deletions(-) diff --git a/interfaces/innerkits/frameintf/rtg_interface.cpp b/interfaces/innerkits/frameintf/rtg_interface.cpp index 9cb667d..3f78d20 100644 --- a/interfaces/innerkits/frameintf/rtg_interface.cpp +++ b/interfaces/innerkits/frameintf/rtg_interface.cpp @@ -35,6 +35,7 @@ namespace { DEFINE_RMELOG_INTELLISENSE("rtg_interface"); const char RTG_SCHED_IPC_MAGIC = 0xAB; +static int g_fd = -1; #define CMD_ID_SET_ENABLE \ _IOWR(RTG_SCHED_IPC_MAGIC, SET_ENABLE, struct rtg_enable_data) @@ -65,31 +66,42 @@ const char RTG_SCHED_IPC_MAGIC = 0xAB; #define CMD_ID_GET_ENABLE \ _IOWR(RTG_SCHED_IPC_MAGIC, GET_ENABLE, struct rtg_enable_data) -int BasicOpenRtgNode() +__attribute__((constructor))void BasicOpenRtgNode() { char fileName[] = "/proc/self/sched_rtg_ctrl"; - int fd = open(fileName, O_RDWR); - return fd; + g_fd = open(fileName, O_RDWR); + if (g_fd < 0) { + RME_LOGI("rtg Open fail, errno = %{public}d(%{public}s), dev = %{public}s", errno, strerror(errno), fileName); + return; + } + RME_LOGI("rtg Open success"); + return; +} + +__attribute__((destructor))void BasicCloseRtgNode() +{ + if (g_fd < 0) { + return; + } + close(g_fd); + RME_LOGI("rtg Close g_fd ret is %{public}d", g_fd); } int EnableRtg(bool flag) { struct rtg_enable_data enableData; char configStr[] = "load_freq_switch:1;sched_cycle:1"; - enableData.enable = flag; enableData.len = sizeof(configStr); enableData.data = configStr; - int fd = BasicOpenRtgNode(); - if (fd < 0) { - return fd; + if (g_fd < 0) { + return g_fd; } - if (ioctl(fd, CMD_ID_SET_ENABLE, &enableData)) { + if (ioctl(g_fd, CMD_ID_SET_ENABLE, &enableData)) { RME_LOGE("set rtg config enable failed, errno = %{public}d (%{public}s)", errno, strerror(errno)); } else { RME_LOGI("set rtg config enable success."); } - close(fd); return 0; }; @@ -97,9 +109,9 @@ int CreateNewRtgGrp(int prioType, int rtNum) { struct rtg_grp_data grp_data; int ret; - int fd = BasicOpenRtgNode(); - if (fd < 0) { - return fd; + if (g_fd < 0) { + RME_LOGE("Open file /proc/self/sched_rtg_ctrl, errno = %{public}d", errno); + return g_fd; } (void)memset_s(&grp_data, sizeof(struct rtg_grp_data), 0, sizeof(struct rtg_grp_data)); if ((prioType > 0) && (prioType < RTG_TYPE_MAX)) { @@ -109,33 +121,29 @@ int CreateNewRtgGrp(int prioType, int rtNum) grp_data.rt_cnt = rtNum; } grp_data.rtg_cmd = CMD_CREATE_RTG_GRP; - ret = ioctl(fd, CMD_ID_SET_RTG, &grp_data); + ret = ioctl(g_fd, CMD_ID_SET_RTG, &grp_data); if (ret < 0) { RME_LOGE("create rtg grp failed, errno = %{public}d (%{public}s)", errno, strerror(errno)); } else { RME_LOGI("create rtg grp success, get rtg id %{public}d.", ret); } - close(fd); return ret; } int AddThreadToRtg(int tid, int grpId, int prioType) { + if (g_fd < 0) { + return g_fd; + } struct rtg_grp_data grp_data; int ret; - int fd = BasicOpenRtgNode(); - if (fd < 0) { - RME_LOGE("open node failed."); - return fd; - } (void)memset_s(&grp_data, sizeof(struct rtg_grp_data), 0, sizeof(struct rtg_grp_data)); grp_data.tid_num = 1; grp_data.tids[0] = tid; grp_data.grp_id = grpId; grp_data.rtg_cmd = CMD_ADD_RTG_THREAD; grp_data.prio_type = prioType; - ret = ioctl(fd, CMD_ID_SET_RTG, &grp_data); - close(fd); + ret = ioctl(g_fd, CMD_ID_SET_RTG, &grp_data); return ret; } @@ -143,9 +151,8 @@ int AddThreadsToRtg(vector tids, int grpId, int prioType) { struct rtg_grp_data grp_data; int ret; - int fd = BasicOpenRtgNode(); - if (fd < 0) { - return fd; + if (g_fd < 0) { + return g_fd; } (void)memset_s(&grp_data, sizeof(struct rtg_grp_data), 0, sizeof(struct rtg_grp_data)); int num = static_cast(tids.size()); @@ -162,82 +169,77 @@ int AddThreadsToRtg(vector tids, int grpId, int prioType) } grp_data.tids[i] = tids[i]; } - - ret = ioctl(fd, CMD_ID_SET_RTG, &grp_data); + ret = ioctl(g_fd, CMD_ID_SET_RTG, &grp_data); if (!ret) { RME_LOGI("add rtg grp success"); } - close(fd); return ret; }; int RemoveRtgThread(int tid) { + if (g_fd < 0) { + return g_fd; + } struct rtg_grp_data grp_data; int ret; - int fd = BasicOpenRtgNode(); - if (fd < 0) { - return fd; - } (void)memset_s(&grp_data, sizeof(struct rtg_grp_data), 0, sizeof(struct rtg_grp_data)); grp_data.tid_num = 1; grp_data.tids[0] = tid; grp_data.rtg_cmd = CMD_REMOVE_RTG_THREAD; - ret = ioctl(fd, CMD_ID_SET_RTG, &grp_data); + ret = ioctl(g_fd, CMD_ID_SET_RTG, &grp_data); if (ret < 0) { RME_LOGE("remove grp failed, errno = %{public}d (%{public}s)", errno, strerror(errno)); } else { RME_LOGI("remove grp success, get rtg id %{public}d.", ret); } - close(fd); return ret; }; int ClearRtgGrp(int grpId) { + if (g_fd < 0) { + return g_fd; + } struct rtg_grp_data grp_data; int ret; - int fd = BasicOpenRtgNode(); - if (fd < 0) { - return fd; - } (void)memset_s(&grp_data, sizeof(struct rtg_grp_data), 0, sizeof(struct rtg_grp_data)); grp_data.rtg_cmd = CMD_CLEAR_RTG_GRP; grp_data.grp_id = grpId; - ret = ioctl(fd, CMD_ID_SET_RTG, &grp_data); + ret = ioctl(g_fd, CMD_ID_SET_RTG, &grp_data); if (ret < 0) { RME_LOGE("clear rtg grp failed, errno = %{public}d (%{public}s)", errno, strerror(errno)); } else { RME_LOGI("clear rtg grp success, get rtg id %{public}d.", ret); } - close(fd); return ret; }; int DestroyRtgGrp(int grpId) { + if (g_fd < 0) { + return g_fd; + } struct rtg_grp_data grp_data; int ret; - int fd = BasicOpenRtgNode(); - if (fd < 0) { - return fd; - } (void)memset_s(&grp_data, sizeof(struct rtg_grp_data), 0, sizeof(struct rtg_grp_data)); grp_data.rtg_cmd = CMD_DESTROY_RTG_GRP; grp_data.grp_id = grpId; - ret = ioctl(fd, CMD_ID_SET_RTG, &grp_data); + ret = ioctl(g_fd, CMD_ID_SET_RTG, &grp_data); if (ret < 0) { RME_LOGE("destroy rtg grp failed, errno = %{public}d (%{public}s)", errno, strerror(errno)); } else { RME_LOGI("destroy rtg grp success, get rtg id:%{public}d, ret:%{public}d.", grpId, ret); } - close(fd); return ret; }; int SetMaxVipRtgs(int rtframe) { + if (g_fd < 0) { + return g_fd; + } int ret = 0; char str_data[MAX_STR_LEN] = {}; (void)sprintf_s(str_data, sizeof(str_data), "rtframe:%d", rtframe); @@ -245,22 +247,20 @@ int SetMaxVipRtgs(int rtframe) strData.len = strlen(str_data); strData.data = str_data; - int fd = BasicOpenRtgNode(); - if (fd < 0) { - return fd; - } - ret = ioctl(fd, CMD_ID_SET_CONFIG, &strData); + ret = ioctl(g_fd, CMD_ID_SET_CONFIG, &strData); if (ret < 0) { RME_LOGE("set single config failed, ret = %{public}d", ret); } else { RME_LOGI("set single config success, get rtg id %{public}d.", ret); } - close(fd); return ret; } int SetFrameRateAndPrioType(int rtgId, int rate, int rtgType) { + if (g_fd < 0) { + return g_fd; + } int ret = 0; char str_data[MAX_LENGTH] = {}; (void)sprintf_s(str_data, sizeof(str_data), "rtgId:%d;rate:%d;type:%d", rtgId, rate, rtgType); @@ -268,68 +268,57 @@ int SetFrameRateAndPrioType(int rtgId, int rate, int rtgType) strData.len = strlen(str_data); strData.data = str_data; - int fd = BasicOpenRtgNode(); - if (fd < 0) { - return fd; - } - ret = ioctl(fd, CMD_ID_SET_RTG_ATTR, &strData); + ret = ioctl(g_fd, CMD_ID_SET_RTG_ATTR, &strData); if (ret < 0) { RME_LOGE("set rtg attr failed, errno = %{public}d (%{public}s)", errno, strerror(errno)); } else { RME_LOGI("set rtg attr success, get rtg id %{public}d.", ret); } - close(fd); return ret; } int BeginFrameFreq(int grpId, int stateParam) { + if (g_fd < 0) { + return g_fd; + } int ret = 0; struct proc_state_data state_data; state_data.grp_id = grpId; state_data.state_param = stateParam; - int fd = BasicOpenRtgNode(); - if (fd < 0) { - return fd; - } - ret = ioctl(fd, CMD_ID_BEGIN_FRAME_FREQ, &state_data); - close(fd); + ret = ioctl(g_fd, CMD_ID_BEGIN_FRAME_FREQ, &state_data); return ret; } int EndFrameFreq(int grpId) { + if (g_fd < 0) { + return g_fd; + } int ret = 0; struct proc_state_data state_data; state_data.grp_id = grpId; state_data.state_param = 0; - int fd = BasicOpenRtgNode(); - if (fd < 0) { - return fd; - } - ret = ioctl(fd, CMD_ID_END_FRAME_FREQ, &state_data); - close(fd); + ret = ioctl(g_fd, CMD_ID_END_FRAME_FREQ, &state_data); return ret; } int EndScene(int grpId) { int ret = 0; + if (g_fd < 0) { + RME_LOGE("Open fail /proc/self/sched_rtg_ctrl"); + return g_fd; + } struct proc_state_data state_data; state_data.grp_id = grpId; - int fd = BasicOpenRtgNode(); - if (fd < 0) { - return fd; - } - ret = ioctl(fd, CMD_ID_END_SCENE, &state_data); + ret = ioctl(g_fd, CMD_ID_END_SCENE, &state_data); if (ret >= 0) { RME_LOGI("set EndScene success, get ret %{public}d.", ret); } - close(fd); - return ret; } @@ -340,17 +329,15 @@ int SetMinUtil(int grpId, int stateParam) state_data.grp_id = grpId; state_data.state_param = stateParam; - int fd = BasicOpenRtgNode(); - if (fd < 0) { - return fd; + if (g_fd < 0) { + return g_fd; } - ret = ioctl(fd, CMD_ID_SET_MIN_UTIL, &state_data); + ret = ioctl(g_fd, CMD_ID_SET_MIN_UTIL, &state_data); if (ret < 0) { RME_LOGE("set min util failed, errno = %{public}d (%{public}s)", errno, strerror(errno)); } else { RME_LOGI("set min util success, get ret %{public}d.", ret); } - close(fd); return ret; } @@ -366,12 +353,10 @@ int SetMargin(int grpId, int stateParam) state_data.grp_id = grpId; state_data.state_param = stateParam; - int fd = BasicOpenRtgNode(); - if (fd < 0) { - return fd; + if (g_fd < 0) { + return g_fd; } - ret = ioctl(fd, CMD_ID_SET_MARGIN, &state_data); - close(fd); + ret = ioctl(g_fd, CMD_ID_SET_MARGIN, &state_data); return ret; } @@ -379,15 +364,14 @@ int ListRtgGroup(vector *rs) { int ret = 0; struct rtg_info rtg_info; - int fd = BasicOpenRtgNode(); - if (fd < 0) { - return fd; + if (g_fd < 0) { + return g_fd; } if (!rs) { return -1; } (void)memset_s(&rtg_info, sizeof(struct rtg_info), 0, sizeof(struct rtg_info)); - ret = ioctl(fd, CMD_ID_LIST_RTG, &rtg_info); + ret = ioctl(g_fd, CMD_ID_LIST_RTG, &rtg_info); if (ret < 0) { RME_LOGE("list rtg group failed, errno = %{public}d (%{public}s)", errno, strerror(errno)); } else { @@ -397,24 +381,22 @@ int ListRtgGroup(vector *rs) rs->push_back(rtg_info.rtgs[i]); } } - close(fd); return ret; } int ListRtgThread(int grpId, vector *rs) { + if (g_fd < 0) { + return g_fd; + } int ret = 0; struct rtg_grp_data grp_data; - int fd = BasicOpenRtgNode(); - if (fd < 0) { - return fd; - } if (!rs) { return -1; } (void)memset_s(&grp_data, sizeof(struct rtg_grp_data), 0, sizeof(struct rtg_grp_data)); grp_data.grp_id = grpId; - ret = ioctl(fd, CMD_ID_LIST_RTG_THREAD, &grp_data); + ret = ioctl(g_fd, CMD_ID_LIST_RTG_THREAD, &grp_data); if (ret < 0) { RME_LOGE("list rtg thread failed, errno = %{public}d (%{public}s)", errno, strerror(errno)); } else { @@ -424,40 +406,36 @@ int ListRtgThread(int grpId, vector *rs) rs->push_back(grp_data.tids[i]); } } - close(fd); return ret; } int SearchRtgForTid(int tid) { - int ret = 0; - struct proc_state_data search_data; - int fd = BasicOpenRtgNode(); - if (fd < 0) { - return fd; + if (g_fd < 0) { + return g_fd; } if (tid <= 0) { RME_LOGI("Search tid err: invalid tid."); return -1; } + int ret = 0; + struct proc_state_data search_data; (void)memset_s(&search_data, sizeof(struct proc_state_data), 0, sizeof(struct proc_state_data)); search_data.state_param = tid; - ret = ioctl(fd, CMD_ID_SEARCH_RTG, &search_data); + ret = ioctl(g_fd, CMD_ID_SEARCH_RTG, &search_data); if (ret >= 0) { RME_LOGD("Search tid %{public}d success with rtg_grp %{public}d", tid, ret); } - close(fd); return ret; } int GetRtgEnable() { - struct rtg_enable_data enableData; - int fd = BasicOpenRtgNode(); - if (fd < 0) { - return fd; + if (g_fd < 0) { + return g_fd; } - return ioctl(fd, CMD_ID_GET_ENABLE, &enableData); + struct rtg_enable_data enableData; + return ioctl(g_fd, CMD_ID_GET_ENABLE, &enableData); } } // namespace RME } // namespace OHOS -- Gitee