resource: add 'dontwait' flag
authorJanos Kovacs <jankovac503@gmail.com>
Thu, 13 Jun 2013 18:29:31 +0000 (21:29 +0300)
committerKrisztian Litkey <krisztian.litkey@intel.com>
Mon, 8 Jul 2013 14:41:29 +0000 (17:41 +0300)
src/plugins/plugin-resource-dbus.c
src/plugins/resource-native/plugin-resource-native.c
src/plugins/resource-native/resource-client.c
src/plugins/resource-wrt/plugin-resource-wrt.c
src/resource/client-api.h
src/resource/protocol.h
src/resource/resource-owner.c
src/resource/resource-set.c
src/resource/resource-set.h

index f03d713..7d018c6 100644 (file)
@@ -1002,7 +1002,7 @@ static resource_set_o_t * create_rset(manager_o_t *mgr, uint32_t id,
     if (mgr->ctx->tracking)
         mrp_dbus_follow_name(mgr->ctx->dbus, rset->owner, dbus_name_cb, rset);
 
-    rset->set = mrp_resource_set_create(mgr->client, 0, 0, event_cb,
+    rset->set = mrp_resource_set_create(mgr->client, 0, 0, 0, event_cb,
                 rset);
 
     if (!rset->set) {
index 263719e..19126ef 100644 (file)
@@ -607,6 +607,7 @@ static void create_resource_set_request(client_t *client, mrp_msg_t *req,
     int32_t                 status;
     bool                    auto_release;
     bool                    auto_acquire;
+    bool                    dont_wait;
     mrp_resource_event_cb_t event_cb;
 
     MRP_ASSERT(client, "invalid argument");
@@ -645,14 +646,15 @@ static void create_resource_set_request(client_t *client, mrp_msg_t *req,
 
     auto_release = (flags & RESPROTO_RSETFLAG_AUTORELEASE);
     auto_acquire = (flags & RESPROTO_RSETFLAG_AUTOACQUIRE);
+    dont_wait    = (flags & RESPROTO_RSETFLAG_DONTWAIT);
 
     if (flags & RESPROTO_RSETFLAG_NOEVENTS)
         event_cb = NULL;
     else
         event_cb = resource_event_handler;
 
-    rset = mrp_resource_set_create(client->rscli, auto_release, priority,
-                                   event_cb, client);
+    rset = mrp_resource_set_create(client->rscli, auto_release, dont_wait,
+                                   priority, event_cb, client);
     if (!rset)
         goto reply;
 
index f8b2684..1bfa269 100644 (file)
@@ -1605,11 +1605,13 @@ static void sighandler(mrp_sighandler_t *h, int signum, void *user_data)
 
 static void usage(client_t *client, int exit_code)
 {
-    printf("Usage: %s [-h] [-v] [-r] [-a] [-p pri] [class zone resources]\n"
+    printf("Usage: "
+           "%s [-h] [-v] [-r] [-a] [-w] [-p pri] [class zone resources]\n"
            "\nwhere\n"
            "\t-h\t\tprints this help\n"
            "\t-v\t\tverbose mode (dumps the transport messages)\n"
            "\t-a\t\tautoacquire mode\n"
+           "\t-w\t\tdont wait for resources if they were not available\n"
            "\t-r\t\tautorelease mode\n"
            "\t-p priority\t\tresource set priority (priority is 0-7)\n"
            "\tclass\t\tapplication class of the resource set\n"
@@ -1643,7 +1645,7 @@ static void parse_arguments(client_t *client, int argc, char **argv)
     char *e;
     int opt;
 
-    while ((opt = getopt(argc, argv, "hvrap:")) != -1) {
+    while ((opt = getopt(argc, argv, "hvrawp:")) != -1) {
         switch (opt) {
         case 'h':
             usage(client, 0);
@@ -1656,6 +1658,9 @@ static void parse_arguments(client_t *client, int argc, char **argv)
         case 'r':
             client->rsetf |= RESPROTO_RSETFLAG_AUTORELEASE;
             break;
+        case 'w':
+            client->rsetf |= RESPROTO_RSETFLAG_DONTWAIT;
+            break;
         case 'p':
             pri = strtoul(optarg, &e, 10);
             if (e == optarg || *e || pri > 7)
index e2c654b..30f0180 100644 (file)
@@ -713,6 +713,7 @@ static void create_set(wrt_client_t *c, mrp_json_t *req)
     mrp_json_t *jf, *jra, *jr;
     uint32_t    flags = 0, priority, rsid;
     bool        autorelease;
+    bool        dontwait;
     const char *appclass, *zone;
     char        attr[1024], *p;
     resdef_t    r;
@@ -733,6 +734,7 @@ static void create_set(wrt_client_t *c, mrp_json_t *req)
     }
 
     autorelease = (flags != 0);
+    dontwait    = false;
     mrp_debug("autorelease: %s", autorelease ? "true" : "false");
 
     /* dig out priority, class, and zone */
@@ -765,7 +767,8 @@ static void create_set(wrt_client_t *c, mrp_json_t *req)
     }
 
     /* create a new resource set */
-    rset = mrp_resource_set_create(c->rsc, autorelease, priority, event_cb, c);
+    rset = mrp_resource_set_create(c->rsc, autorelease, dontwait,
+                                   priority, event_cb, c);
 
     if (rset != NULL) {
         rsid = mrp_get_resource_set_id(rset);
index 050a24c..500619f 100644 (file)
@@ -62,6 +62,7 @@ int mrp_application_class_add_resource_set(const char *class_name,
 
 mrp_resource_set_t *mrp_resource_set_create(mrp_resource_client_t *client,
                                             bool auto_release,
+                                            bool dont_wait,
                                             uint32_t priority,
                                             mrp_resource_event_cb_t event_cb,
                                             void *user_data);
index f5369c7..9dabe9b 100644 (file)
@@ -43,6 +43,7 @@
 #define RESPROTO_RSETFLAG_AUTORELEASE RESPROTO_BIT(0)
 #define RESPROTO_RSETFLAG_AUTOACQUIRE RESPROTO_BIT(1)
 #define RESPROTO_RSETFLAG_NOEVENTS    RESPROTO_BIT(2)
+#define RESPROTO_RSETFLAG_DONTWAIT    RESPROTO_BIT(3)
 
 #define RESPROTO_RESFLAG_MANDATORY    RESPROTO_BIT(0)
 #define RESPROTO_RESFLAG_SHARED       RESPROTO_BIT(1)
index 1958ab7..b89e66e 100644 (file)
@@ -162,7 +162,7 @@ void mrp_resource_owner_update_zone(uint32_t zoneid,
     typedef struct {
         uint32_t replyid;
         mrp_resource_set_t *rset;
-        bool shuffle;
+        bool move;
     } event_t;
 
     mrp_resource_owner_t oldowners[MRP_RESOURCE_MAX];
@@ -183,7 +183,7 @@ void mrp_resource_owner_update_zone(uint32_t zoneid,
     uint32_t rcnt;
     bool force_release;
     bool changed;
-    bool shuffle;
+    bool move;
     mrp_resource_event_t notify;
     uint32_t replyid;
     uint32_t nevent, maxev;
@@ -286,20 +286,29 @@ void mrp_resource_owner_update_zone(uint32_t zoneid,
             }
 
             changed = false;
-            shuffle = false;
+            move    = false;
             notify  = 0;
             replyid = (reqset == rset && reqid == rset->request.id) ? reqid:0;
 
 
             if (force_release) {
-                shuffle = (rset->state != mrp_resource_release);
-                notify  = shuffle ? MRP_RESOURCE_EVENT_RELEASE : 0;
-                changed = shuffle || rset->resource.mask.grant;
+                move = (rset->state != mrp_resource_release);
+                notify = move ? MRP_RESOURCE_EVENT_RELEASE : 0;
+                changed = move || rset->resource.mask.grant;
                 rset->state = mrp_resource_release;
                 rset->resource.mask.grant = 0;
             }
             else {
-                if (grant != rset->resource.mask.grant) {
+                if (grant == rset->resource.mask.grant) {
+                    if (rset->state == mrp_resource_acquire &&
+                        !grant && rset->dont_wait)
+                    {
+                        notify = MRP_RESOURCE_EVENT_RELEASE;
+                        rset->state = mrp_resource_release;
+                        move = true;
+                    }
+                }
+                else {
                     rset->resource.mask.grant = grant;
                     changed = true;
 
@@ -307,7 +316,7 @@ void mrp_resource_owner_update_zone(uint32_t zoneid,
                         if (rset->state != mrp_resource_release)
                             notify = MRP_RESOURCE_EVENT_RELEASE;
                         rset->state = mrp_resource_release;
-                        shuffle = true;
+                        move = true;
                     }
                 }
             }
@@ -326,7 +335,7 @@ void mrp_resource_owner_update_zone(uint32_t zoneid,
 
                 ev->replyid = replyid;
                 ev->rset    = rset;
-                ev->shuffle = shuffle;
+                ev->move    = move;
             }
         } /* while rset */
     } /* while class */
@@ -336,7 +345,7 @@ void mrp_resource_owner_update_zone(uint32_t zoneid,
     for (lastev = (ev = events) + nevent;     ev < lastev;     ev++) {
         rset = ev->rset;
 
-        if (ev->shuffle)
+        if (ev->move)
             mrp_application_class_move_resource_set(rset);
 
         mrp_resource_set_updated(rset);
index b0b8dc9..73ff66c 100644 (file)
@@ -75,6 +75,7 @@ uint32_t mrp_get_resource_set_count(void)
 
 mrp_resource_set_t *mrp_resource_set_create(mrp_resource_client_t *client,
                                             bool auto_release,
+                                            bool dont_wait,
                                             uint32_t priority,
                                             mrp_resource_event_cb_t event_cb,
                                             void *user_data)
@@ -93,6 +94,7 @@ mrp_resource_set_t *mrp_resource_set_create(mrp_resource_client_t *client,
     else {
         rset->id = ++our_id;
         rset->auto_release = auto_release;
+        rset->dont_wait = dont_wait;
 
         mrp_list_init(&rset->resource.list);
         rset->resource.share = false;
@@ -417,12 +419,14 @@ int mrp_resource_set_print(mrp_resource_set_t *rset, size_t indent,
 
     mandatory = rset->resource.mask.mandatory;
 
-    PRINT("%s%3u - 0x%02x/0x%02x 0x%02x/0x%02x 0x%08x %d %s %s\n",
+    PRINT("%s%3u - 0x%02x/0x%02x 0x%02x/0x%02x 0x%08x %d %s%s%s %s\n",
           gap, rset->id,
           rset->resource.mask.all, mandatory,
           rset->resource.mask.grant, rset->resource.mask.advice,
           mrp_application_class_get_sorting_key(rset), rset->class.priority,
           rset->resource.share ? "shared   ":"exclusive",
+          rset->auto_release ? ",autorelease" : "",
+          rset->dont_wait ? ",dontwait" : "",
           state_str(rset->state));
 
     mrp_list_foreach(&rset->resource.list, resen, n) {
index 3ded68f..57ff5c9 100644 (file)
@@ -41,6 +41,7 @@ struct mrp_resource_set_s {
     uint32_t                        id;
     mrp_resource_state_t            state;
     bool                            auto_release;
+    bool                            dont_wait;
     struct {
         struct {
             mrp_resource_mask_t all;