From 4e56675d2fea8aed59d91875f317ec228c94da85 Mon Sep 17 00:00:00 2001
From: ailin-nemui <ailin-nemui@users.noreply.github.com>
Date: Mon, 19 Dec 2016 21:45:17 +0100
Subject: [PATCH] trace signal emission add char*printing

---
 src/core/signals.c | 69 +++++++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 68 insertions(+), 1 deletion(-)

diff --git a/src/core/signals.c b/src/core/signals.c
index 1f425ba40..4836ff4de 100644
--- a/src/core/signals.c
+++ b/src/core/signals.c
@@ -49,6 +49,46 @@ static GHashTable *signals;
 static Signal *current_emitted_signal;
 static SignalHook *current_emitted_hook;
 
+typedef int signal_printable_def_t[7];
+#define SIGNAL_PRINTABLE_LIST_SIZE 8
+static signal_printable_def_t signal_printable_def[SIGNAL_PRINTABLE_LIST_SIZE];
+
+static void signal_printable_list_init(void)
+{
+	int c = 0;
+
+#define SIG_PRNTX(id,_0,_1,_2,_3,_4,_5) \
+	signal_printable_def[c][0] = id, \
+	signal_printable_def[c][1] = _0, signal_printable_def[c][2] = _1, \
+	signal_printable_def[c][3] = _2, signal_printable_def[c][4] = _3, \
+	signal_printable_def[c][5] = _4, signal_printable_def[c][6] = _5; c++
+#define SIG_PRNT2(a,b,_0,_1,_2,_3,_4,_5) \
+	SIG_PRNTX(signal_get_uniq_id(#a " " #b),_0,_1,_2,_3,_4,_5)
+
+	SIG_PRNTX(-1,0,0,0,0,0,0);
+
+	SIG_PRNT2(server,incoming, 0,1,0,0,0,0);
+	SIG_PRNT2(server,event,    0,1,1,1,0,0);
+	SIG_PRNT2(event,nick,      0,1,1,1,0,0);
+	SIG_PRNT2(nicklist,changed,0,0,1,0,0,0);
+	SIG_PRNT2(message,own_nick,0,1,1,1,0,0);
+	SIG_PRNT2(print,text,      0,0,1,0,0,0);
+
+	SIG_PRNTX(-1,0,0,0,0,0,0);
+	if (c > SIGNAL_PRINTABLE_LIST_SIZE)
+		g_error("SIGNAL_PRINTABLE_LIST_SIZE too small: was %d, need %d", SIGNAL_PRINTABLE_LIST_SIZE, c);
+}
+
+static const int *signal_printable_list(int signal)
+{
+	int c;
+	for (c = 1; signal_printable_def[c][0] != -1; c++) {
+		if (signal_printable_def[c][0] == signal)
+			return signal_printable_def[c];
+	}
+	return signal_printable_def[0];
+}
+
 #define signal_ref(signal) ++(signal)->refcount
 #define signal_unref(signal) (signal_unref_full(signal, TRUE))
 
@@ -205,6 +245,15 @@ static void signal_hooks_clean(Signal *rec)
 	}
 }
 
+static int signal_emit_depth = 0;
+
+static void _debug_indent(int depth)
+{
+	int z;
+	fprintf(stderr, "\n");
+	for (z = depth; z < signal_emit_depth; ++z) fprintf(stderr, "\t");
+}
+
 static int signal_emit_real(Signal *rec, int params, va_list va,
 			    SignalHook *first_hook)
 {
@@ -212,9 +261,16 @@ static int signal_emit_real(Signal *rec, int params, va_list va,
 	Signal *prev_emitted_signal;
         SignalHook *hook, *prev_emitted_hook;
 	int i, stopped, stop_emit_count, continue_emit_count;
+	const int *prtarg;
 
-	for (i = 0; i < SIGNAL_MAX_ARGUMENTS; i++)
+	_debug_indent(0);
+	fprintf(stderr, "emitting signal(%d) %s ", signal_emit_depth, signal_get_id_str(rec->id));
+	prtarg = signal_printable_list(rec->id);
+	for (i = 0; i < SIGNAL_MAX_ARGUMENTS; i++) {
 		arglist[i] = i >= params ? NULL : va_arg(va, const void *);
+		fprintf(stderr, ", %#p", arglist[i]);
+		if (prtarg[i+1] && arglist[i]) fprintf(stderr, "[%s]", arglist[i]);
+	}
 
 	/* signal_stop_by_name("signal"); signal_emit("signal", ...);
 	   fails if we compare rec->stop_emit against 0. */
@@ -226,14 +282,21 @@ static int signal_emit_real(Signal *rec, int params, va_list va,
 	stopped = FALSE;
 	rec->emitting++;
 
+	_debug_indent(0);
+	fprintf(stderr, " - emitting: %d, stop: %d, continue: %d", rec->emitting, rec->stop_emit, rec->continue_emit);
+
 	prev_emitted_signal = current_emitted_signal;
 	prev_emitted_hook = current_emitted_hook;
 	current_emitted_signal = rec;
 
+	signal_emit_depth++;
 	for (hook = first_hook; hook != NULL; hook = hook->next) {
 		if (hook->func == NULL)
 			continue; /* removed */
 
+		_debug_indent(1);
+		fprintf(stderr, " - calling hook: %#p %#p", hook, hook->func);
+		
 		current_emitted_hook = hook;
 #if SIGNAL_MAX_ARGUMENTS != 6
 #  error SIGNAL_MAX_ARGUMENTS changed - update code
@@ -251,6 +314,7 @@ static int signal_emit_real(Signal *rec, int params, va_list va,
 			break;
 		}
 	}
+	signal_emit_depth--;
 
 	current_emitted_signal = prev_emitted_signal;
 	current_emitted_hook = prev_emitted_hook;
@@ -265,6 +329,8 @@ static int signal_emit_real(Signal *rec, int params, va_list va,
                 if (rec->remove_count > 0)
 			signal_hooks_clean(rec);
 	}
+	_debug_indent(0);
+	fprintf(stderr, " - stopped: %d", stopped);
 
         signal_unref(rec);
 	return stopped;
@@ -412,6 +478,7 @@ void signals_remove_module(const char *module)
 void signals_init(void)
 {
 	signals = g_hash_table_new(NULL, NULL);
+	signal_printable_list_init();
 }
 
 static void signal_free(void *key, Signal *rec)
