You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nuttx.apache.org by li...@apache.org on 2020/09/03 02:20:57 UTC
[incubator-nuttx] 01/02: arch/sim: Mask and restore the host signal
in irq_save and irq_restore
This is an automated email from the ASF dual-hosted git repository.
liuhaitao pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-nuttx.git
commit 5db11a275e5c82d2248673b6269013a2df81cd86
Author: Sebastian Ene <nu...@fitbit.com>
AuthorDate: Sat May 9 19:56:52 2020 +0300
arch/sim: Mask and restore the host signal in irq_save and irq_restore
to avoid the host signal process interrupt the execution of NuttX critical section
Signed-off-by: Sebastian Ene <nu...@fitbit.com>
---
arch/sim/include/irq.h | 26 ++-----------
arch/sim/include/types.h | 2 +-
arch/sim/src/Makefile | 4 +-
arch/sim/src/sim/up_hostirq.c | 88 +++++++++++++++++++++++++++++++++++++++++++
4 files changed, 95 insertions(+), 25 deletions(-)
diff --git a/arch/sim/include/irq.h b/arch/sim/include/irq.h
index 6376039..808266b 100644
--- a/arch/sim/include/irq.h
+++ b/arch/sim/include/irq.h
@@ -41,10 +41,6 @@
#define __ARCH_SIM_INCLUDE_IRQ_H
/****************************************************************************
- * Included Files
- ****************************************************************************/
-
-/****************************************************************************
* Pre-processor Definitions
****************************************************************************/
@@ -89,7 +85,7 @@ struct xcptcontext
#endif
/****************************************************************************
- * Inline functions
+ * Public Function Prototypes
****************************************************************************/
#ifndef __ASSEMBLY__
@@ -102,31 +98,17 @@ extern "C"
#define EXTERN extern
#endif
-/****************************************************************************
- * Name: up_irqinitialize
- ****************************************************************************/
-
-static inline void up_irqinitialize(void)
-{
-}
-
/* Name: up_irq_save, up_irq_restore, and friends.
*
- * NOTE: This function should never be called from application code and,
+ * NOTE: These functions should never be called from application code and,
* as a general rule unless you really know what you are doing, this
* function should not be called directly from operation system code either:
* Typically, the wrapper functions, enter_critical_section() and
* leave_critical section(), are probably what you really want.
*/
-static inline irqstate_t up_irq_save(void)
-{
- return 0;
-}
-
-static inline void up_irq_restore(irqstate_t flags)
-{
-}
+irqstate_t up_irq_save(void);
+void up_irq_restore(irqstate_t flags);
#undef EXTERN
#ifdef __cplusplus
diff --git a/arch/sim/include/types.h b/arch/sim/include/types.h
index 7181a0b..d9d4fd3 100644
--- a/arch/sim/include/types.h
+++ b/arch/sim/include/types.h
@@ -121,7 +121,7 @@ typedef unsigned int _size_t;
* up_irq_save()
*/
-typedef unsigned int irqstate_t;
+typedef _uint64_t irqstate_t;
#endif /* __ASSEMBLY__ */
diff --git a/arch/sim/src/Makefile b/arch/sim/src/Makefile
index 79ce661..9df182d 100644
--- a/arch/sim/src/Makefile
+++ b/arch/sim/src/Makefile
@@ -83,7 +83,8 @@ ifeq ($(CONFIG_HOST_MACOS),y)
HOSTCFLAGS += -Wno-deprecated-declarations
endif
-HOSTSRCS = up_hostmemory.c up_hosttime.c
+HOSTSRCS = up_hostirq.c up_hostmemory.c up_hosttime.c
+STDLIBS += -lpthread
ifneq ($(CONFIG_HOST_MACOS),y)
STDLIBS += -lrt
endif
@@ -108,7 +109,6 @@ ifeq ($(CONFIG_SCHED_INSTRUMENTATION),y)
HOSTCFLAGS += -DCONFIG_SCHED_INSTRUMENTATION=1
endif
HOSTSRCS += up_simsmp.c
- STDLIBS += -lpthread
endif
ifeq ($(CONFIG_SCHED_INSTRUMENTATION),y)
diff --git a/arch/sim/src/sim/up_hostirq.c b/arch/sim/src/sim/up_hostirq.c
new file mode 100644
index 0000000..9acbd59
--- /dev/null
+++ b/arch/sim/src/sim/up_hostirq.c
@@ -0,0 +1,88 @@
+/****************************************************************************
+ * arch/sim/src/sim/up_hostirq.c
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership. The
+ * ASF licenses this file to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ *
+ ****************************************************************************/
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+#include <signal.h>
+#include <stddef.h>
+#include <stdint.h>
+
+/****************************************************************************
+ * Private Types
+ ****************************************************************************/
+
+union sigset_u
+{
+ uint64_t flags;
+ sigset_t sigset;
+};
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: up_irq_save
+ *
+ * Description:
+ * Disable interrupts and returned the mask before disabling them.
+ *
+ ****************************************************************************/
+
+uint64_t up_irq_save(void)
+{
+ union sigset_u nmask;
+ union sigset_u omask;
+
+ sigfillset(&nmask.sigset);
+ pthread_sigmask(SIG_SETMASK, &nmask.sigset, &omask.sigset);
+
+ return omask.flags;
+}
+
+/****************************************************************************
+ * Name: up_irq_restore
+ *
+ * Input Parameters:
+ * flags - the mask used to restore interrupts
+ *
+ * Description:
+ * Re-enable interrupts using the specified mask in flags argument.
+ *
+ ****************************************************************************/
+
+void up_irq_restore(uint64_t flags)
+{
+ union sigset_u nmask;
+
+ sigemptyset(&nmask.sigset);
+ nmask.flags = flags;
+ pthread_sigmask(SIG_SETMASK, &nmask.sigset, NULL);
+}
+
+/****************************************************************************
+ * Name: up_irqinitialize
+ ****************************************************************************/
+
+void up_irqinitialize(void)
+{
+}