3 * Author: Mingqiang Zhuang
5 * Created on March 15, 2009
7 * (c) Copyright 2009, Schooner Information Technology, Inc.
8 * http://www.schoonerinfotech.com/
10 * Rewrite of stack dump:
11 * Copyright (C) 2009 Sun Microsystems
23 #include "ms_memslap.h"
24 #include "ms_setting.h"
27 int ms_setup_sigsegv(void);
28 int ms_setup_sigpipe(void);
29 int ms_setup_sigint(void);
32 /* signal seg reaches, this function will run */
33 static void ms_signal_segv(int signum
, siginfo_t
*info
, void *ptr
)
35 UNUSED_ARGUMENT(signum
);
36 UNUSED_ARGUMENT(info
);
39 pthread_mutex_lock(&ms_global
.quit_mutex
);
40 fprintf(stderr
, "Segmentation fault occurred.\nStack trace:\n");
41 pandora_print_callstack(stderr
);
42 fprintf(stderr
, "End of stack trace\n");
43 pthread_mutex_unlock(&ms_global
.quit_mutex
);
47 /* signal pipe reaches, this function will run */
48 static void ms_signal_pipe(int signum
, siginfo_t
*info
, void *ptr
)
50 UNUSED_ARGUMENT(signum
);
51 UNUSED_ARGUMENT(info
);
54 pthread_mutex_lock(&ms_global
.quit_mutex
);
55 fprintf(stderr
, "\tMemslap encountered a server error. Quitting...\n");
56 fprintf(stderr
, "\tError info: SIGPIPE captured (from write?)\n");
58 "\tProbably a socket I/O error when the server is down.\n");
59 pthread_mutex_unlock(&ms_global
.quit_mutex
);
61 } /* ms_signal_pipe */
64 /* signal int reaches, this function will run */
65 static void ms_signal_int(int signum
, siginfo_t
*info
, void *ptr
)
67 UNUSED_ARGUMENT(signum
);
68 UNUSED_ARGUMENT(info
);
71 pthread_mutex_lock(&ms_global
.quit_mutex
);
72 fprintf(stderr
, "SIGINT handled.\n");
73 pthread_mutex_unlock(&ms_global
.quit_mutex
);
81 * @return if success, return 0, else return -1
83 int ms_setup_sigsegv(void)
85 struct sigaction action
;
87 memset(&action
, 0, sizeof(action
));
88 action
.sa_sigaction
= ms_signal_segv
;
89 action
.sa_flags
= SA_SIGINFO
;
90 if (sigaction(SIGSEGV
, &action
, NULL
) < 0)
97 } /* ms_setup_sigsegv */
101 * redirect signal pipe
103 * @return if success, return 0, else return -1
105 int ms_setup_sigpipe(void)
107 struct sigaction action_2
;
109 memset(&action_2
, 0, sizeof(action_2
));
110 action_2
.sa_sigaction
= ms_signal_pipe
;
111 action_2
.sa_flags
= SA_SIGINFO
;
112 if (sigaction(SIGPIPE
, &action_2
, NULL
) < 0)
119 } /* ms_setup_sigpipe */
123 * redirect signal int
125 * @return if success, return 0, else return -1
127 int ms_setup_sigint(void)
129 struct sigaction action_3
;
131 memset(&action_3
, 0, sizeof(action_3
));
132 action_3
.sa_sigaction
= ms_signal_int
;
133 action_3
.sa_flags
= SA_SIGINFO
;
134 if (sigaction(SIGINT
, &action_3
, NULL
) < 0)
141 } /* ms_setup_sigint */
144 #ifndef SIGSEGV_NO_AUTO_INIT
145 static void __attribute((constructor
)) ms_init(void)