1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
|
// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
// vim: ts=8 sw=2 smarttab
/*
* Ceph - scalable distributed file system
*
* Copyright (C) 2011 New Dream Network
*
* This is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License version 2.1, as published by the Free Software
* Foundation. See file COPYING.
*
*/
#include <cstdlib>
#include <sstream>
#include <sys/stat.h>
#include <sys/types.h>
#include <signal.h>
#include "common/BackTrace.h"
#include "common/config.h"
#include "common/debug.h"
#include "common/signal.h"
#include "common/perf_counters.h"
#include "global/pidfile.h"
using namespace std::literals;
#ifndef _WIN32
std::string signal_mask_to_str()
{
sigset_t old_sigset;
if (pthread_sigmask(SIG_SETMASK, NULL, &old_sigset)) {
return "(pthread_signmask failed)";
}
std::ostringstream oss;
oss << "show_signal_mask: { ";
auto sep = ""s;
for (int signum = 0; signum < NSIG; ++signum) {
if (sigismember(&old_sigset, signum) == 1) {
oss << sep << signum;
sep = ", ";
}
}
oss << " }";
return oss.str();
}
/* Block the signals in 'siglist'. If siglist == NULL, block all signals. */
void block_signals(const int *siglist, sigset_t *old_sigset)
{
sigset_t sigset;
if (!siglist) {
sigfillset(&sigset);
}
else {
int i = 0;
sigemptyset(&sigset);
while (siglist[i]) {
sigaddset(&sigset, siglist[i]);
++i;
}
}
int ret = pthread_sigmask(SIG_BLOCK, &sigset, old_sigset);
ceph_assert(ret == 0);
}
void restore_sigset(const sigset_t *old_sigset)
{
int ret = pthread_sigmask(SIG_SETMASK, old_sigset, NULL);
ceph_assert(ret == 0);
}
void unblock_all_signals(sigset_t *old_sigset)
{
sigset_t sigset;
sigfillset(&sigset);
sigdelset(&sigset, SIGKILL);
int ret = pthread_sigmask(SIG_UNBLOCK, &sigset, old_sigset);
ceph_assert(ret == 0);
}
#else
std::string signal_mask_to_str()
{
return "(unsupported signal)";
}
// Windows provides limited signal functionality.
void block_signals(const int *siglist, sigset_t *old_sigset) {}
void restore_sigset(const sigset_t *old_sigset) {}
void unblock_all_signals(sigset_t *old_sigset) {}
#endif /* _WIN32 */
|