Kea 2.7.5
watched_thread.cc
Go to the documentation of this file.
1// Copyright (C) 2018-2021 Internet Systems Consortium, Inc. ("ISC")
2//
3// This Source Code Form is subject to the terms of the Mozilla Public
4// License, v. 2.0. If a copy of the MPL was not distributed with this
5// file, You can obtain one at http://mozilla.org/MPL/2.0/.
6
7#include <config.h>
8
10#include <signal.h>
11
12namespace isc {
13namespace util {
14
15void
16WatchedThread::start(const std::function<void()>& thread_main) {
20 setErrorInternal("no error");
21 // Protect us against signals
22 sigset_t sset;
23 sigset_t osset;
24 sigemptyset(&sset);
25 sigaddset(&sset, SIGCHLD);
26 sigaddset(&sset, SIGINT);
27 sigaddset(&sset, SIGHUP);
28 sigaddset(&sset, SIGTERM);
29 pthread_sigmask(SIG_BLOCK, &sset, &osset);
30 try {
31 thread_.reset(new std::thread(thread_main));
32 } catch (...) {
33 // Restore signal mask.
34 pthread_sigmask(SIG_SETMASK, &osset, 0);
35 throw;
36 }
37 // Restore signal mask.
38 pthread_sigmask(SIG_SETMASK, &osset, 0);
39}
40
41int
43 return(sockets_[watch_type].getSelectFd());
44}
45
46void
48 sockets_[watch_type].markReady();
49}
50
51bool
53 return (sockets_[watch_type].isReady());
54}
55
56void
58 sockets_[watch_type].clearReady();
59}
60
61bool
63 if (sockets_[TERMINATE].isReady()) {
65 return (true);
66 }
67
68 return (false);
69}
70
71void
73 if (thread_) {
75 thread_->join();
76 thread_.reset();
77 }
78
81 setErrorInternal("thread stopped");
82}
83
84void
85WatchedThread::setErrorInternal(const std::string& error_msg) {
86 std::lock_guard<std::mutex> lock(mutex_);
87 last_error_ = error_msg;
88}
89
90void
91WatchedThread::setError(const std::string& error_msg) {
92 setErrorInternal(error_msg);
94}
95
96std::string
98 std::lock_guard<std::mutex> lock(mutex_);
99 return (last_error_);
100}
101
102} // namespace util
103} // namespace isc
void clearReady()
Clears the socket's ready to read marker.
void markReady()
Marks the select-fd as ready to read.
void start(const std::function< void()> &thread_main)
Creates and runs the thread.
int getWatchFd(WatchType watch_type)
Fetches the fd of a watch socket.
bool shouldTerminate()
Checks if the thread should terminate.
void markReady(WatchType watch_type)
Sets a watch socket state to ready.
bool isReady(WatchType watch_type)
Indicates if a watch socket state is ready.
std::string getLastError()
Fetches the error message text for the most recent error.
void clearReady(WatchType watch_type)
Sets a watch socket state to not ready.
WatchType
Enumerates the list of watch sockets used to mark events These are used as arguments to watch socket ...
void stop()
Terminates the thread.
void setError(const std::string &error_msg)
Sets the error state.
Defines the logger used by the top-level component of kea-lfc.