-
Notifications
You must be signed in to change notification settings - Fork 4k
/
Copy pathresource_group.h
180 lines (135 loc) · 4.94 KB
/
resource_group.h
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
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
/* Copyright (c) 2017, 2025, Oracle and/or its affiliates.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License, version 2.0,
as published by the Free Software Foundation.
This program is designed to work with certain software (including
but not limited to OpenSSL) that is licensed under separate terms,
as designated in a particular file or component or in included license
documentation. The authors of MySQL hereby grant you an additional
permission to link the program and your derivative works with the
separately licensed software that they have either included with
the program or referenced in the documentation.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License, version 2.0, for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */
#ifndef RESOURCEGROUPS_RESOURCE_GROUP_H_
#define RESOURCEGROUPS_RESOURCE_GROUP_H_
#include "resource_group_sql_cmd.h"
#include <functional>
#include <memory>
#include <mutex>
#include <set>
#include "sql/log.h" // sql_print_warning
#include "sql/resourcegroups/thread_resource_control.h"
namespace resourcegroups {
/**
Class that represents an abstraction of the Resource Group.
It has generic attributes of Resource group name, type,
active or inactive, a pointer to a Resource control object.
*/
class Resource_group {
public:
/**
Construct a Resource_group object.
@param name name of the Resource_group.
@param type type of the Resource_group.
@param enabled Check if Resource_group is enabled or not.
*/
Resource_group(const std::string &name, const Type type, bool enabled)
: m_name(name), m_type(type), m_enabled(enabled) {}
const std::string &name() const { return m_name; }
Type type() const { return m_type; }
bool enabled() const { return m_enabled; }
void set_type(Type type) { m_type = type; }
void set_enabled(bool enabled) { m_enabled = enabled; }
Thread_resource_control *controller() { return &m_thread_resource_control; }
const Thread_resource_control *controller() const {
return &m_thread_resource_control;
}
/**
Check if resource group is associated with threads.
@return true if some threads are mapped with this resource group
else false.
*/
bool is_bound_to_threads() {
std::unique_lock<std::mutex> lock(m_set_mutex);
return !m_pfs_thread_id_set.empty();
}
/**
Is pfs thread id already exists in the set.
@param pfs_thread_id PFS thread id.
@return true if thread id exists in the set else false.
*/
bool is_pfs_thread_id_exists(const ulonglong pfs_thread_id) {
std::unique_lock<std::mutex> lock(m_set_mutex);
return m_pfs_thread_id_set.find(pfs_thread_id) != m_pfs_thread_id_set.end();
}
/**
Add thread_id to the thread id set associated with this resource group.
@param pfs_thread_id PFS thread id.
*/
void add_pfs_thread_id(const ulonglong pfs_thread_id) {
std::unique_lock<std::mutex> lock(m_set_mutex);
(void)m_pfs_thread_id_set.insert(pfs_thread_id);
}
/**
Remove the PFS thread id.
@param pfs_thread_id Remove pfs thread id.
*/
void remove_pfs_thread_id(const ulonglong pfs_thread_id) {
std::unique_lock<std::mutex> lock(m_set_mutex);
(void)m_pfs_thread_id_set.erase(pfs_thread_id);
}
/**
Clear the thread id set associated with this resource group.
*/
void clear() {
std::unique_lock<std::mutex> lock(m_set_mutex);
(void)m_pfs_thread_id_set.clear();
}
/**
Apply a control function on threads associated with this resource group.
@param control_func pointer to Control function.
*/
void apply_control_func(std::function<void(ulonglong)> control_func) {
std::unique_lock<std::mutex> lock(m_set_mutex);
for (auto pfs_thread_id : m_pfs_thread_id_set) control_func(pfs_thread_id);
}
~Resource_group() = default;
private:
/**
Name of the resource group.
*/
std::string m_name;
/**
Type whether it is user or system resource group.
*/
Type m_type;
/**
bool flag whether resource is enabled or disabled.
*/
bool m_enabled;
/**
Thread resource controller object.
*/
Thread_resource_control m_thread_resource_control;
/**
Threads associated with this resource group.
*/
std::set<ulonglong> m_pfs_thread_id_set;
/**
Mutex protecting the resource group set.
*/
std::mutex m_set_mutex;
/**
Disable copy construction and assignment.
*/
Resource_group(const Resource_group &) = delete;
void operator=(const Resource_group &) = delete;
};
} // namespace resourcegroups
#endif // RESOURCEGROUPS_RESOURCE_GROUP_H_