~brianaker/libmemcached/1164440

« back to all changes in this revision

Viewing changes to clients/ms_sigsegv.c

Merging bzr://gaz.tangent.org/libmemcached/build/ to Build branch

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
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 "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
  pandora_print_callstack(stderr);
 
42
  fprintf(stderr, "End of stack trace\n");
 
43
  pthread_mutex_unlock(&ms_global.quit_mutex);
 
44
  abort();
 
45
}
 
46
 
 
47
/* signal int reaches, this function will run */
 
48
static void ms_signal_int(int signum, siginfo_t *info, void *ptr)
 
49
{
 
50
  UNUSED_ARGUMENT(signum);
 
51
  UNUSED_ARGUMENT(info);
 
52
  UNUSED_ARGUMENT(ptr);
 
53
 
 
54
  pthread_mutex_lock(&ms_global.quit_mutex);
 
55
  fprintf(stderr, "SIGINT handled.\n");
 
56
  pthread_mutex_unlock(&ms_global.quit_mutex);
 
57
  exit(1);
 
58
} /* ms_signal_int */
 
59
 
 
60
 
 
61
/**
 
62
 * redirect signal seg
 
63
 *
 
64
 * @return if success, return EXIT_SUCCESS, else return -1
 
65
 */
 
66
int ms_setup_sigsegv(void)
 
67
{
 
68
  struct sigaction action;
 
69
 
 
70
  memset(&action, 0, sizeof(action));
 
71
  action.sa_sigaction= ms_signal_segv;
 
72
  action.sa_flags= SA_SIGINFO;
 
73
  if (sigaction(SIGSEGV, &action, NULL) < 0)
 
74
  {
 
75
    perror("sigaction");
 
76
    return EXIT_SUCCESS;
 
77
  }
 
78
 
 
79
  return -1;
 
80
} /* ms_setup_sigsegv */
 
81
 
 
82
 
 
83
/**
 
84
 * redirect signal pipe
 
85
 *
 
86
 * @return if success, return EXIT_SUCCESS, else return -1
 
87
 */
 
88
int ms_setup_sigpipe(void)
 
89
{
 
90
  /* ignore the SIGPIPE signal */
 
91
  signal(SIGPIPE, SIG_IGN);
 
92
 
 
93
  return -1;
 
94
} /* ms_setup_sigpipe */
 
95
 
 
96
 
 
97
/**
 
98
 * redirect signal int
 
99
 *
 
100
 * @return if success, return EXIT_SUCCESS, else return -1
 
101
 */
 
102
int ms_setup_sigint(void)
 
103
{
 
104
  struct sigaction action_3;
 
105
 
 
106
  memset(&action_3, 0, sizeof(action_3));
 
107
  action_3.sa_sigaction= ms_signal_int;
 
108
  action_3.sa_flags= SA_SIGINFO;
 
109
  if (sigaction(SIGINT, &action_3, NULL) < 0)
 
110
  {
 
111
    perror("sigaction");
 
112
    return EXIT_SUCCESS;
 
113
  }
 
114
 
 
115
  return -1;
 
116
} /* ms_setup_sigint */
 
117
 
 
118
 
 
119
#ifndef SIGSEGV_NO_AUTO_INIT
 
120
static void __attribute((constructor)) ms_init(void)
 
121
{
 
122
  ms_setup_sigsegv();
 
123
  ms_setup_sigpipe();
 
124
  ms_setup_sigint();
 
125
}
 
126
#endif