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