This is an automated email from the ASF dual-hosted git repository. xiaoxiang pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/nuttx.git
The following commit(s) were added to refs/heads/master by this push:
new 12cd59b3e6 arch_atomic: use small lock in
libs/libc/machine/arch_atomic.c
12cd59b3e6 is described below
commit 12cd59b3e67fbb84793da6e11c83915f6ee32108
Author: hujun5 <[email protected]>
AuthorDate: Tue Nov 19 18:23:54 2024 +0800
arch_atomic: use small lock in libs/libc/machine/arch_atomic.c
Signed-off-by: hujun5 <[email protected]>
---
libs/libc/machine/arch_atomic.c | 492 ++++++++++++++++++++--------------------
1 file changed, 249 insertions(+), 243 deletions(-)
diff --git a/libs/libc/machine/arch_atomic.c b/libs/libc/machine/arch_atomic.c
index bdecc8c057..5c22cdc0bc 100644
--- a/libs/libc/machine/arch_atomic.c
+++ b/libs/libc/machine/arch_atomic.c
@@ -31,287 +31,293 @@
#include <nuttx/spinlock.h>
#include <nuttx/macro.h>
+/****************************************************************************
+ * Pivate Data
+ ****************************************************************************/
+
+static spinlock_t g_atomic_lock = SP_UNLOCKED;
+
/****************************************************************************
* Pre-processor Definitions
****************************************************************************/
-#define STORE(fn, n, type) \
- \
- void weak_function CONCATENATE(fn, n) (FAR volatile void *ptr, \
- type value, int memorder) \
- { \
- irqstate_t irqstate = spin_lock_irqsave(NULL); \
- \
- *(FAR type *)ptr = value; \
- \
- spin_unlock_irqrestore(NULL, irqstate); \
+#define STORE(fn, n, type) \
+ \
+ void weak_function CONCATENATE(fn, n)(FAR volatile void *ptr, \
+ type value, int memorder) \
+ { \
+ irqstate_t irqstate = spin_lock_irqsave_wo_note(&g_atomic_lock); \
+ \
+ *(FAR type *)ptr = value; \
+ \
+ spin_unlock_irqrestore_wo_note(&g_atomic_lock, irqstate); \
}
-#define LOAD(fn, n, type) \
- \
- type weak_function CONCATENATE(fn, n) (FAR const volatile void *ptr, \
- int memorder) \
- { \
- irqstate_t irqstate = spin_lock_irqsave(NULL); \
- \
- type ret = *(FAR type *)ptr; \
- \
- spin_unlock_irqrestore(NULL, irqstate); \
- return ret; \
+#define LOAD(fn, n, type) \
+ \
+ type weak_function CONCATENATE(fn, n)(FAR const volatile void *ptr, \
+ int memorder) \
+ { \
+ irqstate_t irqstate = spin_lock_irqsave_wo_note(&g_atomic_lock); \
+ \
+ type ret = *(FAR type *)ptr; \
+ \
+ spin_unlock_irqrestore_wo_note(&g_atomic_lock, irqstate); \
+ return ret; \
}
-#define EXCHANGE(fn, n, type) \
- \
- type weak_function CONCATENATE(fn, n) (FAR volatile void *ptr, \
- type value, int memorder) \
- { \
- irqstate_t irqstate = spin_lock_irqsave(NULL); \
- FAR type *tmp = (FAR type *)ptr; \
- \
- type ret = *tmp; \
- *tmp = value; \
- \
- spin_unlock_irqrestore(NULL, irqstate); \
- return ret; \
+#define EXCHANGE(fn, n, type) \
+ \
+ type weak_function CONCATENATE(fn, n)(FAR volatile void *ptr, \
+ type value, int memorder) \
+ { \
+ irqstate_t irqstate = spin_lock_irqsave_wo_note(&g_atomic_lock); \
+ FAR type *tmp = (FAR type *)ptr; \
+ \
+ type ret = *tmp; \
+ *tmp = value; \
+ \
+ spin_unlock_irqrestore_wo_note(&g_atomic_lock, irqstate); \
+ return ret; \
}
-#define CMP_EXCHANGE(fn, n, type) \
- \
- bool weak_function CONCATENATE(fn, n) (FAR volatile void *mem, \
- FAR void *expect, \
- type desired, bool weak, \
- int success, int failure) \
- { \
- bool ret = false; \
- irqstate_t irqstate = spin_lock_irqsave(NULL); \
- FAR type *tmpmem = (FAR type *)mem; \
- FAR type *tmpexp = (FAR type *)expect; \
- \
- if (*tmpmem == *tmpexp) \
- { \
- ret = true; \
- *tmpmem = desired; \
- } \
- else \
- { \
- *tmpexp = *tmpmem; \
- } \
- \
- spin_unlock_irqrestore(NULL, irqstate); \
- return ret; \
+#define CMP_EXCHANGE(fn, n, type) \
+ \
+ bool weak_function CONCATENATE(fn, n)(FAR volatile void *mem, \
+ FAR void *expect, \
+ type desired, bool weak, \
+ int success, int failure) \
+ { \
+ bool ret = false; \
+ irqstate_t irqstate = spin_lock_irqsave_wo_note(&g_atomic_lock); \
+ FAR type *tmpmem = (FAR type *)mem; \
+ FAR type *tmpexp = (FAR type *)expect; \
+ \
+ if (*tmpmem == *tmpexp) \
+ { \
+ ret = true; \
+ *tmpmem = desired; \
+ } \
+ else \
+ { \
+ *tmpexp = *tmpmem; \
+ } \
+ \
+ spin_unlock_irqrestore_wo_note(&g_atomic_lock, irqstate); \
+ return ret; \
}
-#define FLAG_TEST_AND_SET(fn, n, type) \
- \
- type weak_function CONCATENATE(fn, n) (FAR volatile void *ptr, \
- int memorder) \
- { \
- irqstate_t irqstate = spin_lock_irqsave(NULL); \
- FAR type *tmp = (FAR type *)ptr; \
- type ret = *tmp; \
- \
- *(FAR type *)ptr = 1; \
- \
- spin_unlock_irqrestore(NULL, irqstate); \
- return ret; \
+#define FLAG_TEST_AND_SET(fn, n, type) \
+ \
+ type weak_function CONCATENATE(fn, n)(FAR volatile void *ptr, \
+ int memorder) \
+ { \
+ irqstate_t irqstate = spin_lock_irqsave_wo_note(&g_atomic_lock); \
+ FAR type *tmp = (FAR type *)ptr; \
+ type ret = *tmp; \
+ \
+ *(FAR type *)ptr = 1; \
+ \
+ spin_unlock_irqrestore_wo_note(&g_atomic_lock, irqstate); \
+ return ret; \
}
-#define FETCH_ADD(fn, n, type) \
- \
- type weak_function CONCATENATE(fn, n) (FAR volatile void *ptr, \
- type value, int memorder) \
- { \
- irqstate_t irqstate = spin_lock_irqsave(NULL); \
- FAR type *tmp = (FAR type *)ptr; \
- type ret = *tmp; \
- \
- *tmp = *tmp + value; \
- \
- spin_unlock_irqrestore(NULL, irqstate); \
- return ret; \
+#define FETCH_ADD(fn, n, type) \
+ \
+ type weak_function CONCATENATE(fn, n)(FAR volatile void *ptr, \
+ type value, int memorder) \
+ { \
+ irqstate_t irqstate = spin_lock_irqsave_wo_note(&g_atomic_lock); \
+ FAR type *tmp = (FAR type *)ptr; \
+ type ret = *tmp; \
+ \
+ *tmp = *tmp + value; \
+ \
+ spin_unlock_irqrestore_wo_note(&g_atomic_lock, irqstate); \
+ return ret; \
}
-#define FETCH_SUB(fn, n, type) \
- \
- type weak_function CONCATENATE(fn, n) (FAR volatile void *ptr, \
- type value, int memorder) \
- { \
- irqstate_t irqstate = spin_lock_irqsave(NULL); \
- FAR type *tmp = (FAR type *)ptr; \
- type ret = *tmp; \
- \
- *tmp = *tmp - value; \
- \
- spin_unlock_irqrestore(NULL, irqstate); \
- return ret; \
+#define FETCH_SUB(fn, n, type) \
+ \
+ type weak_function CONCATENATE(fn, n)(FAR volatile void *ptr, \
+ type value, int memorder) \
+ { \
+ irqstate_t irqstate = spin_lock_irqsave_wo_note(&g_atomic_lock); \
+ FAR type *tmp = (FAR type *)ptr; \
+ type ret = *tmp; \
+ \
+ *tmp = *tmp - value; \
+ \
+ spin_unlock_irqrestore_wo_note(&g_atomic_lock, irqstate); \
+ return ret; \
}
-#define FETCH_AND(fn, n, type) \
- \
- type weak_function CONCATENATE(fn, n) (FAR volatile void *ptr, \
- type value, int memorder) \
- { \
- irqstate_t irqstate = spin_lock_irqsave(NULL); \
- FAR type *tmp = (FAR type *)ptr; \
- type ret = *tmp; \
- \
- *tmp = *tmp & value; \
- \
- spin_unlock_irqrestore(NULL, irqstate); \
- return ret; \
+#define FETCH_AND(fn, n, type) \
+ \
+ type weak_function CONCATENATE(fn, n)(FAR volatile void *ptr, \
+ type value, int memorder) \
+ { \
+ irqstate_t irqstate = spin_lock_irqsave_wo_note(&g_atomic_lock); \
+ FAR type *tmp = (FAR type *)ptr; \
+ type ret = *tmp; \
+ \
+ *tmp = *tmp & value; \
+ \
+ spin_unlock_irqrestore_wo_note(&g_atomic_lock, irqstate); \
+ return ret; \
}
-#define FETCH_OR(fn, n, type) \
- \
- type weak_function CONCATENATE(fn, n) (FAR volatile void *ptr, \
- type value, int memorder) \
- { \
- irqstate_t irqstate = spin_lock_irqsave(NULL); \
- FAR type *tmp = (FAR type *)ptr; \
- type ret = *tmp; \
- \
- *tmp = *tmp | value; \
- \
- spin_unlock_irqrestore(NULL, irqstate); \
- return ret; \
+#define FETCH_OR(fn, n, type) \
+ \
+ type weak_function CONCATENATE(fn, n)(FAR volatile void *ptr, \
+ type value, int memorder) \
+ { \
+ irqstate_t irqstate = spin_lock_irqsave_wo_note(&g_atomic_lock); \
+ FAR type *tmp = (FAR type *)ptr; \
+ type ret = *tmp; \
+ \
+ *tmp = *tmp | value; \
+ \
+ spin_unlock_irqrestore_wo_note(&g_atomic_lock, irqstate); \
+ return ret; \
}
-#define FETCH_XOR(fn, n, type) \
- \
- type weak_function CONCATENATE(fn, n) (FAR volatile void *ptr, \
- type value, int memorder) \
- { \
- irqstate_t irqstate = spin_lock_irqsave(NULL); \
- FAR type *tmp = (FAR type *)ptr; \
- type ret = *tmp; \
- \
- *tmp = *tmp ^ value; \
- \
- spin_unlock_irqrestore(NULL, irqstate); \
- return ret; \
+#define FETCH_XOR(fn, n, type) \
+ \
+ type weak_function CONCATENATE(fn, n)(FAR volatile void *ptr, \
+ type value, int memorder) \
+ { \
+ irqstate_t irqstate = spin_lock_irqsave_wo_note(&g_atomic_lock); \
+ FAR type *tmp = (FAR type *)ptr; \
+ type ret = *tmp; \
+ \
+ *tmp = *tmp ^ value; \
+ \
+ spin_unlock_irqrestore_wo_note(&g_atomic_lock, irqstate); \
+ return ret; \
}
-#define SYNC_ADD_FETCH(fn, n, type) \
- \
- type weak_function CONCATENATE(fn, n) (FAR volatile void *ptr, \
- type value) \
- { \
- irqstate_t irqstate = spin_lock_irqsave(NULL); \
- FAR type *tmp = (FAR type *)ptr; \
- \
- *tmp = *tmp + value; \
- \
- spin_unlock_irqrestore(NULL, irqstate); \
- return *tmp; \
+#define SYNC_ADD_FETCH(fn, n, type) \
+ \
+ type weak_function CONCATENATE(fn, n)(FAR volatile void *ptr, \
+ type value) \
+ { \
+ irqstate_t irqstate = spin_lock_irqsave_wo_note(&g_atomic_lock); \
+ FAR type *tmp = (FAR type *)ptr; \
+ \
+ *tmp = *tmp + value; \
+ \
+ spin_unlock_irqrestore_wo_note(&g_atomic_lock, irqstate); \
+ return *tmp; \
}
-#define SYNC_SUB_FETCH(fn, n, type) \
- \
- type weak_function CONCATENATE(fn, n) (FAR volatile void *ptr, \
- type value) \
- { \
- irqstate_t irqstate = spin_lock_irqsave(NULL); \
- FAR type *tmp = (FAR type *)ptr; \
- \
- *tmp = *tmp - value; \
- \
- spin_unlock_irqrestore(NULL, irqstate); \
- return *tmp; \
+#define SYNC_SUB_FETCH(fn, n, type) \
+ \
+ type weak_function CONCATENATE(fn, n)(FAR volatile void *ptr, \
+ type value) \
+ { \
+ irqstate_t irqstate = spin_lock_irqsave_wo_note(&g_atomic_lock); \
+ FAR type *tmp = (FAR type *)ptr; \
+ \
+ *tmp = *tmp - value; \
+ \
+ spin_unlock_irqrestore_wo_note(&g_atomic_lock, irqstate); \
+ return *tmp; \
}
-#define SYNC_OR_FETCH(fn, n, type) \
- \
- type weak_function CONCATENATE(fn, n) (FAR volatile void *ptr, \
- type value) \
- { \
- irqstate_t irqstate = spin_lock_irqsave(NULL); \
- FAR type *tmp = (FAR type *)ptr; \
- \
- *tmp = *tmp | value; \
- \
- spin_unlock_irqrestore(NULL, irqstate); \
- return *tmp; \
+#define SYNC_OR_FETCH(fn, n, type) \
+ \
+ type weak_function CONCATENATE(fn, n)(FAR volatile void *ptr, \
+ type value) \
+ { \
+ irqstate_t irqstate = spin_lock_irqsave_wo_note(&g_atomic_lock); \
+ FAR type *tmp = (FAR type *)ptr; \
+ \
+ *tmp = *tmp | value; \
+ \
+ spin_unlock_irqrestore_wo_note(&g_atomic_lock, irqstate); \
+ return *tmp; \
}
-#define SYNC_AND_FETCH(fn, n, type) \
- \
- type weak_function CONCATENATE(fn, n) (FAR volatile void *ptr, \
- type value) \
- { \
- irqstate_t irqstate = spin_lock_irqsave(NULL); \
- FAR type *tmp = (FAR type *)ptr; \
- \
- *tmp = *tmp & value; \
- \
- spin_unlock_irqrestore(NULL, irqstate); \
- return *tmp; \
+#define SYNC_AND_FETCH(fn, n, type) \
+ \
+ type weak_function CONCATENATE(fn, n)(FAR volatile void *ptr, \
+ type value) \
+ { \
+ irqstate_t irqstate = spin_lock_irqsave_wo_note(&g_atomic_lock); \
+ FAR type *tmp = (FAR type *)ptr; \
+ \
+ *tmp = *tmp & value; \
+ \
+ spin_unlock_irqrestore_wo_note(&g_atomic_lock, irqstate); \
+ return *tmp; \
}
-#define SYNC_XOR_FETCH(fn, n, type) \
- \
- type weak_function CONCATENATE(fn, n) (FAR volatile void *ptr, \
- type value) \
- { \
- irqstate_t irqstate = spin_lock_irqsave(NULL); \
- FAR type *tmp = (FAR type *)ptr; \
- \
- *tmp = *tmp ^ value; \
- \
- spin_unlock_irqrestore(NULL, irqstate); \
- return *tmp; \
+#define SYNC_XOR_FETCH(fn, n, type) \
+ \
+ type weak_function CONCATENATE(fn, n)(FAR volatile void *ptr, \
+ type value) \
+ { \
+ irqstate_t irqstate = spin_lock_irqsave_wo_note(&g_atomic_lock); \
+ FAR type *tmp = (FAR type *)ptr; \
+ \
+ *tmp = *tmp ^ value; \
+ \
+ spin_unlock_irqrestore_wo_note(&g_atomic_lock, irqstate); \
+ return *tmp; \
}
-#define SYNC_NAND_FETCH(fn, n, type) \
- \
- type weak_function CONCATENATE(fn, n) (FAR volatile void *ptr, \
- type value) \
- { \
- irqstate_t irqstate = spin_lock_irqsave(NULL); \
- FAR type *tmp = (FAR type *)ptr; \
- \
- *tmp = ~(*tmp & value); \
- \
- spin_unlock_irqrestore(NULL, irqstate); \
- return *tmp; \
+#define SYNC_NAND_FETCH(fn, n, type) \
+ \
+ type weak_function CONCATENATE(fn, n)(FAR volatile void *ptr, \
+ type value) \
+ { \
+ irqstate_t irqstate = spin_lock_irqsave_wo_note(&g_atomic_lock); \
+ FAR type *tmp = (FAR type *)ptr; \
+ \
+ *tmp = ~(*tmp & value); \
+ \
+ spin_unlock_irqrestore_wo_note(&g_atomic_lock, irqstate); \
+ return *tmp; \
}
-#define SYNC_BOOL_CMP_SWAP(fn, n, type) \
- \
- bool weak_function CONCATENATE(fn, n) (FAR volatile void *ptr, \
- type oldvalue, \
- type newvalue) \
- { \
- bool ret = false; \
- irqstate_t irqstate = spin_lock_irqsave(NULL); \
- FAR type *tmp = (FAR type *)ptr; \
- \
- if (*tmp == oldvalue) \
- { \
- ret = true; \
- *tmp = newvalue; \
- } \
- \
- spin_unlock_irqrestore(NULL, irqstate); \
- return ret; \
+#define SYNC_BOOL_CMP_SWAP(fn, n, type) \
+ \
+ bool weak_function CONCATENATE(fn, n)(FAR volatile void *ptr, \
+ type oldvalue, \
+ type newvalue) \
+ { \
+ bool ret = false; \
+ irqstate_t irqstate = spin_lock_irqsave_wo_note(&g_atomic_lock); \
+ FAR type *tmp = (FAR type *)ptr; \
+ \
+ if (*tmp == oldvalue) \
+ { \
+ ret = true; \
+ *tmp = newvalue; \
+ } \
+ \
+ spin_unlock_irqrestore_wo_note(&g_atomic_lock, irqstate); \
+ return ret; \
}
-#define SYNC_VAL_CMP_SWAP(fn, n, type) \
- \
- type weak_function CONCATENATE(fn, n) (FAR volatile void *ptr, \
- type oldvalue, \
- type newvalue) \
- { \
- irqstate_t irqstate = spin_lock_irqsave(NULL); \
- FAR type *tmp = (FAR type *)ptr; \
- type ret = *tmp; \
- \
- if (*tmp == oldvalue) \
- { \
- *tmp = newvalue; \
- } \
- \
- spin_unlock_irqrestore(NULL, irqstate); \
- return ret; \
+#define SYNC_VAL_CMP_SWAP(fn, n, type) \
+ \
+ type weak_function CONCATENATE(fn, n)(FAR volatile void *ptr, \
+ type oldvalue, \
+ type newvalue) \
+ { \
+ irqstate_t irqstate = spin_lock_irqsave_wo_note(&g_atomic_lock); \
+ FAR type *tmp = (FAR type *)ptr; \
+ type ret = *tmp; \
+ \
+ if (*tmp == oldvalue) \
+ { \
+ *tmp = newvalue; \
+ } \
+ \
+ spin_unlock_irqrestore_wo_note(&g_atomic_lock, irqstate); \
+ return ret; \
}
/****************************************************************************
