diff options
| author | zhkag <[email protected]> | 2023-02-01 18:03:40 +0800 |
|---|---|---|
| committer | guo <[email protected]> | 2023-02-07 13:49:03 +0800 |
| commit | 7a1ad00aacbdb3bfc088d2be92b05efd86528fae (patch) | |
| tree | b843836971b687ac53ca62275e5e8f304fc0e4ac /components/libc | |
| parent | 312eb0c412de72519c8819bf03a7cf831568ebc1 (diff) | |
update timer
Diffstat (limited to 'components/libc')
| -rw-r--r-- | components/libc/compilers/common/ctime.c | 96 |
1 files changed, 92 insertions, 4 deletions
diff --git a/components/libc/compilers/common/ctime.c b/components/libc/compilers/common/ctime.c index 17c0ee969e..d457d9f334 100644 --- a/components/libc/compilers/common/ctime.c +++ b/components/libc/compilers/common/ctime.c @@ -918,6 +918,66 @@ static void rtthread_timer_wrapper(void *timerobj) #endif } +#define TIMER_ID_MAX 50 +static struct timer_obj *_g_timerid[TIMER_ID_MAX]; +static int timerid_idx = 0; + +void timer_id_init(void) +{ + for (int i = 0; i < TIMER_ID_MAX; i++) + { + _g_timerid[i] = NULL; + } + timerid_idx = 0; +} + +int timer_id_alloc(void) +{ + for (int i = 0; i < timerid_idx; i++) + { + if (_g_timerid[i] == NULL) + return i; + } + if (timerid_idx < TIMER_ID_MAX) + { + timerid_idx++; + return timerid_idx; /* todo */ + } + + return -1; +} + +struct timer_obj *timer_id_get(int timerid) +{ + struct timer_obj *timer; + timer_id_lock(); + if (_g_timerid[timerid] == NULL) + { + LOG_E("can not find timer!"); + timer_id_unlock(); + return NULL; + } + timer = _g_timerid[timerid]; + timer_id_unlock(); + return timer; +} + +int timer_id_put(int id) +{ + if (_g_timerid[id] == NULL) + return -1; + _g_timerid[id] = NULL; + return 0; +} +int timer_id_lock() +{ +/* todo */ +} + +int timer_id_unlock() +{ + /* todo */ +} /** * @brief Create a per-process timer. * @@ -929,6 +989,7 @@ static void rtthread_timer_wrapper(void *timerobj) int timer_create(clockid_t clockid, struct sigevent *evp, timer_t *timerid) { static int num = 0; + int _timerid = 0; struct timer_obj *timer; char timername[RT_NAME_MAX] = {0}; @@ -969,7 +1030,18 @@ int timer_create(clockid_t clockid, struct sigevent *evp, timer_t *timerid) rt_timer_init(&timer->timer, timername, rtthread_timer_wrapper, timer, 0, RT_TIMER_FLAG_ONE_SHOT | RT_TIMER_FLAG_SOFT_TIMER); } - *timerid = (timer_t)((uintptr_t)timer >> 1); + timer_id_lock(); + _timerid = timer_id_alloc(); + if (_timerid < 0) + { + LOG_E("_timerid overflow!"); + return -1; /* todo:memory leak */ + } + _g_timerid[_timerid] = timer; + *timerid = _timerid; + timer_id_unlock(); + rt_kprintf("_timerid %d\r\n", _timerid); + // *timerid = (timer_t)((uintptr_t)timer >> 1); return 0; } @@ -982,7 +1054,19 @@ RTM_EXPORT(timer_create); */ int timer_delete(timer_t timerid) { - struct timer_obj *timer = (struct timer_obj *)((uintptr_t)timerid << 1); + // struct timer_obj *timer = (struct timer_obj *)((uintptr_t)timerid << 1); + struct timer_obj *timer; + timer_id_lock(); + if (_g_timerid[(int)timerid] == NULL) + { + LOG_E("can not find timer!"); + rt_set_errno(EINVAL); + timer_id_unlock(); + return -1; + } + timer = _g_timerid[(int)timerid]; + timer_id_put(timerid); + timer_id_unlock(); if (timer == RT_NULL || rt_object_get_type(&timer->timer.parent) != RT_Object_Class_Timer) { @@ -1020,7 +1104,8 @@ int timer_getoverrun(timer_t timerid) */ int timer_gettime(timer_t timerid, struct itimerspec *its) { - struct timer_obj *timer = (struct timer_obj *)((uintptr_t)timerid << 1); + // struct timer_obj *timer = (struct timer_obj *)((uintptr_t)timerid << 1); + struct timer_obj *timer = timer_id_get(timerid); rt_tick_t remaining; rt_uint32_t seconds, nanoseconds; @@ -1087,7 +1172,10 @@ RTM_EXPORT(timer_gettime); int timer_settime(timer_t timerid, int flags, const struct itimerspec *value, struct itimerspec *ovalue) { - struct timer_obj *timer = (struct timer_obj *)((uintptr_t)timerid << 1); + // struct timer_obj *timer = (struct timer_obj *)((uintptr_t)timerid << 1); + + rt_kprintf("timerid %d\r\n", timerid); + struct timer_obj *timer = timer_id_get(timerid); if (timer == NULL || rt_object_get_type(&timer->timer.parent) != RT_Object_Class_Timer || value->it_interval.tv_nsec < 0 || |
