summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorShell <[email protected]>2024-05-16 15:45:12 +0800
committerGitHub <[email protected]>2024-05-16 15:45:12 +0800
commite25fc8b5118fba87acd5bc677641926a913bb3a5 (patch)
treed86b1be0152b2d3f360c83a3922d945f565ecaf0 /src
parente46333496f880afe7ae2864967406f758aec55a7 (diff)
[libcpu/arm64] add C11 atomic ticket spinlock (#8882)
* [libcpu/arm64] add C11 atomic ticket spinlock Replace the former implementation of flag-based spinlock which is unfair Besides, C11 atomic implementation is more readable (it's C anyway), and maintainable. Cause toolchain can use their builtin optimization and tune for different micro-architectures. For example armv8.5 introduces a better instruction. The compiler can help with that when it knows your target platform in support of it. Signed-off-by: Shell <[email protected]> * fixup: RT_CPUS_NR --------- Signed-off-by: Shell <[email protected]>
Diffstat (limited to 'src')
-rw-r--r--src/cpu_mp.c2
-rw-r--r--src/scheduler_mp.c1
-rw-r--r--src/thread.c3
3 files changed, 4 insertions, 2 deletions
diff --git a/src/cpu_mp.c b/src/cpu_mp.c
index 238ddb420b..a10e35f479 100644
--- a/src/cpu_mp.c
+++ b/src/cpu_mp.c
@@ -146,7 +146,7 @@ rt_base_t rt_cpus_lock(void)
pcpu = rt_cpu_self();
if (pcpu->current_thread != RT_NULL)
{
- register rt_ubase_t lock_nest = rt_atomic_load(&(pcpu->current_thread->cpus_lock_nest));
+ rt_ubase_t lock_nest = rt_atomic_load(&(pcpu->current_thread->cpus_lock_nest));
rt_atomic_add(&(pcpu->current_thread->cpus_lock_nest), 1);
if (lock_nest == 0)
diff --git a/src/scheduler_mp.c b/src/scheduler_mp.c
index ee32d9bc60..c1626c5f99 100644
--- a/src/scheduler_mp.c
+++ b/src/scheduler_mp.c
@@ -1089,6 +1089,7 @@ void rt_exit_critical_safe(rt_base_t critical_level)
void rt_exit_critical_safe(rt_base_t critical_level)
{
+ RT_UNUSED(critical_level);
return rt_exit_critical();
}
diff --git a/src/thread.c b/src/thread.c
index 77f65bc68b..8d4752409d 100644
--- a/src/thread.c
+++ b/src/thread.c
@@ -363,7 +363,8 @@ rt_thread_t rt_thread_self(void)
self = rt_cpu_self()->current_thread;
rt_hw_local_irq_enable(lock);
return self;
-#else
+
+#else /* !RT_USING_SMP */
extern rt_thread_t rt_current_thread;
return rt_current_thread;