resource-c: the preemption logic now appears to work.
authorIsmo Puustinen <ismo.puustinen@intel.com>
Fri, 4 Jan 2013 12:38:07 +0000 (14:38 +0200)
committerIsmo Puustinen <ismo.puustinen@intel.com>
Fri, 4 Jan 2013 12:54:12 +0000 (14:54 +0200)
src/plugins/resource-native/libmurphy-resource/api_test.c
src/plugins/resource-native/libmurphy-resource/message.c
src/plugins/resource-native/libmurphy-resource/resource-private.h
src/plugins/resource-native/libmurphy-resource/resource.c
src/plugins/resource-native/libmurphy-resource/rset.c

index 0900141..3c7cfe3 100644 (file)
@@ -226,6 +226,27 @@ static void state_callback(mrp_res_context_t *context,
     }
 }
 
+
+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)
@@ -248,8 +269,7 @@ static void resource_callback(mrp_res_context_t *cx,
         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");
 
@@ -258,8 +278,7 @@ static void resource_callback(mrp_res_context_t *cx,
         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 */
 
index fb8dbd5..3f0d95a 100644 (file)
@@ -258,14 +258,16 @@ bool fetch_resource_name(mrp_msg_t *msg, void **pcursor,
 }
 
 
-static int priv_res_to_mrp_res(resource_def_t *src, mrp_res_resource_t *dst)
+static int priv_res_to_mrp_res(uint32_t id, resource_def_t *src, mrp_res_resource_t *dst)
 {
     dst->name  = mrp_strdup(src->name);
     dst->state = MRP_RES_RESOURCE_LOST;
     dst->priv->mandatory = false;
     dst->priv->shared = false;
-    dst->priv->num_attributes = src->num_attrs;
 
+    dst->priv->server_id = id;
+
+    dst->priv->num_attributes = src->num_attrs;
     dst->priv->attrs = src->attrs;
     return 0;
 }
@@ -339,7 +341,7 @@ mrp_res_resource_set_t *resource_query_response(mrp_msg_t *msg,
                 arr->priv->num_resources = i;
                 goto failed;
             }
-            priv_res_to_mrp_res(src, arr->priv->resources[i]);
+            priv_res_to_mrp_res(i, src, arr->priv->resources[i]);
         }
     }
 
index b4c4221..de7eb4a 100644 (file)
@@ -67,6 +67,7 @@ struct mrp_res_resource_private_s {
     bool shared;
     int num_attributes;
     mrp_res_attribute_t *attrs;
+    uint32_t server_id;
 };
 
 struct mrp_res_resource_set_private_s {
@@ -79,7 +80,7 @@ struct mrp_res_resource_set_private_s {
     mrp_res_resource_callback_t cb;
     void *user_data;
 
-    int num_resources;
+    uint32_t num_resources;
     mrp_res_resource_t **resources;
 
     mrp_list_hook_t hook;
index 05add4c..8229a50 100644 (file)
@@ -99,8 +99,8 @@ static void resource_event(mrp_msg_t *msg,
     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);
@@ -122,6 +122,7 @@ static void resource_event(mrp_msg_t *msg,
         goto malformed;
     }
 
+#if 0
     switch (state) {
         case RESPROTO_RELEASE:
             rset->state = MRP_RES_RESOURCE_LOST;
@@ -130,6 +131,7 @@ static void resource_event(mrp_msg_t *msg,
             rset->state = MRP_RES_RESOURCE_ACQUIRED;
             break;
     }
+#endif
 
     while (mrp_msg_iterate(msg, pcursor, &tag, &type, &value, &size)) {
 
@@ -149,26 +151,59 @@ static void resource_event(mrp_msg_t *msg,
         }
 
         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
@@ -176,6 +211,8 @@ static void resource_event(mrp_msg_t *msg,
      * 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);
index 90a0fbc..219592d 100644 (file)
 #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);
     }
 }
@@ -121,7 +146,7 @@ void decrease_ref(mrp_res_context_t *cx,
 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;
@@ -156,7 +181,7 @@ static void free_resource(mrp_res_resource_t *res)
 
 void free_resource_set(mrp_res_resource_set_t *rset)
 {
-    int i;
+    uint32_t i;
 
     if (!rset)
         return;
@@ -256,7 +281,7 @@ mrp_res_resource_set_t *resource_set_copy(
         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));
 
@@ -356,7 +381,7 @@ static int update_library_resource_set(mrp_res_context_t *cx,
 {
     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;
@@ -424,8 +449,9 @@ mrp_res_resource_t *mrp_res_create_resource(mrp_res_context_t *cx,
                     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;
@@ -434,6 +460,7 @@ mrp_res_resource_t *mrp_res_create_resource(mrp_res_context_t *cx,
         proto = cx->priv->master_resource_set->priv->resources[i];
         if (strcmp(proto->name, name) == 0) {
             found = true;
+            server_id = proto->priv->server_id;
             break;
         }
     }
@@ -455,6 +482,7 @@ mrp_res_resource_t *mrp_res_create_resource(mrp_res_context_t *cx,
     if (!res->priv)
         goto error;
 
+    res->priv->server_id = server_id;
     res->priv->mandatory = mandatory;
     res->priv->shared = shared;
     res->priv->pub = res;
@@ -591,7 +619,7 @@ void mrp_res_delete_resource(mrp_res_resource_set_t *set, mrp_res_resource_t *re
 
 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 */
@@ -623,7 +651,7 @@ bool mrp_res_delete_resource_by_name(mrp_res_resource_set_t *rs, const char *nam
 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)
@@ -659,7 +687,7 @@ mrp_res_resource_t * mrp_res_get_resource_by_name(mrp_res_context_t *cx,
                  const mrp_res_resource_set_t *rs,
                  const char *name)
 {
-    int i;
+    uint32_t i;
 
     if (!cx || !rs)
         return NULL;
@@ -680,14 +708,18 @@ int mrp_res_acquire_resource_set(mrp_res_context_t *cx,
     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);
 
@@ -699,6 +731,7 @@ int mrp_res_acquire_resource_set(mrp_res_context_t *cx,
 
         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
@@ -714,8 +747,10 @@ int mrp_res_acquire_resource_set(mrp_res_context_t *cx,
     /* 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);
 
@@ -723,8 +758,6 @@ int mrp_res_acquire_resource_set(mrp_res_context_t *cx,
     return 0;
 
 error:
-    mrp_log_error("mrp_res_acquire_resource_set error");
-
     mrp_msg_unref(msg);
     return -1;
 }