svn commit: samba r20939 - in branches/SAMBA_4_0/source/lib/events: .

tridge at samba.org tridge at samba.org
Sun Jan 21 22:12:20 GMT 2007


Author: tridge
Date: 2007-01-21 22:12:19 +0000 (Sun, 21 Jan 2007)
New Revision: 20939

WebSVN: http://websvn.samba.org/cgi-bin/viewcvs.cgi?view=rev&root=samba&rev=20939

Log:

reduce the amount of static state for signal handlers from 96k to 1.2k

Modified:
   branches/SAMBA_4_0/source/lib/events/events_signal.c


Changeset:
Modified: branches/SAMBA_4_0/source/lib/events/events_signal.c
===================================================================
--- branches/SAMBA_4_0/source/lib/events/events_signal.c	2007-01-21 21:02:24 UTC (rev 20938)
+++ branches/SAMBA_4_0/source/lib/events/events_signal.c	2007-01-21 22:12:19 UTC (rev 20939)
@@ -47,13 +47,13 @@
 */
 static struct {
 	struct signal_event *sig_handlers[NUM_SIGNALS];
-	struct sigaction oldact[NUM_SIGNALS];
+	struct sigaction *oldact[NUM_SIGNALS];
 	struct sigcounter signal_count[NUM_SIGNALS];
 	struct sigcounter got_signal;
 	int pipe_hack[2];
 #ifdef SA_SIGINFO
 	/* with SA_SIGINFO we get quite a lot of info per signal */
-	siginfo_t sig_info[NUM_SIGNALS][SA_INFO_QUEUE_COUNT];
+	siginfo_t *sig_info[NUM_SIGNALS];
 #endif
 } sig_state;
 
@@ -112,7 +112,14 @@
 	DLIST_REMOVE(sig_state.sig_handlers[se->signum], se);
 	if (sig_state.sig_handlers[se->signum] == NULL) {
 		/* restore old handler, if any */
-		sigaction(se->signum, &sig_state.oldact[se->signum], NULL);
+		sigaction(se->signum, sig_state.oldact[se->signum], NULL);
+		sig_state.oldact[se->signum] = NULL;
+#ifdef SA_SIGINFO
+		if (se->sa_flags & SA_SIGINFO) {
+			talloc_free(sig_state.sig_info[se->signum]);
+			sig_state.sig_info[se->signum] = NULL;
+		}
+#endif
 	}
 	return 0;
 }
@@ -164,10 +171,22 @@
 		if (sa_flags & SA_SIGINFO) {
 			act.sa_handler   = NULL;
 			act.sa_sigaction = signal_handler_info;
+			if (sig_state.sig_info[signum] == NULL) {
+				sig_state.sig_info[signum] = talloc_array(ev, siginfo_t, SA_INFO_QUEUE_COUNT);
+				if (sig_state.sig_info[signum] == NULL) {
+					talloc_free(se);
+					return NULL;
+				}
+			}
 		}
 #endif
-		if (sigaction(signum, &act, &sig_state.oldact[signum]) == -1) {
+		sig_state.oldact[signum] = talloc(ev, struct sigaction);
+		if (sig_state.oldact[signum] == NULL) {
 			talloc_free(se);
+			return NULL;			
+		}
+		if (sigaction(signum, &act, sig_state.oldact[signum]) == -1) {
+			talloc_free(se);
 			return NULL;
 		}
 	}



More information about the samba-cvs mailing list