[glib/signal-performance] fastpath: Do allow NO_RECURSE fastpath for NOP emissions



commit 2d6502f67bb207c5a0d6eaba27b2398b74baa28f
Author: Alexander Larsson <alexl redhat com>
Date:   Sat Mar 3 21:36:10 2012 +0100

    fastpath: Do allow NO_RECURSE fastpath for NOP emissions
    
    This fixes a performance regression wrt the old NOP emission
    handler.

 gobject/gsignal.c |    7 ++++++-
 1 files changed, 6 insertions(+), 1 deletions(-)
---
diff --git a/gobject/gsignal.c b/gobject/gsignal.c
index 14054b5..09c6195 100644
--- a/gobject/gsignal.c
+++ b/gobject/gsignal.c
@@ -701,7 +701,7 @@ node_update_single_va_closure (SignalNode *node)
 
   /* Fast path single-handler without boxing the arguments in GValues */
   if (G_TYPE_IS_OBJECT (node->itype) &&
-      (node->flags & (G_SIGNAL_NO_RECURSE|G_SIGNAL_MUST_COLLECT)) == 0 &&
+      (node->flags & (G_SIGNAL_MUST_COLLECT)) == 0 &&
       (node->emission_hooks == NULL || node->emission_hooks->hooks == NULL))
     {
       GSignalFlags run_type;
@@ -3158,6 +3158,11 @@ g_signal_emit_valist (gpointer instance,
 	  return;
 	}
 
+      /* Don't allow no-recurse emission as we might have to restart, which means
+	 we will run multiple handlers and thus must ref all arguments */
+      if (closure != NULL && node->flags & (G_SIGNAL_NO_RECURSE) != 0)
+	fastpath = FALSE;
+      
       if (fastpath)
 	{
 	  SignalAccumulator *accumulator;



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]