static struct cgroup_ops cgmanager_ops;
static int nr_subsystems;
static char **subsystems;
+static DBusConnection *connection;
#define CGMANAGER_DBUS_SOCK "unix:path=/sys/fs/cgroup/cgmanager/sock"
static void cgm_dbus_disconnected(DBusConnection *connection);
static bool cgm_dbus_connect(void)
{
DBusError dbus_error;
- DBusConnection *connection;
dbus_error_init(&dbus_error);
lock_mutex(&thread_mutex);
cgroup_manager = nih_dbus_proxy_new(NULL, connection,
NULL /* p2p */,
"/org/linuxcontainers/cgmanager", NULL, NULL);
- dbus_connection_unref(connection);
if (!cgroup_manager) {
NihError *nerr;
nerr = nih_error_get();
if (cgroup_manager)
nih_free(cgroup_manager);
cgroup_manager = NULL;
+ dbus_connection_unref(connection);
+ connection = NULL;
unlock_mutex(&thread_mutex);
}
static void cgm_dbus_disconnected(DBusConnection *connection)
{
+ lock_mutex(&thread_mutex);
WARN("Cgroup manager connection was terminated");
cgroup_manager = NULL;
+ dbus_connection_unref(connection);
+ connection = NULL;
+ unlock_mutex(&thread_mutex);
if (cgm_dbus_connect()) {
INFO("New cgroup manager connection was opened");
} else {
{
struct cgm_data *d;
+ cgm_dbus_connect();
d = malloc(sizeof(*d));
if (!d)
return NULL;
if (!d)
return;
+ cgm_dbus_connect();
for (i = 0; i < nr_subsystems; i++)
cgm_remove_cgroup(subsystems[i], d->cgroup_path);
if (d->cgroup_path)
free(d->cgroup_path);
free(d);
+ cgm_dbus_disconnect();
}
/*
cgroup = lxc_cmd_get_cgroup_path(name, lxcpath, controller);
if (!cgroup)
return -1;
+ cgm_dbus_connect();
lock_mutex(&thread_mutex);
if (cgmanager_get_value_sync(NULL, cgroup_manager, controller, cgroup, filename, &result) != 0) {
/*
nih_free(nerr);
free(cgroup);
unlock_mutex(&thread_mutex);
+ cgm_dbus_disconnect();
return -1;
}
unlock_mutex(&thread_mutex);
+ cgm_dbus_disconnect();
free(cgroup);
newlen = strlen(result);
if (!value) {
controller, lxcpath, name);
return -1;
}
+ cgm_dbus_connect();
ret = cgm_do_set(controller, filename, cgroup, value);
+ cgm_dbus_disconnect();
free(cgroup);
return ret;
}
goto out;
}
+ cgm_dbus_connect();
if (!(pass = do_cgm_enter(pid, cgroup)))
ERROR("Failed to enter group %s", cgroup);
+ cgm_dbus_disconnect();
out:
free(cgroup);