{
mrp_msg_t *msg = NULL;
uint32_t i;
+ uint32_t flags = 0;
if (!cx || !rset)
return -1;
if (!cx->priv->connected)
return -1;
+ if (rset->priv->autorelease)
+ flags |= RESPROTO_RSETFLAG_AUTORELEASE;
+
msg = mrp_msg_create(
RESPROTO_SEQUENCE_NO, MRP_MSG_FIELD_UINT32, cx->priv->next_seqno,
RESPROTO_REQUEST_TYPE, MRP_MSG_FIELD_UINT16,
RESPROTO_CREATE_RESOURCE_SET,
- RESPROTO_RESOURCE_FLAGS, MRP_MSG_FIELD_UINT32, 0,
+ RESPROTO_RESOURCE_FLAGS, MRP_MSG_FIELD_UINT32, flags,
RESPROTO_RESOURCE_PRIORITY, MRP_MSG_FIELD_UINT32, 0,
RESPROTO_CLASS_NAME, MRP_MSG_FIELD_STRING, rset->application_class,
RESPROTO_ZONE_NAME, MRP_MSG_FIELD_STRING, cx->zone,
const char *app_class, mrp_res_resource_callback_t cb, void *userdata);
/**
+ * Set automatic release mode to the resource set. This means that if an
+ * application loses the resource set, it doesn't automatically get it back
+ * when the resource becomes available again. By default the automatic
+ * release mode is off.
+ *
+ * @param cx murphy connection context.
+ * @param status automatic release status: TRUE means on, FALSE means off
+ * @param rs resource set that is being updated.
+ *
+ * @return true if successful, false otherwise.
+ */
+bool mrp_res_set_autorelease(mrp_res_context_t *cx, bool status,
+ mrp_res_resource_set_t *rs);
+
+/**
* Delete resource set created with mrp_res_create_resource_set
* or mrp_res_copy_resource_set.
*
* set in the resource callback.
*
* @param cx connnection to Murphy resource engine.
- * @param set resource set you want to acquire.
+ * @param rs resource set you want to acquire.
*
* @return murphy error code.
*/
* set available status are still delivered.
*
* @param cx connnection to Murphy resource engine.
- * @param set resource set you want to release.
+ * @param rs resource set you want to release.
*
* @return murphy error code.
*/
uint32_t internal_ref_count;
uint32_t seqno;
+ bool autorelease;
+
mrp_res_resource_callback_t cb;
void *user_data;
rs->priv->cb = cb;
rs->priv->user_data = userdata;
rs->state = MRP_RES_RESOURCE_PENDING;
+ rs->priv->autorelease = FALSE;
rs->priv->resources = mrp_allocz_array(mrp_res_resource_t *,
cx->priv->master_resource_set->priv->num_resources);
return NULL;
}
+bool mrp_res_set_autorelease(mrp_res_context_t *cx, bool status,
+ mrp_res_resource_set_t *rs)
+{
+ if (!cx || !rs)
+ return FALSE;
+
+ /* the resource library doesn't allow updating already used sets */
+ if (rs->state != MRP_RES_RESOURCE_PENDING)
+ return FALSE;
+
+ rs->priv->autorelease = status;
+
+ return TRUE;
+}
+
int mrp_res_acquire_resource_set(mrp_res_context_t *cx,
const mrp_res_resource_set_t *original)