Merge lp:~tangent-org/libmemcached/1.0-build/ Build: jenkins-Libmemcached-187
[m6w6/libmemcached] / clients / ms_sigsegv.c
1 /*
2 * File: ms_sigsegv.c
3 * Author: Mingqiang Zhuang
4 *
5 * Created on March 15, 2009
6 *
7 * (c) Copyright 2009, Schooner Information Technology, Inc.
8 * http://www.schoonerinfotech.com/
9 *
10 * Rewrite of stack dump:
11 * Copyright (C) 2009 Sun Microsystems
12 * Author Trond Norbye
13 */
14
15 #include "mem_config.h"
16
17 #include <memory.h>
18 #include <stdlib.h>
19 #include <stdio.h>
20 #include <signal.h>
21 #include <pthread.h>
22
23 #include "ms_memslap.h"
24 #include "ms_setting.h"
25
26 /* prototypes */
27 int ms_setup_sigsegv(void);
28 int ms_setup_sigpipe(void);
29 int ms_setup_sigint(void);
30
31
32 /* signal seg reaches, this function will run */
33 static void ms_signal_segv(int signum, siginfo_t *info, void *ptr)
34 {
35 UNUSED_ARGUMENT(signum);
36 UNUSED_ARGUMENT(info);
37 UNUSED_ARGUMENT(ptr);
38
39 pthread_mutex_lock(&ms_global.quit_mutex);
40 fprintf(stderr, "Segmentation fault occurred.\nStack trace:\n");
41 #if 0
42 pandora_print_callstack(stderr);
43 #endif
44 fprintf(stderr, "End of stack trace\n");
45 pthread_mutex_unlock(&ms_global.quit_mutex);
46 abort();
47 }
48
49 /* signal int reaches, this function will run */
50 static void ms_signal_int(int signum, siginfo_t *info, void *ptr)
51 {
52 UNUSED_ARGUMENT(signum);
53 UNUSED_ARGUMENT(info);
54 UNUSED_ARGUMENT(ptr);
55
56 pthread_mutex_lock(&ms_global.quit_mutex);
57 fprintf(stderr, "SIGINT handled.\n");
58 pthread_mutex_unlock(&ms_global.quit_mutex);
59 exit(1);
60 } /* ms_signal_int */
61
62
63 /**
64 * redirect signal seg
65 *
66 * @return if success, return EXIT_SUCCESS, else return -1
67 */
68 int ms_setup_sigsegv(void)
69 {
70 struct sigaction action;
71
72 memset(&action, 0, sizeof(action));
73 action.sa_sigaction= ms_signal_segv;
74 action.sa_flags= SA_SIGINFO;
75 if (sigaction(SIGSEGV, &action, NULL) < 0)
76 {
77 perror("sigaction");
78 return EXIT_SUCCESS;
79 }
80
81 return -1;
82 } /* ms_setup_sigsegv */
83
84
85 /**
86 * redirect signal pipe
87 *
88 * @return if success, return EXIT_SUCCESS, else return -1
89 */
90 int ms_setup_sigpipe(void)
91 {
92 /* ignore the SIGPIPE signal */
93 signal(SIGPIPE, SIG_IGN);
94
95 return -1;
96 } /* ms_setup_sigpipe */
97
98
99 /**
100 * redirect signal int
101 *
102 * @return if success, return EXIT_SUCCESS, else return -1
103 */
104 int ms_setup_sigint(void)
105 {
106 struct sigaction action_3;
107
108 memset(&action_3, 0, sizeof(action_3));
109 action_3.sa_sigaction= ms_signal_int;
110 action_3.sa_flags= SA_SIGINFO;
111 if (sigaction(SIGINT, &action_3, NULL) < 0)
112 {
113 perror("sigaction");
114 return EXIT_SUCCESS;
115 }
116
117 return -1;
118 } /* ms_setup_sigint */
119
120
121 #ifndef SIGSEGV_NO_AUTO_INIT
122 static void __attribute((constructor)) ms_init(void)
123 {
124 ms_setup_sigsegv();
125 ms_setup_sigpipe();
126 ms_setup_sigint();
127 }
128 #endif