File 0581-erts-Fix-alias-signal-type-check-macros.patch of Package erlang

From 7a0bed847851739f9fe7111f58e59cb4d16dbc67 Mon Sep 17 00:00:00 2001
From: Rickard Green <rickard@erlang.org>
Date: Sat, 2 Dec 2023 15:46:31 +0100
Subject: [PATCH] [erts] Fix alias signal type check macros

These macros should ignore the extra bits in the signal tag. This since
as of the changes introduced in this branch, those are not always zero
anymore (non-zero means that a trace token is attached to the signal).

This bug has never been released, so it needs no ticket of its own.
---
 erts/emulator/beam/erl_proc_sig_queue.h | 45 ++++++++++++++++++-------
 1 file changed, 33 insertions(+), 12 deletions(-)

diff --git a/erts/emulator/beam/erl_proc_sig_queue.h b/erts/emulator/beam/erl_proc_sig_queue.h
index 6a8c0750b1..9b5a74e4dc 100644
--- a/erts/emulator/beam/erl_proc_sig_queue.h
+++ b/erts/emulator/beam/erl_proc_sig_queue.h
@@ -216,30 +216,42 @@ typedef struct {
     ERTS_SIG_Q_TYPE_MAX
 
 #define ERTS_SIG_IS_DIST_ALIAS_MSG_TAG(Tag)                          \
-    ((Tag) == ERTS_PROC_SIG_MAKE_TAG(ERTS_SIG_Q_OP_ALIAS_MSG,        \
-                                     ERTS_SIG_Q_TYPE_DIST,           \
-                                     0))
+    (((Tag) & (ERTS_PROC_SIG_TYPE_MASK                               \
+               | ERTS_PROC_SIG_OP_MASK                               \
+               | ERTS_PROC_SIG_BASE_TAG_MASK))                       \
+     == ERTS_PROC_SIG_MAKE_TAG(ERTS_SIG_Q_OP_ALIAS_MSG,              \
+                               ERTS_SIG_Q_TYPE_DIST,                 \
+                               0))
 #define ERTS_SIG_IS_DIST_ALIAS_MSG(sig)                              \
     ERTS_SIG_IS_DIST_ALIAS_MSG_TAG(((ErtsSignal *) (sig))->common.tag)
 
 #define ERTS_SIG_IS_OFF_HEAP_ALIAS_MSG_TAG(Tag)                      \
-    ((Tag) == ERTS_PROC_SIG_MAKE_TAG(ERTS_SIG_Q_OP_ALIAS_MSG,        \
-                                     ERTS_SIG_Q_TYPE_OFF_HEAP,       \
-                                     0))
+    (((Tag) & (ERTS_PROC_SIG_TYPE_MASK                               \
+               | ERTS_PROC_SIG_OP_MASK                               \
+               | ERTS_PROC_SIG_BASE_TAG_MASK))                       \
+     == ERTS_PROC_SIG_MAKE_TAG(ERTS_SIG_Q_OP_ALIAS_MSG,              \
+                               ERTS_SIG_Q_TYPE_OFF_HEAP,             \
+                               0))
 #define ERTS_SIG_IS_OFF_HEAP_ALIAS_MSG(sig)                          \
     ERTS_SIG_IS_OFF_HEAP_ALIAS_MSG_TAG(((ErtsSignal *) (sig))->common.tag)
 
 #define ERTS_SIG_IS_HEAP_ALIAS_MSG_TAG(Tag)                          \
-    ((Tag) == ERTS_PROC_SIG_MAKE_TAG(ERTS_SIG_Q_OP_ALIAS_MSG,        \
-                                     ERTS_SIG_Q_TYPE_HEAP,           \
-                                     0))
+    (((Tag) & (ERTS_PROC_SIG_TYPE_MASK                               \
+               | ERTS_PROC_SIG_OP_MASK                               \
+               | ERTS_PROC_SIG_BASE_TAG_MASK))                       \
+     == ERTS_PROC_SIG_MAKE_TAG(ERTS_SIG_Q_OP_ALIAS_MSG,              \
+                               ERTS_SIG_Q_TYPE_HEAP,                 \
+                               0))
 #define ERTS_SIG_IS_HEAP_ALIAS_MSG(sig)                              \
     ERTS_SIG_IS_HEAP_ALIAS_MSG_TAG(((ErtsSignal *) (sig))->common.tag)
 
 #define ERTS_SIG_IS_HEAP_FRAG_ALIAS_MSG_TAG(Tag)                     \
-    ((Tag) == ERTS_PROC_SIG_MAKE_TAG(ERTS_SIG_Q_OP_ALIAS_MSG,        \
-                                     ERTS_SIG_Q_TYPE_HEAP_FRAG,      \
-                                     0))
+    (((Tag) & (ERTS_PROC_SIG_TYPE_MASK                               \
+               | ERTS_PROC_SIG_OP_MASK                               \
+               | ERTS_PROC_SIG_BASE_TAG_MASK))                       \
+     == ERTS_PROC_SIG_MAKE_TAG(ERTS_SIG_Q_OP_ALIAS_MSG,              \
+                               ERTS_SIG_Q_TYPE_HEAP_FRAG,            \
+                               0))
 #define ERTS_SIG_IS_HEAP_FRAG_ALIAS_MSG(sig)                         \
     ERTS_SIG_IS_HEAP_FRAG_ALIAS_MSG_TAG(((ErtsSignal *) (sig))->common.tag)
 
@@ -362,6 +374,15 @@ int erts_proc_sig_queue_force_buffers(Process*);
 #define ERTS_PROC_SIG_MSGQ_LEN_OFFS_MARK \
     ERTS_PROC_SIG_MAKE_TAG(ERTS_SIG_Q_OP_MSGQ_LEN_OFFS_MARK,0,0)
 
+#define ERTS_PROC_SIG_BASE_TAG_MASK \
+    ((1 << _HEADER_ARITY_OFFS)-1)
+#define ERTS_PROC_SIG_OP_MASK \
+    (ERTS_SIG_Q_OP_MASK << (ERTS_SIG_Q_OP_SHIFT + _HEADER_ARITY_OFFS))
+#define ERTS_PROC_SIG_TYPE_MASK \
+    (ERTS_SIG_Q_TYPE_MASK << (ERTS_SIG_Q_TYPE_SHIFT + _HEADER_ARITY_OFFS))
+#define ERTS_PROC_SIG_XTRA_MASK \
+    (ERTS_SIG_Q_XTRA_MASK << (ERTS_SIG_Q_XTRA_SHIFT + _HEADER_ARITY_OFFS))
+
 struct dist_entry_;
 
 #define ERTS_PROC_HAS_INCOMING_SIGNALS(P)                               \
-- 
2.35.3

openSUSE Build Service is sponsored by