#include <cfg/compiler.h>
#include <cfg/macros.h> // BV()
+#include <cpu/irq.h>
+
#include <kern/proc.h>
#if CONFIG_KERN_SIGNALS
-/* Inter-process Communication services */
-sigmask_t sig_checkSignal(Signal *s, sigmask_t sigs);
+INLINE sigmask_t __sig_checkSignal(Signal *s, sigmask_t sigs)
+{
+ sigmask_t result;
+
+ result = s->recv & sigs;
+ s->recv &= ~sigs;
+
+ return result;
+}
+
+/**
+ * Check if any of the signals in \a sigs has occurred and clear them.
+ *
+ * \return the signals that have occurred.
+ */
+INLINE sigmask_t sig_checkSignal(Signal *s, sigmask_t sigs)
+{
+ cpu_flags_t flags;
+ sigmask_t result;
+
+ IRQ_SAVE_DISABLE(flags);
+ result = __sig_checkSignal(s, sigs);
+ IRQ_RESTORE(flags);
+
+ return result;
+}
INLINE sigmask_t sig_check(sigmask_t sigs)
{
#define SIG_USER1 BV(1) /**< Free for user usage */
#define SIG_USER2 BV(2) /**< Free for user usage */
#define SIG_USER3 BV(3) /**< Free for user usage */
-#define SIG_TIMEOUT BV(4) /**< Reserved for timeout use */
-#define SIG_SYSTEM5 BV(5) /**< Reserved for system use */
-#define SIG_SYSTEM6 BV(6) /**< Reserved for system use */
-#define SIG_SINGLE BV(7) /**< Used to wait for a single event */
+#define SIG_SINGLE BV(4) /**< Used to wait for a single event */
+#define SIG_SYSTEM5 BV(5) /**< Reserved for internal system use */
+#define SIG_SYSTEM6 BV(6) /**< Reserved for internal system use */
+#define SIG_TIMEOUT BV(7) /**< Reserved for timeout use */
+
+/**
+ * Max number of signals that can be used by drivers or user applications.
+ */
+#define SIG_USER_MAX SIG_SINGLE
/*\}*/
/* \} */ //defgroup kern_signal