!206 fix time mould-kernel:fix 2 api clock_gettime、clock_getres
Merge pull request !206 from guweijie/master
This commit is contained in:
commit
d632356413
|
@ -50,6 +50,8 @@
|
||||||
#include "los_swtmr_pri.h"
|
#include "los_swtmr_pri.h"
|
||||||
#include "los_sys_pri.h"
|
#include "los_sys_pri.h"
|
||||||
|
|
||||||
|
#define CPUCLOCK_PERTHREAD_MASK 4
|
||||||
|
#define CPUCLOCK_ID_OFFSET 3
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Do a time package defined return. This requires the error code
|
* Do a time package defined return. This requires the error code
|
||||||
|
@ -450,13 +452,82 @@ int clock_settime(clockid_t clockID, const struct timespec *tp)
|
||||||
return settimeofday(&tv, NULL);
|
return settimeofday(&tv, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int PthreadGetCputime(clockid_t clockID, struct timespec *ats)
|
||||||
|
{
|
||||||
|
uint64_t runtime;
|
||||||
|
UINT32 intSave;
|
||||||
|
UINT32 tid = ((UINT32) ~((clockID) >> CPUCLOCK_ID_OFFSET));
|
||||||
|
|
||||||
|
if (OS_TID_CHECK_INVALID(tid)) {
|
||||||
|
return -ESRCH;
|
||||||
|
}
|
||||||
|
LosTaskCB *task = OsGetTaskCB(tid);
|
||||||
|
|
||||||
|
if (OsCurrTaskGet()->processID != task->processID) {
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
SCHEDULER_LOCK(intSave);
|
||||||
|
runtime = task->taskCpup.allTime;
|
||||||
|
SCHEDULER_UNLOCK(intSave);
|
||||||
|
|
||||||
|
ats->tv_sec = runtime / OS_SYS_NS_PER_SECOND;
|
||||||
|
ats->tv_nsec = runtime % OS_SYS_NS_PER_SECOND;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int ProcessGetCputime(clockid_t clockID, struct timespec *ats)
|
||||||
|
{
|
||||||
|
UINT64 runtime;
|
||||||
|
UINT32 intSave;
|
||||||
|
const pid_t pid = ((pid_t) ~((clockID) >> CPUCLOCK_ID_OFFSET));
|
||||||
|
LosProcessCB *spcb = NULL;
|
||||||
|
|
||||||
|
if (OsProcessIDUserCheckInvalid(pid) || pid < 0) {
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
spcb = OS_PCB_FROM_PID(pid);
|
||||||
|
if (OsProcessIsUnused(spcb)) {
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
SCHEDULER_LOCK(intSave);
|
||||||
|
runtime = spcb->processCpup.allTime;
|
||||||
|
SCHEDULER_UNLOCK(intSave);
|
||||||
|
|
||||||
|
ats->tv_sec = runtime / OS_SYS_NS_PER_SECOND;
|
||||||
|
ats->tv_nsec = runtime % OS_SYS_NS_PER_SECOND;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int GetCputime(clockid_t clockID, struct timespec *tp)
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
if (clockID >= 0) {
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((UINT32)clockID & CPUCLOCK_PERTHREAD_MASK) {
|
||||||
|
ret = PthreadGetCputime(clockID, tp);
|
||||||
|
} else {
|
||||||
|
ret = ProcessGetCputime(clockID, tp);
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
int clock_gettime(clockid_t clockID, struct timespec *tp)
|
int clock_gettime(clockid_t clockID, struct timespec *tp)
|
||||||
{
|
{
|
||||||
UINT32 intSave;
|
UINT32 intSave;
|
||||||
struct timespec64 tmp = {0};
|
struct timespec64 tmp = {0};
|
||||||
struct timespec64 hwTime = {0};
|
struct timespec64 hwTime = {0};
|
||||||
|
int ret;
|
||||||
|
|
||||||
if ((clockID > MAX_CLOCKS) || (clockID < CLOCK_REALTIME)) {
|
if (clockID > MAX_CLOCKS) {
|
||||||
goto ERROUT;
|
goto ERROUT;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -497,7 +568,14 @@ int clock_gettime(clockid_t clockID, struct timespec *tp)
|
||||||
case CLOCK_TAI:
|
case CLOCK_TAI:
|
||||||
TIME_RETURN(ENOTSUP);
|
TIME_RETURN(ENOTSUP);
|
||||||
default:
|
default:
|
||||||
goto ERROUT;
|
{
|
||||||
|
#ifdef LOSCFG_KERNEL_CPUP
|
||||||
|
ret = GetCputime(clockID, tp);
|
||||||
|
TIME_RETURN(-ret);
|
||||||
|
#else
|
||||||
|
TIME_RETURN(EINVAL);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -506,8 +584,45 @@ ERROUT:
|
||||||
TIME_RETURN(EINVAL);
|
TIME_RETURN(EINVAL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int CheckClock(const clockid_t clockID)
|
||||||
|
{
|
||||||
|
int error = 0;
|
||||||
|
const pid_t pid = ((pid_t) ~((clockID) >> CPUCLOCK_ID_OFFSET));
|
||||||
|
|
||||||
|
if (!((UINT32)clockID & CPUCLOCK_PERTHREAD_MASK)) {
|
||||||
|
LosProcessCB *spcb = NULL;
|
||||||
|
if (OsProcessIDUserCheckInvalid(pid) || pid < 0) {
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
spcb = OS_PCB_FROM_PID(pid);
|
||||||
|
if (OsProcessIsUnused(spcb)) {
|
||||||
|
error = -EINVAL;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
error = -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
return error;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int CpuClockGetres(const clockid_t clockID, struct timespec *tp)
|
||||||
|
{
|
||||||
|
if (clockID > 0) {
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
int error = CheckClock(clockID);
|
||||||
|
if (!error) {
|
||||||
|
error = ProcessGetCputime(clockID, tp);
|
||||||
|
}
|
||||||
|
|
||||||
|
return error;
|
||||||
|
}
|
||||||
|
|
||||||
int clock_getres(clockid_t clockID, struct timespec *tp)
|
int clock_getres(clockid_t clockID, struct timespec *tp)
|
||||||
{
|
{
|
||||||
|
int ret;
|
||||||
|
|
||||||
if (tp == NULL) {
|
if (tp == NULL) {
|
||||||
TIME_RETURN(EINVAL);
|
TIME_RETURN(EINVAL);
|
||||||
}
|
}
|
||||||
|
@ -536,7 +651,14 @@ int clock_getres(clockid_t clockID, struct timespec *tp)
|
||||||
case CLOCK_TAI:
|
case CLOCK_TAI:
|
||||||
TIME_RETURN(ENOTSUP);
|
TIME_RETURN(ENOTSUP);
|
||||||
default:
|
default:
|
||||||
|
#ifdef LOSCFG_KERNEL_CPUP
|
||||||
|
{
|
||||||
|
ret = CpuClockGetres(clockID, tp);
|
||||||
|
TIME_RETURN(-ret);
|
||||||
|
}
|
||||||
|
#else
|
||||||
TIME_RETURN(EINVAL);
|
TIME_RETURN(EINVAL);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
TIME_RETURN(0);
|
TIME_RETURN(0);
|
||||||
|
|
|
@ -327,6 +327,17 @@ HWTEST_F(PosixPthreadTest, ItPosixPthread022, TestSize.Level0)
|
||||||
ItPosixPthread022(); // pthread_cancel
|
ItPosixPthread022(); // pthread_cancel
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* *
|
||||||
|
* @tc.name: IT_POSIX_PTHREAD_203
|
||||||
|
* @tc.desc: function for pthread concurrency
|
||||||
|
* @tc.type: FUNC
|
||||||
|
* @tc.require: AR000EEMQ9
|
||||||
|
*/
|
||||||
|
HWTEST_F(PosixPthreadTest, ItPosixPthread203, TestSize.Level0)
|
||||||
|
{
|
||||||
|
ItPosixPthread203();
|
||||||
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(LOSCFG_USER_TEST_FULL)
|
#if defined(LOSCFG_USER_TEST_FULL)
|
||||||
|
|
|
@ -293,5 +293,38 @@ HWTEST_F(ProcessMutexTest, ItTestPthreadMutex022, TestSize.Level0)
|
||||||
{
|
{
|
||||||
ItTestPthreadMutex022();
|
ItTestPthreadMutex022();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* *
|
||||||
|
* @tc.name: it_test_pthread_mutex_023
|
||||||
|
* @tc.desc: function for test mutexattr robust
|
||||||
|
* @tc.type: FUNC
|
||||||
|
* @tc.require: AR000E0QAB
|
||||||
|
*/
|
||||||
|
HWTEST_F(ProcessMutexTest, ItTestPthreadMutex023, TestSize.Level0)
|
||||||
|
{
|
||||||
|
ItTestPthreadMutex023();
|
||||||
|
}
|
||||||
|
|
||||||
|
/* *
|
||||||
|
* @tc.name: it_test_pthread_mutex_024
|
||||||
|
* @tc.desc: function for test mutexattr robust:error return value
|
||||||
|
* @tc.type: FUNC
|
||||||
|
* @tc.require: AR000E0QAB
|
||||||
|
*/
|
||||||
|
HWTEST_F(ProcessMutexTest, ItTestPthreadMutex024, TestSize.Level0)
|
||||||
|
{
|
||||||
|
ItTestPthreadMutex024();
|
||||||
|
}
|
||||||
|
|
||||||
|
/* *
|
||||||
|
* @tc.name: it_test_pthread_mutex_025
|
||||||
|
* @tc.desc: test mutexattr robust:robustness product deadlock is not set
|
||||||
|
* @tc.type: FUNC
|
||||||
|
* @tc.require: AR000E0QAB
|
||||||
|
*/
|
||||||
|
HWTEST_F(ProcessMutexTest, ItTestPthreadMutex025, TestSize.Level0)
|
||||||
|
{
|
||||||
|
ItTestPthreadMutex025();
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
} // namespace OHOS
|
} // namespace OHOS
|
||||||
|
|
|
@ -147,5 +147,27 @@ HWTEST_F(TimeClockTest, ClockTest010, TestSize.Level0)
|
||||||
ClockTest010();
|
ClockTest010();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* *
|
||||||
|
* @tc.name: ClockTest011
|
||||||
|
* @tc.desc: test pthread_getcpuclockid:get pthread time
|
||||||
|
* @tc.type: FUNC
|
||||||
|
* @tc.require: AR000E0QAB
|
||||||
|
*/
|
||||||
|
HWTEST_F(TimeClockTest, ClockTest011, TestSize.Level0)
|
||||||
|
{
|
||||||
|
ClockTest011();
|
||||||
|
}
|
||||||
|
|
||||||
|
/* *
|
||||||
|
* @tc.name: ClockTest012
|
||||||
|
* @tc.desc: test clock_getcpuclockid:get process time
|
||||||
|
* @tc.type: FUNC
|
||||||
|
* @tc.require: AR000E0QAB
|
||||||
|
*/
|
||||||
|
HWTEST_F(TimeClockTest, ClockTest012, TestSize.Level0)
|
||||||
|
{
|
||||||
|
ClockTest012();
|
||||||
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
} // namespace OHOS
|
} // namespace OHOS
|
||||||
|
|
|
@ -84,8 +84,29 @@ HWTEST_F(TimeTimerTest, TimerTest003, TestSize.Level0)
|
||||||
*/
|
*/
|
||||||
/*HWTEST_F(TimeTimerTest, TimerTest004, TestSize.Level0)
|
/*HWTEST_F(TimeTimerTest, TimerTest004, TestSize.Level0)
|
||||||
{
|
{
|
||||||
TimerTest004(); // bug: musl sigaction handler have only one param.
|
TimerTest004(); // TODO: musl sigaction handler have only one param.
|
||||||
}*/
|
}*/
|
||||||
|
|
||||||
|
/* *
|
||||||
|
* @tc.name: TIME_TEST_TZSET_001
|
||||||
|
* @tc.desc: function for TIME_TEST_TZSET_001
|
||||||
|
* @tc.type: FUNC
|
||||||
|
* @tc.require: AR000EEMQ9
|
||||||
|
*/
|
||||||
|
HWTEST_F(TimeTimerTest, TIME_TEST_TZSET_001, TestSize.Level0)
|
||||||
|
{
|
||||||
|
TIME_TEST_TZSET_001();
|
||||||
|
}
|
||||||
|
|
||||||
|
/* *
|
||||||
|
* @tc.name: TIME_TEST_TZSET_002
|
||||||
|
* @tc.desc: function for TimeTimerTest
|
||||||
|
* @tc.type: FUNC
|
||||||
|
* @tc.require: AR000EEMQ9
|
||||||
|
*/
|
||||||
|
HWTEST_F(TimeTimerTest, TIME_TEST_TZSET_002, TestSize.Level0)
|
||||||
|
{
|
||||||
|
TIME_TEST_TZSET_002();
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
} // namespace OHOS
|
} // namespace OHOS
|
||||||
|
|
Loading…
Reference in New Issue