| Disk ARchive 2.7.12 Full featured and portable backup and archiving tool

thread_cancellation.hpp
Go to the documentation of this file.
1/*********************************************************************/
2// dar - disk archive - a backup/restoration program
3// Copyright (C) 2002-2023 Denis Corbin
4//
5// This program is free software; you can redistribute it and/or
6// modify it under the terms of the GNU General Public License
7// as published by the Free Software Foundation; either version 2
8// of the License, or (at your option) any later version.
9//
10// This program is distributed in the hope that it will be useful,
11// but WITHOUT ANY WARRANTY; without even the implied warranty of
12// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13// GNU General Public License for more details.
14//
15// You should have received a copy of the GNU General Public License
16// along with this program; if not, write to the Free Software
17// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
18//
19// to contact the author, see the AUTHOR file
20/*********************************************************************/
21
25
35
36#ifndef THREAD_CANCELLATION_HPP
37#define THREAD_CANCELLATION_HPP
38
39#include "../my_config.h"
40
41 extern "C"
42{
43#if MUTEX_WORKS
44#if HAVE_PTHREAD_H
45#include <pthread.h>
46#endif
47#endif
48}
49#include <list>
50#include <map>
51#include "integers.hpp"
52#include "erreurs.hpp"
53
54 namespace libdar
55{
56
59
61
67
68 class thread_cancellation
69 {
70 public:
71
73 thread_cancellation();
74
76 thread_cancellation(const thread_cancellation & ref) = default;
77
79 thread_cancellation(thread_cancellation && ref) noexcept = default;
80
82 thread_cancellation & operator = (const thread_cancellation & ref) = default;
83
85 thread_cancellation & operator = (thread_cancellation && ref) noexcept = default;
86
88 virtual ~thread_cancellation() noexcept(false);
89
91
94 void check_self_cancellation() const;
95
98
102 void block_delayed_cancellation(bool mode);
103
104
105#if MUTEX_WORKS
107
112 static void cancel(pthread_t tid, bool x_immediate, U_64 x_flag);
113
115
118 static bool cancel_status(pthread_t tid);
119
121
124 static bool clear_pending_request(pthread_t tid);
125
134 static void associate_tid_to_tid(pthread_t src, pthread_t dst);
135
140 static void remove_association_for_tid(pthread_t src);
141
145 static void remove_association_targeted_at(pthread_t dst);
146
148 static void dead_thread(pthread_t tid);
149#endif
150
152 static U_I count()
153 {
154#if MUTEX_WORKS
155 return info.size();
156#else
157 return 0;
158#endif
159 };
160
161#if MUTEX_WORKS
162 private:
163
164 // class types
165
166 struct fields
167 {
168 pthread_t tid;
169 bool block_delayed;
170 bool immediate;
171 bool cancellation;
172 U_64 flag;
173 };
174
175 // object information
176
177 fields status;
178
179 // class's static variables and types
180
181 static pthread_mutex_t access;
182 static std::list<thread_cancellation *> info;
183 static std::list<fields> preborn;
184 static std::multimap<pthread_t, pthread_t> thread_asso;
185
186 // helper class routing
187 static void set_cancellation_in_info_for(pthread_t tid,
188 bool cancel_status,
189 bool x_immediate,
190 U_64 x_flag,
191 bool & found,
192 bool & previous_val,
193 bool & bug);
194 static void add_to_preborn(pthread_t tid, bool x_immediate, U_64 x_flag);
195 static void remove_from_preborn(pthread_t tid, bool & found, bool & prev);
196 static void find_asso_tid_with(pthread_t tid,
197 std::multimap<pthread_t, pthread_t>::iterator & begin,
198 std::multimap<pthread_t, pthread_t>::iterator & end);
199
200#endif
201 };
202
204
205} // end of namespace
206
207#endif
libdar::thread_cancellation
class to be used as parent to provide checkpoints to inherited classes
Definition: thread_cancellation.hpp:69
libdar::thread_cancellation::count
static U_I count()
method for debugging/control purposes
Definition: thread_cancellation.hpp:152
libdar::thread_cancellation::thread_cancellation
thread_cancellation(thread_cancellation &&ref) noexcept=default
move constructor
libdar::thread_cancellation::~thread_cancellation
virtual ~thread_cancellation() noexcept(false)
the destructor
libdar::thread_cancellation::thread_cancellation
thread_cancellation(const thread_cancellation &ref)=default
copy constructor
libdar::thread_cancellation::block_delayed_cancellation
void block_delayed_cancellation(bool mode)
libdar::thread_cancellation::operator=
thread_cancellation & operator=(const thread_cancellation &ref)=default
assignment operator
libdar::thread_cancellation::thread_cancellation
thread_cancellation()
the constructor
libdar::thread_cancellation::check_self_cancellation
void check_self_cancellation() const
Checkpoint test : whether the current libdar call must abort or not.
erreurs.hpp
contains all the excetion class thrown by libdar
integers.hpp
are defined here basic integer types that tend to be portable
libdar
libdar namespace encapsulate all libdar symbols
Definition: archive.hpp:47