diff --git a/include/kernel/mr_ktimer.h b/include/kernel/mr_ktimer.h index 02c9697..c52163f 100644 --- a/include/kernel/mr_ktimer.h +++ b/include/kernel/mr_ktimer.h @@ -25,7 +25,7 @@ extern "C" { */ #if defined(MR_USE_KTIMER) -/* Periodic definition */ +/* Ktimer periodic definition */ #define MR_KTIMER_PERIODIC (1U << 31) /* Ktimer type */ @@ -61,13 +61,13 @@ mr_err_t mr_ktimer_init(mr_ktimer_t *ktimer, const char *name, void *args, mr_tick_t tick); /** - * @brief This function create a timer. + * @brief This function create a ktimer. * - * @param name The timer name. - * @param entry The timer entry. - * @param args The timer args. - * @param tick The timer tick. - * @return The timer on success, or MR_NULL on failure. + * @param name The ktimer name. + * @param entry The ktimer entry. + * @param args The ktimer args. + * @param tick The ktimer tick. + * @return The ktimer on success, or MR_NULL on failure. */ mr_ktimer_t *mr_ktimer_create(const char *name, void (*entry)(mr_ktimer_t *ktimer, void *args), @@ -108,6 +108,16 @@ mr_err_t mr_ktimer_stop(mr_ktimer_t *ktimer); */ mr_err_t mr_ktimer_tick_set(mr_ktimer_t *ktimer, mr_tick_t tick); +/** + * @brief This function check if a ktimer is running. + * + * @param ktimer The ktimer. + * @return MR_TRUE if the ktimer is running, MR_FALSE otherwise. + */ +MR_INLINE mr_bool_t mr_ktimer_is_running(mr_ktimer_t *ktimer) { + return mr_klist_is_empty(&ktimer->list); +} + /** * @brief This function find a ktimer. * diff --git a/include/mr_x.h b/include/mr_x.h index f59188b..422473f 100644 --- a/include/mr_x.h +++ b/include/mr_x.h @@ -16,6 +16,7 @@ #include #include +#include #include #include #include diff --git a/kernel/kobject.c b/kernel/kobject.c index ba97658..cd32ed4 100644 --- a/kernel/kobject.c +++ b/kernel/kobject.c @@ -235,16 +235,9 @@ MR_INLINE mr_err_t kobject_add(mr_kobject_t *kobj, mr_kobject_t *parent, return -MR_EEXIST; } - /* Get parent */ - parent = mr_kobject_get(parent); - if (!parent) { - return -MR_ENOENT; - } - /* Allocate name */ ret = kobject_name_alloc(kobj, path); if (ret != 0) { - mr_kobject_put(parent); return ret; } @@ -261,6 +254,12 @@ MR_INLINE mr_err_t kobject_add_varg(mr_kobject_t *kobj, mr_kobject_t *parent, mr_err_t ret; int mask; + /* Get parent */ + parent = mr_kobject_get(parent); + if (!parent) { + return -MR_EINVAL; + } + /* Lock */ mask = mr_kspinlock_lock_irqsave(&klock); @@ -284,6 +283,11 @@ MR_INLINE mr_err_t kobject_add_varg(mr_kobject_t *kobj, mr_kobject_t *parent, _exit: /* Unlock */ mr_kspinlock_unlock_irqrestore(&klock, mask); + + /* Put parent */ + if (ret != 0) { + mr_kobject_put(parent); + } return ret; } @@ -311,14 +315,12 @@ MR_INLINE void kobject_del(mr_kobject_t *kobj) { /* Lock */ mask = mr_kspinlock_lock_irqsave(&klock); - /* Already deleted */ - if (mr_klist_is_empty(&kobj->entry)) { - goto _exit; + /* Check kobject is deleted */ + if (!mr_klist_is_empty(&kobj->entry)) { + /* Remove kobject from parent */ + mr_klist_del(&kobj->entry); } - /* Remove kobject from parent */ - mr_klist_del(&kobj->entry); -_exit: /* Unlock */ mr_kspinlock_unlock_irqrestore(&klock, mask); } @@ -344,6 +346,12 @@ MR_INLINE mr_kobject_t *kobject_lookup_varg(mr_kobject_t *parent, mr_err_t ret; int mask; + /* Get parent */ + parent = mr_kobject_get(parent); + if (!parent) { + return MR_NULL; + } + /* Lock */ mask = mr_kspinlock_lock_irqsave(&klock); @@ -365,6 +373,9 @@ MR_INLINE mr_kobject_t *kobject_lookup_varg(mr_kobject_t *parent, _exit: /* Unlock */ mr_kspinlock_unlock_irqrestore(&klock, mask); + + /* Put parent */ + mr_kobject_put(parent); return kobj; } diff --git a/kernel/ktimer.c b/kernel/ktimer.c index daffc00..3dc689d 100644 --- a/kernel/ktimer.c +++ b/kernel/ktimer.c @@ -94,8 +94,9 @@ MR_INLINE void ktimer_del(mr_ktimer_t *ktimer) { /* Lock */ mask = mr_kspinlock_lock_irqsave(&klock); - /* Remove ktimer from ktimer list */ + /* Check ktimer is deleted */ if (!mr_klist_is_empty(&ktimer->list)) { + /* Remove ktimer from timer list */ mr_klist_del(&ktimer->list); } @@ -118,15 +119,15 @@ mr_err_t mr_ktimer_del(mr_ktimer_t *ktimer) { } MR_INLINE void ktimer_insert(mr_ktimer_t *ktimer) { - mr_tick_t tick; mr_ktimer_t *t; + mr_tick_t tick; mr_klist_t *l; /* Set timeout tick */ tick = ktimer->init_tick & ~MR_KTIMER_PERIODIC; ktimer->timeout_tick = mr_kclock_tick() + tick; - /* Insert ktimer into ktimer list */ + /* Insert ktimer into timer list */ MR_KLIST_FOR_EACH(l, &klist) { t = MR_KLIST_ENTRY(l, mr_ktimer_t, list); if ((ktimer->timeout_tick - t->timeout_tick) < (MR_TICK_MAX / 2)) { @@ -148,7 +149,7 @@ MR_INLINE void ktimer_start(mr_ktimer_t *ktimer) { /* Lock */ mask = mr_kspinlock_lock_irqsave(&klock); - /* Insert ktimer into ktimer list */ + /* Insert ktimer into timer list */ ktimer_insert(ktimer); /* Unlock */ @@ -183,7 +184,7 @@ MR_INLINE void ktimer_tick_set(mr_ktimer_t *ktimer, mr_tick_t tick) { /* Lock */ mask = mr_kspinlock_lock_irqsave(&klock); - /* Remove ktimer from ktimer list */ + /* Remove ktimer from timer list */ if (!mr_klist_is_empty(&ktimer->list)) { mr_klist_del(&ktimer->list); }