!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)
|
struct tm *localtime_r(const time_t *timep, struct tm *result)
|
||||||
{
|
{
|
||||||
|
INT32 ret;
|
||||||
|
|
||||||
if ((timep == NULL) || (result == NULL)) {
|
if ((timep == NULL) || (result == NULL)) {
|
||||||
errno = EFAULT;
|
errno = EFAULT;
|
||||||
return NULL;
|
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;
|
errno = EINVAL;
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
@ -660,7 +671,14 @@ static time_t ConvertUtc2Secs(struct tm *tm)
|
||||||
seconds += (tm->tm_mday - 1) * SECS_PER_DAY;
|
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 += 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;
|
return seconds;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -686,7 +704,14 @@ time_t mktime(struct tm *tmptr)
|
||||||
}
|
}
|
||||||
timeInSeconds = ConvertUtc2Secs(tmptr);
|
timeInSeconds = ConvertUtc2Secs(tmptr);
|
||||||
/* normalize tm_wday and tm_yday */
|
/* 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;
|
return timeInSeconds;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -718,7 +743,7 @@ int gettimeofday(struct timeval *tv, void *ptz)
|
||||||
tv->tv_usec = ts.tv_nsec / OS_SYS_NS_PER_US;
|
tv->tv_usec = ts.tv_nsec / OS_SYS_NS_PER_US;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (tz != NULL) {
|
if (tz != NULL) {
|
||||||
if (g_rtcTimeFunc.RtcGetTimezoneHook != NULL) {
|
if (g_rtcTimeFunc.RtcGetTimezoneHook != NULL) {
|
||||||
INT32 tempTimezone = 0;
|
INT32 tempTimezone = 0;
|
||||||
|
@ -740,12 +765,12 @@ int settimeofday(const struct timeval *tv, const struct timezone *tz)
|
||||||
{
|
{
|
||||||
struct timespec ts;
|
struct timespec ts;
|
||||||
|
|
||||||
if (tv == NULL) {
|
if ((tv == NULL) && (tz == NULL)) {
|
||||||
errno = EFAULT;
|
errno = EFAULT;
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (tv->tv_usec >= OS_SYS_US_PER_SECOND) {
|
if ((tv != NULL) && (tv->tv_usec >= OS_SYS_US_PER_SECOND)) {
|
||||||
errno = EINVAL;
|
errno = EINVAL;
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
@ -764,18 +789,20 @@ int settimeofday(const struct timeval *tv, const struct timezone *tz)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (g_rtcTimeFunc.RtcSetTimeHook != NULL) {
|
if (tv != NULL) {
|
||||||
UINT64 usec;
|
if (g_rtcTimeFunc.RtcSetTimeHook != NULL) {
|
||||||
g_rtcTimeBase = tv->tv_sec * OS_SYS_MS_PER_SECOND + tv->tv_usec / OS_SYS_MS_PER_SECOND;
|
UINT64 usec;
|
||||||
usec = tv->tv_sec * OS_SYS_US_PER_SECOND + tv->tv_usec;
|
g_rtcTimeBase = tv->tv_sec * OS_SYS_MS_PER_SECOND + tv->tv_usec / OS_SYS_MS_PER_SECOND;
|
||||||
if (-1 == g_rtcTimeFunc.RtcSetTimeHook(g_rtcTimeBase, &usec)) {
|
usec = tv->tv_sec * OS_SYS_US_PER_SECOND + tv->tv_usec;
|
||||||
return -1;
|
if (g_rtcTimeFunc.RtcSetTimeHook(g_rtcTimeBase, &usec) < 0) {
|
||||||
}
|
return -1;
|
||||||
} else {
|
}
|
||||||
ts.tv_sec = tv->tv_sec;
|
} else {
|
||||||
ts.tv_nsec = tv->tv_usec * OS_SYS_NS_PER_US;
|
ts.tv_sec = tv->tv_sec;
|
||||||
if (-1 == clock_settime(CLOCK_REALTIME, &ts)) {
|
ts.tv_nsec = tv->tv_usec * OS_SYS_NS_PER_US;
|
||||||
return -1;
|
if (clock_settime(CLOCK_REALTIME, &ts) < 0) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -293,6 +293,42 @@ LITE_TEST_CASE(PosixTimeFuncTestSuite, testTimeLocaltime002, Function | MediumTe
|
||||||
return 0;
|
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.number SUB_KERNEL_TIME_LOCALTIMER_001
|
||||||
* @tc.name localtime_r api base test
|
* @tc.name localtime_r api base test
|
||||||
|
@ -593,6 +629,7 @@ void PosixTimeFuncTest(void)
|
||||||
#if (LOSCFG_LIBC_MUSL == 1)
|
#if (LOSCFG_LIBC_MUSL == 1)
|
||||||
RUN_ONE_TESTCASE(testTimeLocaltime001);
|
RUN_ONE_TESTCASE(testTimeLocaltime001);
|
||||||
RUN_ONE_TESTCASE(testTimeLocaltime002);
|
RUN_ONE_TESTCASE(testTimeLocaltime002);
|
||||||
|
RUN_ONE_TESTCASE(testTimeLocaltime003);
|
||||||
RUN_ONE_TESTCASE(testTimeLocaltimer001);
|
RUN_ONE_TESTCASE(testTimeLocaltimer001);
|
||||||
RUN_ONE_TESTCASE(testTimeLocaltimer002);
|
RUN_ONE_TESTCASE(testTimeLocaltimer002);
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Reference in New Issue