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
|
// SPDX-License-Identifier: GPL-3.0-or-later
#include "proc_net_dev_renames.h"
DICTIONARY *netdev_renames = NULL;
static void dictionary_netdev_rename_delete_cb(const DICTIONARY_ITEM *item __maybe_unused, void *value, void *data __maybe_unused) {
struct rename_task *r = value;
cgroup_netdev_release(r->cgroup_netdev_link);
rrdlabels_destroy(r->chart_labels);
freez((void *) r->container_name);
freez((void *) r->container_device);
freez((void *) r->ctx_prefix);
}
void netdev_renames_init(void) {
static SPINLOCK spinlock = NETDATA_SPINLOCK_INITIALIZER;
spinlock_lock(&spinlock);
if(!netdev_renames) {
netdev_renames = dictionary_create_advanced(DICT_OPTION_FIXED_SIZE, NULL, sizeof(struct rename_task));
dictionary_register_delete_callback(netdev_renames, dictionary_netdev_rename_delete_cb, NULL);
}
spinlock_unlock(&spinlock);
}
void cgroup_rename_task_add(
const char *host_device,
const char *container_device,
const char *container_name,
RRDLABELS *labels,
const char *ctx_prefix,
const DICTIONARY_ITEM *cgroup_netdev_link)
{
netdev_renames_init();
struct rename_task tmp = {
.container_device = strdupz(container_device),
.container_name = strdupz(container_name),
.ctx_prefix = strdupz(ctx_prefix),
.chart_labels = rrdlabels_create(),
.cgroup_netdev_link = cgroup_netdev_link,
};
rrdlabels_migrate_to_these(tmp.chart_labels, labels);
dictionary_set(netdev_renames, host_device, &tmp, sizeof(tmp));
}
// other threads can call this function to delete a rename to a netdev
void cgroup_rename_task_device_del(const char *host_device) {
dictionary_del(netdev_renames, host_device);
}
|