diff options
| author | Bernard Xiong <[email protected]> | 2019-09-28 11:56:03 +0800 |
|---|---|---|
| committer | Bernard Xiong <[email protected]> | 2019-09-28 11:56:03 +0800 |
| commit | 5cd65092967a1dbaa35bb7fdd80cf3a0e2f9cc9f (patch) | |
| tree | 0a749580fd15aa4715a17db1d4b7315f00fcf0a0 /src/cpu.c | |
| parent | cb07e5fb24afebdf233847da551d3ede80727345 (diff) | |
[Kernel] cleanup code of spinlock in SMP Kernel
Diffstat (limited to 'src/cpu.c')
| -rw-r--r-- | src/cpu.c | 53 |
1 files changed, 16 insertions, 37 deletions
@@ -12,9 +12,12 @@ #include <rthw.h> #ifdef RT_USING_SMP -/*********************************** +static struct rt_cpu rt_cpus[RT_CPUS_NR]; +rt_hw_spinlock_t _cpus_lock; + +/* * disable scheduler - ***********************************/ + */ static void rt_preempt_disable(void) { register rt_base_t level; @@ -23,7 +26,7 @@ static void rt_preempt_disable(void) /* disable interrupt */ level = rt_hw_local_irq_disable(); - current_thread = rt_cpu_self()->current_thread; + current_thread = rt_thread_self(); if (!current_thread) { rt_hw_local_irq_enable(level); @@ -37,9 +40,9 @@ static void rt_preempt_disable(void) rt_hw_local_irq_enable(level); } -/*********************************** - * restore scheduler - ***********************************/ +/* + * enable scheduler + */ static void rt_preempt_enable(void) { register rt_base_t level; @@ -48,7 +51,7 @@ static void rt_preempt_enable(void) /* disable interrupt */ level = rt_hw_local_irq_disable(); - current_thread = rt_cpu_self()->current_thread; + current_thread = rt_thread_self(); if (!current_thread) { rt_hw_local_irq_enable(level); @@ -62,73 +65,49 @@ static void rt_preempt_enable(void) /* enable interrupt */ rt_hw_local_irq_enable(level); } -#endif -void rt_spin_lock_init(rt_spinlock_t *lock) +void rt_spin_lock_init(struct rt_spinlock *lock) { -#ifdef RT_USING_SMP rt_hw_spin_lock_init(&lock->lock); -#endif } RTM_EXPORT(rt_spin_lock_init) -void rt_spin_lock(rt_spinlock_t *lock) +void rt_spin_lock(struct rt_spinlock *lock) { -#ifdef RT_USING_SMP rt_preempt_disable(); rt_hw_spin_lock(&lock->lock); -#else - rt_enter_critical(); -#endif } RTM_EXPORT(rt_spin_lock) -void rt_spin_unlock(rt_spinlock_t *lock) +void rt_spin_unlock(struct rt_spinlock *lock) { -#ifdef RT_USING_SMP rt_hw_spin_unlock(&lock->lock); rt_preempt_enable(); -#else - rt_exit_critical(); -#endif } RTM_EXPORT(rt_spin_unlock) -rt_base_t rt_spin_lock_irqsave(rt_spinlock_t *lock) +rt_base_t rt_spin_lock_irqsave(struct rt_spinlock *lock) { unsigned long level; -#ifdef RT_USING_SMP rt_preempt_disable(); level = rt_hw_local_irq_disable(); rt_hw_spin_lock(&lock->lock); return level; -#else - return rt_hw_interrupt_disable(); -#endif } RTM_EXPORT(rt_spin_lock_irqsave) -void rt_spin_unlock_irqrestore(rt_spinlock_t *lock, rt_base_t level) +void rt_spin_unlock_irqrestore(struct rt_spinlock *lock, rt_base_t level) { -#ifdef RT_USING_SMP rt_hw_spin_unlock(&lock->lock); rt_hw_local_irq_enable(level); rt_preempt_enable(); -#else - rt_hw_interrupt_enable(level); -#endif } RTM_EXPORT(rt_spin_unlock_irqrestore) -#ifdef RT_USING_SMP - -static struct rt_cpu rt_cpus[RT_CPUS_NR]; -rt_hw_spinlock_t _cpus_lock; - /** * This fucntion will return current cpu. */ @@ -155,7 +134,7 @@ rt_base_t rt_cpus_lock(void) pcpu = rt_cpu_self(); if (pcpu->current_thread != RT_NULL) { - register rt_uint16_t lock_nest = pcpu->current_thread->cpus_lock_nest; + register rt_ubase_t lock_nest = pcpu->current_thread->cpus_lock_nest; pcpu->current_thread->cpus_lock_nest++; if (lock_nest == 0) |
