未验证 提交 002cf45f 编写于 作者: O openharmony_ci 提交者: Gitee

!1994 timespec 替换 time

Merge pull request !1994 from cheng_jinsong/init_time
......@@ -38,6 +38,7 @@ if (!defined(ohos_lite)) {
include_dirs = [
"//foundation/systemabilitymgr/samgr/interfaces/innerkits/samgr_proxy/include/",
".",
"//base/startup/init/services/include",
"//base/startup/init/services/include/param",
"//base/startup/init/interfaces/innerkits/include",
"//base/startup/init/interfaces/innerkits/include/syspara",
......@@ -54,6 +55,7 @@ if (!defined(ohos_lite)) {
"//base/startup/init/interfaces/innerkits:libbegetutil",
"//base/startup/init/services/log:agent_log",
"//base/startup/init/services/modules/udid:libudidcomm",
"//base/startup/init/services/utils:libinit_utils",
"//third_party/bounds_checking_function:libsec_shared",
]
......
......@@ -31,6 +31,7 @@
#include "param_comm.h"
#include "parameter.h"
#include "sysparam_errno.h"
#include "init_utils.h"
namespace OHOS {
using namespace Security;
......@@ -40,21 +41,21 @@ namespace device_info {
REGISTER_SYSTEM_ABILITY_BY_ID(DeviceInfoService, SYSPARAM_DEVICE_SERVICE_ID, true)
static std::mutex g_lock;
static time_t g_lastTime;
static struct timespec g_lastTime;
#ifndef STARTUP_INIT_TEST
static const int DEVICE_INFO_EXIT_TIMEOUT_MS = 15;
static const int DEVICE_INFO_EXIT_TIMEOUT_S = 15;
#else
static const int DEVICE_INFO_EXIT_TIMEOUT_MS = 3;
static const int DEVICE_INFO_EXIT_TIMEOUT_S = 3;
#endif
static void UnloadDeviceInfoSa(int signo)
{
{
std::unique_lock<std::mutex> lock(g_lock);
time_t currTime;
(void)time(&currTime);
if (difftime(currTime, g_lastTime) < DEVICE_INFO_EXIT_TIMEOUT_MS) {
alarm(DEVICE_INFO_EXIT_TIMEOUT_MS / 3); // 3 half
struct timespec currTimer = {};
(void)clock_gettime(CLOCK_MONOTONIC, &currTimer);
if (IntervalTime(&g_lastTime, &currTimer) < DEVICE_INFO_EXIT_TIMEOUT_S) {
alarm(DEVICE_INFO_EXIT_TIMEOUT_S / 3); // 3 half
return;
}
}
......@@ -75,7 +76,7 @@ int32_t DeviceInfoStub::OnRemoteRequest(uint32_t code,
{
std::unique_lock<std::mutex> lock(g_lock);
(void)time(&g_lastTime);
(void)clock_gettime(CLOCK_MONOTONIC, &g_lastTime);
}
int ret = ERR_FAIL;
......@@ -144,7 +145,7 @@ void DeviceInfoService::OnStart(void)
DINFO_LOGE("DeviceInfoService Publish failed");
}
signal(SIGALRM, UnloadDeviceInfoSa);
alarm(DEVICE_INFO_EXIT_TIMEOUT_MS / 2); // 2 half
alarm(DEVICE_INFO_EXIT_TIMEOUT_S / 2); // 2 half
return;
}
......
......@@ -34,6 +34,7 @@ typedef struct {
int value;
} InitArgInfo;
#define BASE_MS_UNIT 1000
#define MAX_INT_LEN 20
#define HEX_BASE 16
#define BINARY_BASE 2
......@@ -89,6 +90,8 @@ void OpenConsole(void);
void TrimTail(char *str, char c);
char *TrimHead(char *str, char c);
INIT_LOCAL_API uint32_t IntervalTime(struct timespec *startTime, struct timespec *endTime);
INIT_LOCAL_API int StringToULL(const char *str, unsigned long long int *out);
INIT_LOCAL_API int StringToLL(const char *str, long long int *out);
void CloseStdio(void);
......
......@@ -134,7 +134,7 @@ typedef struct Service_ {
char *name;
int pid;
int crashCnt;
time_t firstCrashTime;
uint32_t firstCrashTime;
int crashCount;
int crashTime;
unsigned int attribute;
......
......@@ -38,8 +38,6 @@
#include "init_utils.h"
#include "securec.h"
#define BASE_MS_UNIT 1000
#ifndef OHOS_LITE
#include "hookmgr.h"
#include "bootstage.h"
......
......@@ -573,15 +573,17 @@ static bool CalculateCrashTime(Service *service, int crashTimeLimit, int crashCo
{
INIT_ERROR_CHECK(service != NULL && crashTimeLimit > 0 && crashCountLimit > 0,
return false, "input params error.");
time_t curTime = time(NULL);
struct timespec curTime = {};
(void)clock_gettime(CLOCK_MONOTONIC, &curTime);
struct timespec crashTime = {service->firstCrashTime, 0};
if (service->crashCnt == 0) {
service->firstCrashTime = curTime;
service->firstCrashTime = curTime.tv_sec;
++service->crashCnt;
if (service->crashCnt == crashCountLimit) {
return false;
}
} else if (difftime(curTime, service->firstCrashTime) > crashTimeLimit) {
service->firstCrashTime = curTime;
} else if (IntervalTime(&crashTime, &curTime) > crashTimeLimit) {
service->firstCrashTime = curTime.tv_sec;
service->crashCnt = 1;
} else {
++service->crashCnt;
......
......@@ -187,4 +187,4 @@ INIT_LOCAL_API int ParamStrCpy(char *strDest, size_t destMax, const char *strSrc
ret = strcpy_s(strDest, destMax, strSrc);
#endif
return ret;
}
\ No newline at end of file
}
......@@ -85,7 +85,7 @@ typedef struct {
uint32_t flags;
long long commitId;
ParamTaskPtr saveTimer;
time_t lastSaveTimer;
struct timespec lastSaveTimer;
PersistParamOps persistParamOps;
} ParamPersistWorkSpace;
......
......@@ -211,8 +211,6 @@ INIT_LOCAL_API void FreeSharedMem(const MemHandle *handle, void *mem, uint32_t d
#define ATOMIC_STORE_EXPLICIT(commitId, value, order) atomic_store_explicit((commitId), (value), (order))
#endif
INIT_LOCAL_API uint32_t Difftime(time_t curr, time_t base);
#ifdef __cplusplus
#if __cplusplus
}
......
......@@ -140,6 +140,7 @@ typedef int (*DUMP_PRINTF)(const char *fmt, ...);
INIT_LOCAL_API int SplitParamString(char *line, const char *exclude[], uint32_t count,
int (*result)(const uint32_t *context, const char *name, const char *value), const uint32_t *context);
#ifdef __cplusplus
#if __cplusplus
}
......
......@@ -102,8 +102,3 @@ INIT_LOCAL_API void FreeSharedMem(const MemHandle *handle, void *mem, uint32_t d
PARAM_CHECK(mem != NULL && handle != NULL, return, "Invalid mem or handle");
munmap((char *)mem, dataSize);
}
INIT_LOCAL_API uint32_t Difftime(time_t curr, time_t base)
{
return (uint32_t)difftime(curr, base);
}
\ No newline at end of file
......@@ -93,16 +93,16 @@ static int ReadMessage(int fd, char *buffer, uint32_t timeout)
{
int ret = 0;
uint32_t diff = 0;
time_t startTime;
(void)time(&startTime);
struct timespec startTime = {};
(void)clock_gettime(CLOCK_MONOTONIC, &startTime);
do {
ssize_t recvLen = recv(fd, (char *)buffer, RECV_BUFFER_MAX, 0);
if (recvLen > 0) {
break;
}
time_t finishTime;
(void)time(&finishTime);
diff = (uint32_t)difftime(finishTime, startTime);
struct timespec finishTime = {};
(void)clock_gettime(CLOCK_MONOTONIC, &finishTime);
diff = IntervalTime(&finishTime, &startTime);
if (diff >= timeout) {
ret = PARAM_CODE_TIMEOUT;
break;
......
......@@ -71,11 +71,11 @@ int SystemWaitParameter(const char *name, const char *value, int32_t timeout)
int ret = CheckParamPermission(GetParamSecurityLabel(), name, DAC_READ);
PARAM_CHECK(ret == 0, return ret, "Forbid to wait parameter %s", name);
uint32_t diff = 0;
time_t startTime;
struct timespec startTime = {};
if (timeout <= 0) {
timeout = DEFAULT_PARAM_WAIT_TIMEOUT;
}
(void)time(&startTime);
(void)clock_gettime(CLOCK_MONOTONIC, &startTime);
do {
long long commit = GetSystemCommitId();
if (commit != globalCommit) {
......@@ -88,9 +88,9 @@ int SystemWaitParameter(const char *name, const char *value, int32_t timeout)
globalCommit = commit;
usleep(MIN_SLEEP);
time_t finishTime;
(void)time(&finishTime);
diff = (uint32_t)difftime(finishTime, startTime);
struct timespec finishTime = {};
(void)clock_gettime(CLOCK_MONOTONIC, &finishTime);
diff = IntervalTime(&finishTime, &startTime);
if (diff >= timeout) {
ret = PARAM_CODE_TIMEOUT;
break;
......
......@@ -323,13 +323,3 @@ INIT_LOCAL_API int ParamMutexDelete(ParamMutex *mutex)
}
#endif
INIT_LOCAL_API uint32_t Difftime(time_t curr, time_t base)
{
#ifndef __LITEOS_M__
return (uint32_t)difftime(curr, base);
#else
(void)curr;
(void)base;
return 0;
#endif
}
......@@ -23,7 +23,7 @@
#include "param_osadp.h"
#include "securec.h"
static ParamPersistWorkSpace g_persistWorkSpace = {0, 0, NULL, 0, {0}};
static ParamPersistWorkSpace g_persistWorkSpace = {0, 0, NULL, {}, {0}};
static int IsNeedToSave(const char *name)
{
#if defined(__LITEOS_M__) || defined(__LITEOS_A__)
......@@ -118,7 +118,7 @@ static int BatchSavePersistParam(void)
PARAM_CHECK(ret == 0, return PARAM_CODE_INVALID_NAME, "Save persist param fail");
PARAM_CLEAR_FLAG(g_persistWorkSpace.flags, WORKSPACE_FLAGS_UPDATE);
(void)time(&g_persistWorkSpace.lastSaveTimer);
(void)clock_gettime(CLOCK_MONOTONIC, &g_persistWorkSpace.lastSaveTimer);
return ret;
}
......@@ -127,7 +127,7 @@ INIT_LOCAL_API int InitPersistParamWorkSpace(void)
if (PARAM_TEST_FLAG(g_persistWorkSpace.flags, WORKSPACE_FLAGS_INIT)) {
return 0;
}
(void)time(&g_persistWorkSpace.lastSaveTimer);
(void)clock_gettime(CLOCK_MONOTONIC, &g_persistWorkSpace.lastSaveTimer);
RegisterPersistParamOps(&g_persistWorkSpace.persistParamOps);
PARAM_SET_FLAG(g_persistWorkSpace.flags, WORKSPACE_FLAGS_INIT);
return 0;
......@@ -194,9 +194,9 @@ INIT_LOCAL_API int WritePersistParam(const char *name, const char *value)
}
// check timer for save all
time_t currTimer;
(void)time(&currTimer);
uint32_t diff = Difftime(currTimer, g_persistWorkSpace.lastSaveTimer);
struct timespec currTimer = {};
(void)clock_gettime(CLOCK_MONOTONIC, &currTimer);
uint32_t diff = IntervalTime(&g_persistWorkSpace.lastSaveTimer, &currTimer);
if (diff > PARAM_MUST_SAVE_PARAM_DIFF) {
if (g_persistWorkSpace.saveTimer != NULL) {
ParamTimerClose(g_persistWorkSpace.saveTimer);
......
......@@ -685,3 +685,13 @@ int GetParameterFromCmdLine(const char *paramName, char *value, size_t valueLen)
return ret;
}
uint32_t IntervalTime(struct timespec *startTime, struct timespec *endTime)
{
uint32_t diff = 0;
if (endTime->tv_sec > startTime->tv_sec) {
diff = (uint32_t)(endTime->tv_sec - startTime->tv_sec);
} else {
diff = (uint32_t)(startTime->tv_sec - endTime->tv_sec);
}
return diff;
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册