}
}
+
+static char *state_to_str(mrp_res_resource_state_t st)
+{
+ char *state = "unknown";
+ switch (st) {
+ case MRP_RES_RESOURCE_ACQUIRED:
+ state = "acquired";
+ break;
+ case MRP_RES_RESOURCE_LOST:
+ state = "lost";
+ break;
+ case MRP_RES_RESOURCE_AVAILABLE:
+ state = "available";
+ break;
+ case MRP_RES_RESOURCE_PENDING:
+ state = "pending";
+ break;
+ }
+ return state;
+}
+
static void resource_callback(mrp_res_context_t *cx,
const mrp_res_resource_set_t *rs,
void *userdata)
return;
}
- printf("resource 0 name %s\n", res->name);
- printf("resource 0 state %d\n", res->state);
+ printf("resource 0 name '%s' -> '%s'\n", res->name, state_to_str(res->state));
res = mrp_res_get_resource_by_name(cx, rs, "video_playback");
return;
}
- printf("resource 1 name %s\n", res->name);
- printf("resource 1 state %d\n", res->state);
+ printf("resource 1 name '%s' -> '%s'\n", res->name, state_to_str(res->state));
/* let's copy the changed set for ourselves */
const char *resnam;
mrp_res_attribute_t attrs[ATTRIBUTE_MAX + 1];
int n_attrs;
- uint32_t mask;
-
+ uint32_t mask, all = 0x0, mandatory = 0x0;
+ uint32_t i;
mrp_res_resource_set_t *rset;
mrp_log_info("Resource event (request no %u):", seqno);
goto malformed;
}
+#if 0
switch (state) {
case RESPROTO_RELEASE:
rset->state = MRP_RES_RESOURCE_LOST;
rset->state = MRP_RES_RESOURCE_ACQUIRED;
break;
}
+#endif
while (mrp_msg_iterate(msg, pcursor, &tag, &type, &value, &size)) {
}
resid = value.u32;
- mask = (1UL << resid);
+
+ mrp_log_info("data for '%s': %d", res->name, resid);
+
+ n_attrs = fetch_attribute_array(msg, pcursor, ATTRIBUTE_MAX + 1, attrs);
+
+ if (n_attrs < 0) {
+ mrp_log_error("failed to read attributes from message");
+ goto malformed;
+ }
+
+ /* TODO: attributes */
+ }
+
+ /* go through all resources and see if they have been modified */
+
+ for (i = 0; i < rset->priv->num_resources; i++)
+ {
+ mrp_res_resource_t *res = rset->priv->resources[i];
+
+ mask = (1UL << res->priv->server_id);
+ all |= mask;
+
+ if (res->priv->mandatory)
+ mandatory |= mask;
if (grant & mask) {
res->state = MRP_RES_RESOURCE_ACQUIRED;
}
+#if 1
+ else {
+ res->state = MRP_RES_RESOURCE_LOST;
+ }
+#else
else if (advice & mask) {
res->state = MRP_RES_RESOURCE_AVAILABLE;
}
else {
res->state = MRP_RES_RESOURCE_LOST;
}
+#endif
+ }
- n_attrs = fetch_attribute_array(msg, pcursor, ATTRIBUTE_MAX + 1, attrs);
+ mrp_log_error("advice = 0x%08x, grant = 0x%08x, mandatory = 0x%08x, all = 0x%08x",
+ advice, grant, mandatory, all);
- if (n_attrs < 0) {
- mrp_log_error("failed to read attributes from message");
- goto malformed;
- }
-
- /* TODO: attributes */
+ if (grant) {
+ rset->state = MRP_RES_RESOURCE_ACQUIRED;
+ }
+ else if (advice == mandatory) {
+ rset->state = MRP_RES_RESOURCE_AVAILABLE;
+ }
+ else {
+ rset->state = MRP_RES_RESOURCE_LOST;
}
/* Check the resource set state. If the set is under construction
* before that. Otherwise, if this is a real event, call the
* callback right away. */
+ print_resource_set(rset);
+
if (!rset->priv->seqno) {
if (rset->priv->cb) {
increase_ref(cx, rset);
#include "attribute.h"
#include "message.h"
+
+static char *state_to_str(mrp_res_resource_state_t st)
+{
+ char *state = "unknown";
+ switch (st) {
+ case MRP_RES_RESOURCE_ACQUIRED:
+ state = "acquired";
+ break;
+ case MRP_RES_RESOURCE_LOST:
+ state = "lost";
+ break;
+ case MRP_RES_RESOURCE_AVAILABLE:
+ state = "available";
+ break;
+ case MRP_RES_RESOURCE_PENDING:
+ state = "pending";
+ break;
+ }
+ return state;
+}
+
+
void print_resource(mrp_res_resource_t *res)
{
- mrp_log_info(" resource '%s' : %smandatory, %sshared",
- res->name, res->priv->mandatory ? " " : "not ",
+ mrp_log_info(" resource '%s' -> '%s' : %smandatory, %sshared",
+ res->name, state_to_str(res->state),
+ res->priv->mandatory ? " " : "not ",
res->priv->shared ? "" : "not ");
}
void print_resource_set(mrp_res_resource_set_t *rset)
{
- int i;
+ uint32_t i;
mrp_res_resource_t *res;
- mrp_log_info("Resource set %i (%s):", rset->priv->id, rset->application_class);
+ mrp_log_info("Resource set %i/%i (%s) -> '%s':",
+ rset->priv->id, rset->priv->internal_id,
+ rset->application_class, state_to_str(rset->state));
for (i = 0; i < rset->priv->num_resources; i++) {
- res = rset->priv->resources[i];
+ res = rset->priv->resources[i];
print_resource(res);
}
}
mrp_res_resource_t *get_resource_by_name(mrp_res_resource_set_t *rset,
const char *name)
{
- int i;
+ uint32_t i;
if (!rset || !name)
return NULL;
void free_resource_set(mrp_res_resource_set_t *rset)
{
- int i;
+ uint32_t i;
if (!rset)
return;
const mrp_res_resource_set_t *original)
{
mrp_res_resource_set_t *copy = NULL;
- int i;
+ uint32_t i;
copy = mrp_allocz(sizeof(mrp_res_resource_set_t));
{
char *application_class = NULL;
mrp_res_resource_t **resources = NULL;
- int i, num_resources = 0;
+ uint32_t i, num_resources = 0;
if (!cx || !original)
return -1;
bool shared)
{
mrp_res_resource_t *res = NULL, *proto = NULL;
- int i = 0;
+ uint32_t i = 0;
bool found = false;
+ uint32_t server_id = 0;
if (cx == NULL || set == NULL || name == NULL)
return NULL;
proto = cx->priv->master_resource_set->priv->resources[i];
if (strcmp(proto->name, name) == 0) {
found = true;
+ server_id = proto->priv->server_id;
break;
}
}
if (!res->priv)
goto error;
+ res->priv->server_id = server_id;
res->priv->mandatory = mandatory;
res->priv->shared = shared;
res->priv->pub = res;
bool mrp_res_delete_resource_by_name(mrp_res_resource_set_t *rs, const char *name)
{
- int i;
+ uint32_t i;
mrp_res_resource_t *res = NULL;
/* assumption: only one resource of given name in the resource set */
mrp_res_string_array_t * mrp_res_list_resource_names(mrp_res_context_t *cx,
const mrp_res_resource_set_t *rs)
{
- int i;
+ uint32_t i;
mrp_res_string_array_t *ret;
if (!cx || !rs)
const mrp_res_resource_set_t *rs,
const char *name)
{
- int i;
+ uint32_t i;
if (!cx || !rs)
return NULL;
mrp_msg_t *msg = NULL;
mrp_res_resource_set_t *rset;
- if (!cx->priv->connected)
+ if (!cx->priv->connected) {
+ mrp_log_error("not connected to server");
goto error;
+ }
rset = mrp_htbl_lookup(cx->priv->internal_rset_mapping,
u_to_p(original->priv->internal_id));
- if (!rset)
+ if (!rset) {
+ mrp_log_error("trying to acquire non-existent resource set");
goto error;
+ }
update_library_resource_set(cx, original, rset);
if (rset->state == MRP_RES_RESOURCE_ACQUIRED) {
/* already requested, updating is not supported yet */
+ mrp_log_error("trying to re-acquire already acquired set");
/* TODO: when supported by backend
* type = RESPROTO_UPDATE_RESOURCE_SET
/* Create the resource set. The acquisition is continued
* when the set is created. */
- if (create_resource_set_request(cx, rset) < 0)
+ if (create_resource_set_request(cx, rset) < 0) {
+ mrp_log_error("creating resource set failed");
goto error;
+ }
mrp_list_append(&cx->priv->pending_sets, &rset->priv->hook);
return 0;
error:
- mrp_log_error("mrp_res_acquire_resource_set error");
-
mrp_msg_unref(msg);
return -1;
}