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) {
int32_t status;
bool auto_release;
bool auto_acquire;
+ bool dont_wait;
mrp_resource_event_cb_t event_cb;
MRP_ASSERT(client, "invalid argument");
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;
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"
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);
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)
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;
}
autorelease = (flags != 0);
+ dontwait = false;
mrp_debug("autorelease: %s", autorelease ? "true" : "false");
/* dig out priority, class, and zone */
}
/* 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);
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);
#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)
typedef struct {
uint32_t replyid;
mrp_resource_set_t *rset;
- bool shuffle;
+ bool move;
} event_t;
mrp_resource_owner_t oldowners[MRP_RESOURCE_MAX];
uint32_t rcnt;
bool force_release;
bool changed;
- bool shuffle;
+ bool move;
mrp_resource_event_t notify;
uint32_t replyid;
uint32_t nevent, maxev;
}
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;
if (rset->state != mrp_resource_release)
notify = MRP_RESOURCE_EVENT_RELEASE;
rset->state = mrp_resource_release;
- shuffle = true;
+ move = true;
}
}
}
ev->replyid = replyid;
ev->rset = rset;
- ev->shuffle = shuffle;
+ ev->move = move;
}
} /* while rset */
} /* while class */
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);
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)
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;
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) {
uint32_t id;
mrp_resource_state_t state;
bool auto_release;
+ bool dont_wait;
struct {
struct {
mrp_resource_mask_t all;