#include <murphy/resource/manager-api.h>
#include <murphy/resource/protocol.h>
+#include <murphy/resource/resource-set.h>
+
#define ATTRIBUTE_MAX MRP_ATTRIBUTE_MAX
}
+static void register_events(mrp_plugin_t *plugin)
+{
+ /* register the events that are sent on the resource state changes */
+
+ mrp_register_event(MURPHY_RESOURCE_EVENT_CREATED);
+ mrp_register_event(MURPHY_RESOURCE_EVENT_ACQUIRE);
+ mrp_register_event(MURPHY_RESOURCE_EVENT_RELEASE);
+ mrp_register_event(MURPHY_RESOURCE_EVENT_DESTROYED);
+}
+
static int resource_init(mrp_plugin_t *plugin)
{
plugin->data = data;
+ register_events(plugin);
subscribe_events(plugin);
initiate_lua_configuration(plugin);
#include <murphy/common/log.h>
#include "attribute.h"
-
+#include "client-api.h"
static mrp_attr_value_t *get_attr_value_from_list(mrp_attr_t *, const char *,
mqi_data_type_t);
return NULL;
}
+void mrp_resource_set_free_attribute(mrp_attr_t *attr)
+{
+ if (!attr)
+ return;
+
+ mrp_free(attr);
+}
+
+mrp_attr_t *mrp_resource_set_get_attribute_by_name(
+ mrp_resource_set_t *resource_set, const char *resource_name,
+ const char *attribute_name)
+{
+ mrp_attr_t *attr = NULL, *attrs;
+ uint32_t res_id;
+ mrp_attr_t attr_buf[128];
+ uint32_t attr_idx = 0;
+
+ memset(attr_buf, 0, sizeof(attr_buf));
+
+ res_id = mrp_resource_definition_get_resource_id_by_name(resource_name);
+ attrs = mrp_resource_definition_read_all_attributes(res_id, 128, attr_buf);
+
+ if (!attrs)
+ return NULL;
+
+ while (attrs->name != NULL) {
+ if (strcmp(attrs->name, attribute_name) == 0) {
+
+ mrp_attr_t *buf = mrp_allocz(sizeof(mrp_attr_t));
+ mrp_resource_set_read_attribute(resource_set, resource_name,
+ attr_idx, buf);
+
+ attr = buf;
+
+ break;
+ }
+ attr_idx++;
+ attrs++;
+ }
+
+ return attr;
+}
/*
* Local Variables:
mrp_resource_mask_t mrp_resource_get_mask(mrp_resource_t *resource);
bool mrp_resource_is_shared(mrp_resource_t *resource);
+/* Find a resource set given the resource set id. */
+mrp_resource_set_t *mrp_resource_set_find_by_id(uint32_t id);
+
+/* Get a single attribute object that contains the current value. */
+mrp_attr_t *mrp_resource_set_get_attribute_by_name(
+ mrp_resource_set_t *resource_set, const char *resource_name,
+ const char *attribute_name);
+
+/* Free the object obtained with mrp_resource_set_get_attribute_by_name. */
+void mrp_resource_set_free_attribute(mrp_attr_t *attr);
#endif /* __MURPHY_RESOURCE_CLIENT_API_H__ */
#include <stdio.h>
#include <string.h>
+#include <murphy/core/event.h>
+
#include <murphy/common/mm.h>
#include <murphy/common/hashtbl.h>
#include <murphy/common/utils.h>
static uint32_t get_request_stamp(void);
static const char *state_str(mrp_resource_state_t);
-
+static void send_rset_event(mrp_resource_set_t *rset,
+ mrp_resource_event_t ev);
uint32_t mrp_get_resource_set_count(void)
{
rset->dont_wait.current = dont_wait;
rset->dont_wait.client = dont_wait;
-
+
rset->auto_release.current = auto_release;
rset->auto_release.client = auto_release;
add_to_id_hash(rset);
mrp_resource_lua_register_resource_set(rset);
+
+ send_rset_event(rset, MRP_RESOURCE_EVENT_CREATED);
}
return rset;
rset->event = NULL; /* make sure nothing is sent any more */
+ send_rset_event(rset, MRP_RESOURCE_EVENT_DESTROYED);
+
mrp_resource_lua_unregister_resource_set(rset);
remove_from_id_hash(rset);
}
}
+static void send_rset_event(mrp_resource_set_t *rset, mrp_resource_event_t ev)
+{
+ uint id;
+
+ MRP_ASSERT(rset, "invalid argument");
+
+ /* The resource set id is enough information, because the full resource
+ * set can be found by making a query with the id. */
+
+ uint16_t tag = MRP_RESOURCE_TAG_RSET_ID;
+
+ switch (ev) {
+ case MRP_RESOURCE_EVENT_CREATED:
+ id = mrp_get_event_id(MURPHY_RESOURCE_EVENT_CREATED, 0);
+ mrp_log_info("emit event %d for rset %u", id, rset->id);
+ mrp_emit_event(id, MRP_MSG_TAG_UINT32(tag, rset->id), MRP_MSG_END);
+ break;
+ case MRP_RESOURCE_EVENT_ACQUIRE:
+ id = mrp_get_event_id(MURPHY_RESOURCE_EVENT_ACQUIRE, 0);
+ mrp_emit_event(id, MRP_MSG_TAG_UINT32(tag, rset->id), MRP_MSG_END);
+ break;
+ case MRP_RESOURCE_EVENT_RELEASE:
+ id = mrp_get_event_id(MURPHY_RESOURCE_EVENT_RELEASE, 0);
+ mrp_emit_event(id, MRP_MSG_TAG_UINT32(tag, rset->id), MRP_MSG_END);
+ break;
+ case MRP_RESOURCE_EVENT_DESTROYED:
+ id = mrp_get_event_id(MURPHY_RESOURCE_EVENT_DESTROYED, 0);
+ mrp_emit_event(id, MRP_MSG_TAG_UINT32(tag, rset->id), MRP_MSG_END);
+ break;
+ default:
+ break;
+ }
+}
+
void mrp_resource_set_notify(mrp_resource_set_t *rset, mrp_resource_event_t ev)
{
mrp_resource_t *res;
MRP_ASSERT(rset, "invalid argument");
+ send_rset_event(rset, ev);
+
while ((res = mrp_resource_set_iterate_resources(rset, &cursor)))
mrp_resource_notify(res, rset, ev);
}