static void schedule_connect(struct userdata *, resource_interface *);
static void cancel_schedule(struct userdata *, resource_interface *);
-static int node_put_rset(struct userdata *, mir_node *, rset_data *);
+static rset_hash *node_put_rset(struct userdata *, mir_node *, rset_data *);
static void node_enforce_resource_policy(struct userdata *, mir_node *,
rset_data *);
static rset_data *rset_data_dup(rset_data *);
#ifdef WITH_RESOURCES
resource_attribute *attr, *a;
resource_request *req, *r;
+ void *state;
+ rset_hash *rh;
+ pid_hash *ph;
#endif
if (u && (murphyif = u->murphyif)) {
resource_transport_destroy(murphyif);
- pa_hashmap_free(rif->nodes.rsetid, rset_hashmap_free, NULL);
- pa_hashmap_free(rif->nodes.pid, pid_hashmap_free, NULL);
+ PA_HASHMAP_FOREACH(rh, rif->nodes.rsetid, state) {
+ if (rh) {
+ pa_xfree(rh->nodes);
+ rset_data_free(rh->rset);
+ pa_xfree(rh);
+ }
+ }
+
+ PA_HASHMAP_FOREACH(ph, rif->nodes.pid, state) {
+ if (ph) {
+ pa_xfree((void *)ph->pid);
+ rset_data_free(ph->rset);
+ pa_xfree(ph);
+ }
+ }
+
+ pa_hashmap_free(rif->nodes.rsetid, NULL);
+ pa_hashmap_free(rif->nodes.pid, NULL);
PA_LLIST_FOREACH_SAFE(attr, a, rif->attrs)
resource_attribute_destroy(rif, attr);
node->rsetid);
}
else {
+ if (rset_hashmap_remove(u, node->rsetid, node) < 0) {
+ pa_log_debug("failed to remove resource set %s from hashmap",
+ node->rsetid);
+ }
+
if (resource_set_destroy_node(u, rsetid))
- pa_log_debug("resource set %u destruction request", rsetid);
+ pa_log_debug("sent resource set %u destruction request", rsetid);
else {
- pa_log("falied to destroy resourse set %u for node '%s'",
+ pa_log("failed to destroy resourse set %u for node '%s'",
rsetid, node->amname);
}
rif = &murphyif->resource;
if (!node->rsetid) {
- pa_log("can't register resource set for node '%s'.: missing rsetid",
- node->amname);
+ pa_log("can't register resource set for node %u '%s'.: missing rsetid",
+ node->paidx, node->amname);
}
else if (pa_streq(node->rsetid, PA_RESOURCE_SET_ID_PID)) {
if (!(pid = get_node_pid(u,node)))
pa_log_debug("found resource-set %s for node '%s'",
rset->id, node->amname);
- if (node_put_rset(u, node, rset) == 0) {
+ if (node_put_rset(u, node, rset)) {
node_enforce_resource_policy(u, node, rset);
rset_data_free(rset);
return 0;
if ((rh = rset_hashmap_put(u, node->rsetid, node))) {
rset = rh->rset;
- pa_log_debug("enforce policies on node '%s' rsetid:%s autorel:%s "
- "state:%s grant:%s policy:%s", node->amname,
+ pa_log_debug("enforce policies on node %u '%s' rsetid:%s autorel:%s "
+ "state:%s grant:%s policy:%s", node->paidx, node->amname,
rset->id, rset->autorel ? "yes":"no",
rset->state == RSET_ACQUIRE ? "acquire":"release",
rset->grant ? "yes":"no", rset->policy);
if (e == node->rsetid || *e)
success = FALSE;
- else
+ else {
+ rset_hashmap_remove(u, node->rsetid, node);
success &= resource_set_destroy_node(u, rsetid);
+ }
}
pa_xfree(node->rsetid);
pa_log_debug("found node %s for resource-set '%s'",
node->amname, rset.id);
- if (node_put_rset(u, node, &rset) < 0) {
+ if (!(rh = node_put_rset(u, node, &rset))) {
pa_log("can't register resource set for node '%s': "
"failed to set rsetid", node->amname);
continue;
memcpy(nodes, rh->nodes, size);
for (i = 0; (node = nodes[i]); i++) {
- pa_log_debug("resource notification for node '%s' autorel:%s "
- "state:%s grant:%s pid:%s policy:%s", node->amname,
- rset.autorel ? "yes":"no",
+ pa_log_debug("%u: resource notification for node '%s' autorel:%s "
+ "state:%s grant:%s pid:%s policy:%s", i,
+ node->amname, rset.autorel ? "yes":"no",
rset.state == RSET_ACQUIRE ? "acquire":"release",
rset.grant ? "yes":"no", pid, rset.policy);
}
}
-static int node_put_rset(struct userdata *u, mir_node *node, rset_data *rset)
+static rset_hash *node_put_rset(struct userdata *u, mir_node *node, rset_data *rset)
{
pa_murphyif *murphyif;
resource_interface *rif;
pa_proplist *pl;
+ rset_hash *rh;
pa_assert(u);
pa_assert(node);
if (!(pl = get_node_proplist(u, node))) {
pa_log("can't obtain property list for node %s", node->amname);
- return -1;
+ return NULL;
}
if ((pa_proplist_sets(pl, PA_PROP_RESOURCE_SET_ID, node->rsetid) < 0)) {
pa_log("failed to set '" PA_PROP_RESOURCE_SET_ID "' property "
"of '%s' node", node->amname);
- return -1;
+ return NULL;
}
- if (!rset_hashmap_put(u, node->rsetid, node)) {
+ if (!(rh = rset_hashmap_put(u, node->rsetid, node))) {
pa_log("conflicting rsetid %s for %s", node->rsetid, node->amname);
- return -1;
+ return NULL;
}
- return 0;
+ return rh;
}
static void node_enforce_resource_policy(struct userdata *u,
rset_hash *rh;
rset_data *rset;
size_t i;
- mir_node *n;
pa_assert(u);
pa_assert(rsetid);
if ((rh = pa_hashmap_get(rif->nodes.rsetid, rsetid))) {
for (i = 0; i < rh->nnode; i++) {
- if (rh->nodes[i] == n)
+ if (rh->nodes[i] == node)
return NULL;
}
i = 0;
}
+
rh->nodes[i+0] = node;
rh->nodes[i+1] = NULL;