|
@@ -14,6 +14,7 @@
|
|
|
*/
|
|
|
|
|
|
#include "myco-daemon.h"
|
|
|
+#include "../src/myco-memory.c"
|
|
|
|
|
|
myco_agent *first_agent = NULL;
|
|
|
myco_resource *first_resource = NULL;
|
|
@@ -181,6 +182,9 @@ int myco_daemon_register_resource(message msg) {
|
|
|
first_resource->prev = NULL;
|
|
|
sprintf(first_resource->name, "%s", msg.resource_name);
|
|
|
sprintf(first_resource->agent, "%s", msg.agent_name);
|
|
|
+ first_resource->pid = msg.sender_pid;
|
|
|
+ first_resource->pointer = msg.resource_pointer;
|
|
|
+ first_resource->size = msg.resource_size;
|
|
|
first_resource->transactional = msg.resource_transactional;
|
|
|
} else {
|
|
|
// Insert as last element
|
|
@@ -193,6 +197,9 @@ int myco_daemon_register_resource(message msg) {
|
|
|
current_resource->next->next = NULL;
|
|
|
sprintf(current_resource->next->name, "%s", msg.resource_name);
|
|
|
sprintf(current_resource->next->agent, "%s", msg.agent_name);
|
|
|
+ current_resource->next->pid = msg.sender_pid;
|
|
|
+ current_resource->next->pointer = msg.resource_pointer;
|
|
|
+ current_resource->next->size = msg.resource_size;
|
|
|
current_resource->next->transactional = msg.resource_transactional;
|
|
|
}
|
|
|
|
|
@@ -263,6 +270,51 @@ int myco_daemon_unregister_resource(message msg) {
|
|
|
}
|
|
|
|
|
|
int myco_daemon_request_resource(message msg) {
|
|
|
+ myco_resource *current_resource;
|
|
|
+
|
|
|
+ // Check if resource exists
|
|
|
+ if ((current_resource = myco_daemon_find_resource(msg.resource_name)) == NULL) {
|
|
|
+ sprintf(msg.message, "ERROR: resource %s does not exist\n", msg.resource_name);
|
|
|
+ myco_send(msg.agent_message_queue_id, msg);
|
|
|
+ return -1;
|
|
|
+ }
|
|
|
+ // Check if agent that requests already owns the resource
|
|
|
+ if (strcmp(current_resource->agent, msg.agent_name) == 0) {
|
|
|
+ sprintf(msg.message, "ERROR: resource %s already belongs to agent %s\n", msg.resource_name, msg.agent_name);
|
|
|
+ myco_send(msg.agent_message_queue_id, msg);
|
|
|
+ return -1;
|
|
|
+ }
|
|
|
+ // Check if resource is transactional
|
|
|
+ if (current_resource->transactional != RESOURCE_TRANSACTIONAL) {
|
|
|
+ sprintf(msg.message, "ERROR: resource %s is not transactional\n", msg.resource_name);
|
|
|
+ myco_send(msg.agent_message_queue_id, msg);
|
|
|
+ return -1;
|
|
|
+ }
|
|
|
+
|
|
|
+ //TODO: Check if resource is on the same node
|
|
|
+
|
|
|
+ // If on same node, grant
|
|
|
+ msg.sender_pid = current_resource->pid;
|
|
|
+ msg.resource_size = current_resource->size;
|
|
|
+ msg.resource_pointer = current_resource->pointer;
|
|
|
+ sprintf(msg.message, "SUCCESS: resource found on same node, sending information\n");
|
|
|
+ myco_send(msg.agent_message_queue_id, msg);
|
|
|
+
|
|
|
+ msg = myco_receive(msg.agent_message_queue_id);
|
|
|
+ if (strcmp(msg.message, "RESOURCE GRANTED\n") == 0) {
|
|
|
+ //TODO: Tell other agent to free resource
|
|
|
+
|
|
|
+ // Transfer ownership of resource to agent
|
|
|
+ sprintf(current_resource->agent, "%s", msg.agent_name);
|
|
|
+ current_resource->pid = msg.sender_pid;
|
|
|
+ current_resource->pointer = msg.resource_pointer;
|
|
|
+ } else {
|
|
|
+ fprintf(stderr, "ERROR: myco_daemon_request: %s\n", strerror(errno));
|
|
|
+ return -1;
|
|
|
+ }
|
|
|
+
|
|
|
+ return 0;
|
|
|
+
|
|
|
sprintf(msg.message, "SUCCESS: resource granted\n");
|
|
|
myco_send(msg.agent_message_queue_id, msg);
|
|
|
|
|
@@ -281,7 +333,7 @@ int myco_daemon_request_list(message msg, pid_t pid) {
|
|
|
}
|
|
|
|
|
|
resource_size += 4;
|
|
|
- resource_pointer = malloc(resource_size);
|
|
|
+ resource_pointer = myco_malloc(resource_size);
|
|
|
memset(resource_pointer, 0, resource_size);
|
|
|
|
|
|
current_resource = first_resource;
|
|
@@ -306,8 +358,8 @@ int myco_daemon_request_list(message msg, pid_t pid) {
|
|
|
myco_send(msg.agent_message_queue_id, msg);
|
|
|
|
|
|
msg = myco_receive(msg.agent_message_queue_id);
|
|
|
- if (strcmp(msg.message, "RESOURCE GRANTED\n") == 0) {
|
|
|
- free(resource_pointer);
|
|
|
+ if (strcmp(msg.message, "RESOURCE LIST GRANTED\n") == 0) {
|
|
|
+ myco_free(resource_pointer);
|
|
|
} else {
|
|
|
fprintf(stderr, "ERROR: myco_daemon_request_list: %s\n", strerror(errno));
|
|
|
return -1;
|
|
@@ -381,7 +433,7 @@ int myco_daemon_start(pid) {
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
if (myco_remove_message_queue(daemon_message_queue_id) == -1) {
|
|
|
fprintf(stderr, "FATAL ERROR: could not remove message queue %d\n", daemon_message_queue_id);
|
|
|
return -1;
|