!1064 feat:内核time模块RTC与settimeofday接口逻辑修复
Merge pull request !1064 from zhangdengyu/RTC0515
This commit is contained in:
commit
14868aebdc
|
@ -613,11 +613,22 @@ struct tm *gmtime(const time_t *timer)
|
|||
|
||||
struct tm *localtime_r(const time_t *timep, struct tm *result)
|
||||
{
|
||||
INT32 ret;
|
||||
|
||||
if ((timep == NULL) || (result == NULL)) {
|
||||
errno = EFAULT;
|
||||
return NULL;
|
||||
}
|
||||
if (!ConvertSecs2Utc(*timep, -TIMEZONE, result)) {
|
||||
|
||||
if (g_rtcTimeFunc.RtcGetTimezoneHook != NULL) {
|
||||
INT32 tempTimezone = 0;
|
||||
g_rtcTimeFunc.RtcGetTimezoneHook(&tempTimezone);
|
||||
ret = ConvertSecs2Utc(*timep, -tempTimezone, result);
|
||||
} else {
|
||||
ret = ConvertSecs2Utc(*timep, -TIMEZONE, result);
|
||||
}
|
||||
|
||||
if (!ret) {
|
||||
errno = EINVAL;
|
||||
return NULL;
|
||||
}
|
||||
|
@ -660,7 +671,14 @@ static time_t ConvertUtc2Secs(struct tm *tm)
|
|||
seconds += (tm->tm_mday - 1) * SECS_PER_DAY;
|
||||
seconds += tm->tm_hour * SECS_PER_HOUR + tm->tm_min * SECS_PER_MIN + tm->tm_sec;
|
||||
|
||||
seconds += TIMEZONE;
|
||||
if (g_rtcTimeFunc.RtcGetTimezoneHook != NULL) {
|
||||
INT32 tempTimezone = 0;
|
||||
g_rtcTimeFunc.RtcGetTimezoneHook(&tempTimezone);
|
||||
seconds += tempTimezone;
|
||||
} else {
|
||||
seconds += TIMEZONE;
|
||||
}
|
||||
|
||||
return seconds;
|
||||
}
|
||||
|
||||
|
@ -686,7 +704,14 @@ time_t mktime(struct tm *tmptr)
|
|||
}
|
||||
timeInSeconds = ConvertUtc2Secs(tmptr);
|
||||
/* normalize tm_wday and tm_yday */
|
||||
ConvertSecs2Utc(timeInSeconds, -TIMEZONE, tmptr);
|
||||
if (g_rtcTimeFunc.RtcGetTimezoneHook != NULL) {
|
||||
INT32 tempTimezone = 0;
|
||||
g_rtcTimeFunc.RtcGetTimezoneHook(&tempTimezone);
|
||||
ConvertSecs2Utc(timeInSeconds, -tempTimezone, tmptr);
|
||||
} else {
|
||||
ConvertSecs2Utc(timeInSeconds, -TIMEZONE, tmptr);
|
||||
}
|
||||
|
||||
return timeInSeconds;
|
||||
}
|
||||
|
||||
|
@ -718,7 +743,7 @@ int gettimeofday(struct timeval *tv, void *ptz)
|
|||
tv->tv_usec = ts.tv_nsec / OS_SYS_NS_PER_US;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if (tz != NULL) {
|
||||
if (g_rtcTimeFunc.RtcGetTimezoneHook != NULL) {
|
||||
INT32 tempTimezone = 0;
|
||||
|
@ -740,12 +765,12 @@ int settimeofday(const struct timeval *tv, const struct timezone *tz)
|
|||
{
|
||||
struct timespec ts;
|
||||
|
||||
if (tv == NULL) {
|
||||
if ((tv == NULL) && (tz == NULL)) {
|
||||
errno = EFAULT;
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (tv->tv_usec >= OS_SYS_US_PER_SECOND) {
|
||||
if ((tv != NULL) && (tv->tv_usec >= OS_SYS_US_PER_SECOND)) {
|
||||
errno = EINVAL;
|
||||
return -1;
|
||||
}
|
||||
|
@ -764,18 +789,20 @@ int settimeofday(const struct timeval *tv, const struct timezone *tz)
|
|||
}
|
||||
}
|
||||
|
||||
if (g_rtcTimeFunc.RtcSetTimeHook != NULL) {
|
||||
UINT64 usec;
|
||||
g_rtcTimeBase = tv->tv_sec * OS_SYS_MS_PER_SECOND + tv->tv_usec / OS_SYS_MS_PER_SECOND;
|
||||
usec = tv->tv_sec * OS_SYS_US_PER_SECOND + tv->tv_usec;
|
||||
if (-1 == g_rtcTimeFunc.RtcSetTimeHook(g_rtcTimeBase, &usec)) {
|
||||
return -1;
|
||||
}
|
||||
} else {
|
||||
ts.tv_sec = tv->tv_sec;
|
||||
ts.tv_nsec = tv->tv_usec * OS_SYS_NS_PER_US;
|
||||
if (-1 == clock_settime(CLOCK_REALTIME, &ts)) {
|
||||
return -1;
|
||||
if (tv != NULL) {
|
||||
if (g_rtcTimeFunc.RtcSetTimeHook != NULL) {
|
||||
UINT64 usec;
|
||||
g_rtcTimeBase = tv->tv_sec * OS_SYS_MS_PER_SECOND + tv->tv_usec / OS_SYS_MS_PER_SECOND;
|
||||
usec = tv->tv_sec * OS_SYS_US_PER_SECOND + tv->tv_usec;
|
||||
if (g_rtcTimeFunc.RtcSetTimeHook(g_rtcTimeBase, &usec) < 0) {
|
||||
return -1;
|
||||
}
|
||||
} else {
|
||||
ts.tv_sec = tv->tv_sec;
|
||||
ts.tv_nsec = tv->tv_usec * OS_SYS_NS_PER_US;
|
||||
if (clock_settime(CLOCK_REALTIME, &ts) < 0) {
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -293,6 +293,42 @@ LITE_TEST_CASE(PosixTimeFuncTestSuite, testTimeLocaltime002, Function | MediumTe
|
|||
return 0;
|
||||
}
|
||||
|
||||
/* *
|
||||
* @tc.number SUB_KERNEL_TIME_LOCALTIME_003
|
||||
* @tc.name test settimeofday api
|
||||
* @tc.desc [C- SOFTWARE -0200]
|
||||
*/
|
||||
LITE_TEST_CASE(PosixTimeFuncTestSuite, testTimeLocaltime003, Function | MediumTest | Level1)
|
||||
{
|
||||
char cTime[32]; /* 32, no special meaning */
|
||||
time_t tStart;
|
||||
time_t tEnd;
|
||||
struct timezone tz;
|
||||
struct timeval timeSet = {
|
||||
.tv_sec = 86399, /* 86399, no special meaning */
|
||||
.tv_usec = 0
|
||||
};
|
||||
|
||||
int ret = gettimeofday(NULL, &tz);
|
||||
ICUNIT_ASSERT_EQUAL(ret, 0, ret);
|
||||
|
||||
ret = settimeofday(&timeSet, &tz);
|
||||
time(&tStart);
|
||||
sleep(2); /* 2, sleep time */
|
||||
time(&tEnd);
|
||||
ICUNIT_ASSERT_EQUAL(ret, 0, ret);
|
||||
|
||||
struct tm *tmStart = localtime(&tStart);
|
||||
strftime(cTime, sizeof(cTime), "%H:%M:%S", tmStart);
|
||||
ICUNIT_ASSERT_STRING_EQUAL(cTime, "07:59:59", 0);
|
||||
LOG("\n time_t=%lld, first time:%s", tStart, cTime);
|
||||
struct tm *tmEnd = localtime(&tEnd);
|
||||
strftime(cTime, sizeof(cTime), "%H:%M:%S", tmEnd);
|
||||
ICUNIT_ASSERT_STRING_EQUAL(cTime, "08:00:01", 0);
|
||||
LOG("\n time_t=%lld, first time:%s", tEnd, cTime);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* *
|
||||
* @tc.number SUB_KERNEL_TIME_LOCALTIMER_001
|
||||
* @tc.name localtime_r api base test
|
||||
|
@ -593,6 +629,7 @@ void PosixTimeFuncTest(void)
|
|||
#if (LOSCFG_LIBC_MUSL == 1)
|
||||
RUN_ONE_TESTCASE(testTimeLocaltime001);
|
||||
RUN_ONE_TESTCASE(testTimeLocaltime002);
|
||||
RUN_ONE_TESTCASE(testTimeLocaltime003);
|
||||
RUN_ONE_TESTCASE(testTimeLocaltimer001);
|
||||
RUN_ONE_TESTCASE(testTimeLocaltimer002);
|
||||
#endif
|
||||
|
|
Loading…
Reference in New Issue