Resa la sig_signal interrupt safe (con il nuovo scheduler IRQ-safe)
authorrasky <rasky@38d2e660-2303-0410-9eaa-f027e97ec537>
Fri, 30 Jul 2004 14:30:27 +0000 (14:30 +0000)
committerrasky <rasky@38d2e660-2303-0410-9eaa-f027e97ec537>
Fri, 30 Jul 2004 14:30:27 +0000 (14:30 +0000)
Rimossa event_doIntr (ora inutile) e semplificata la logica delle macro con funzioni inline

git-svn-id: https://src.develer.com/svnoss/bertos/trunk@93 38d2e660-2303-0410-9eaa-f027e97ec537

kern/event.h
kern/signal.c
kern/signal.h

index e1196c9eca7a9227f4d00a479c54d64806dde679..e5826194f9c11c8c1be0f039efeb8bc4e6daf450 100755 (executable)
 
 /*
  * $Log$
+ * Revision 1.5  2004/07/30 14:30:27  rasky
+ * Resa la sig_signal interrupt safe (con il nuovo scheduler IRQ-safe)
+ * Rimossa event_doIntr (ora inutile) e semplificata la logica delle macro con funzioni inline
+ *
  * Revision 1.4  2004/06/07 15:58:00  aleph
  * Add function prototypes
  *
@@ -128,47 +132,24 @@ INLINE Event event_createSignal(struct Process* proc, sig_t bit)
        return e;
 }
 
-/*! Trigger an event */
-#define event_do(e) \
-do { \
-       if ((e)->action == EVENT_SIGNAL) \
-               sig_signal((e)->Ev.Sig.sig_proc, (e)->Ev.Sig.sig_bit); \
-       else if ((e)->action == EVENT_SOFTINT) \
-               (e)->Ev.Int.func((e)->Ev.Int.user_data); \
-} while (0)
-
-/*! Trigger an event (to be used inside interrupts) */
-#define event_doIntr(e) \
-do { \
-       if ((e)->action == EVENT_SIGNAL) \
-               _sig_signal((e)->Ev.Sig.sig_proc, (e)->Ev.Sig.sig_bit); \
-       else if ((e)->action == EVENT_SOFTINT) \
-               (e)->Ev.Int.func((e)->Ev.Int.user_data); \
-} while (0)
-
-#else /* !CONFIG_KERN_SIGNALS */
+#endif
 
 /*! Trigger an event */
-#define event_do(e) \
-do { \
-       if ((e)->action == EVENT_SOFTINT) \
-               (e)->Ev.Int.func((e)->Ev.Int.user_data); \
-} while (0)
-
-/*! Trigger an event (to be used inside interrupts) */
-#define event_doIntr(e) \
-do { \
-       if ((e)->action == EVENT_SOFTINT) \
-               (e)->Ev.Int.func((e)->Ev.Int.user_data); \
-} while (0)
-
+INLINE void event_do(struct Event* e)
+{
+       if ((e)->action == EVENT_SOFTINT)
+               (e)->Ev.Int.func((e)->Ev.Int.user_data);
+#if defined(CONFIG_KERN_SIGNALS) && CONFIG_KERN_SIGNALS
+       else if ((e)->action == EVENT_SIGNAL)
+               sig_signal((e)->Ev.Sig.sig_proc, (e)->Ev.Sig.sig_bit);
 #endif
+}
 
 #ifdef CONFIG_KERN_OLDNAMES
        #define INITEVENT_SIG  event_initSignal
        #define INITEVENT_INT  event_initSoftInt
        #define DOEVENT        event_do
-       #define DOEVENT_INTR   event_doIntr
+       #define DOEVENT_INTR   event_do
 #endif
 
 #endif /* KERN_EVENT_H */
index fe4ba314c044c786d0aebf4335352b18cb281569..62cfd74c1a9425d3c861a7bd290174817f0f8576 100755 (executable)
 
 /*
  * $Log$
+ * Revision 1.4  2004/07/30 14:30:27  rasky
+ * Resa la sig_signal interrupt safe (con il nuovo scheduler IRQ-safe)
+ * Rimossa event_doIntr (ora inutile) e semplificata la logica delle macro con funzioni inline
+ *
  * Revision 1.3  2004/07/30 14:24:16  rasky
  * Task switching con salvataggio perfetto stato di interrupt (SR)
  * Kernel monitor per dump informazioni su stack dei processi
@@ -86,32 +90,12 @@ sigset_t sig_wait(sigset_t sigs)
  * Send the signals \a sigs to the process \a proc.
  * The process will be awaken if it was waiting for any of them.
  *
- * This call is interrupt safe (no \c DISABLE_INTS/ENABLE_INTS protection)
- */
-void _sig_signal(Process *proc, sigset_t sigs)
-{
-       /* Set the signals */
-       proc->sig_recv |= sigs;
-
-       /* Check if process needs to be awaken */
-       if (proc->sig_recv & proc->sig_wait)
-       {
-               /* Wake up process and enqueue in ready list */
-               proc->sig_wait = 0;
-               SCHED_ENQUEUE(proc);
-       }
-}
-
-
-/*!
- * Same as _sig_signal() with interrupt protection.
- *
- * \note Inlined manually because some compilers are too
- *       stupid to it automatically.
+ * \note This call is interrupt safe.
  */
 void sig_signal(Process *proc, sigset_t sigs)
 {
-       DISABLE_INTS;
+       cpuflags_t flags;
+       DISABLE_IRQSAVE(flags);
 
        /* Set the signals */
        proc->sig_recv |= sigs;
@@ -124,7 +108,7 @@ void sig_signal(Process *proc, sigset_t sigs)
                SCHED_ENQUEUE(proc);
        }
 
-       ENABLE_INTS;
+       ENABLE_IRQRESTORE(flags);
 }
 
 #endif /* CONFIG_KERN_SIGNALS */
index b487965b02abec8cdd7c2893cb5775386c37fee3..3591148dbb7871b21573ba048d7cfe579470941d 100755 (executable)
 
 /*
  * $Log$
+ * Revision 1.3  2004/07/30 14:30:27  rasky
+ * Resa la sig_signal interrupt safe (con il nuovo scheduler IRQ-safe)
+ * Rimossa event_doIntr (ora inutile) e semplificata la logica delle macro con funzioni inline
+ *
  * Revision 1.2  2004/06/03 11:27:09  bernie
  * Add dual-license information.
  *
@@ -34,7 +38,6 @@ struct Process;
 /* Inter-process Communication services */
 sigset_t sig_check(sigset_t sigs);
 void sig_signal(struct Process *proc, sigset_t sig);
-void _sig_signal(struct Process *proc, sigset_t sig);
 sigset_t sig_wait(sigset_t sigs);