|
@@ -63,7 +63,11 @@ int myco_agent_unregister (const char *agent_name, int agent_message_queue_id) {
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
-int myco_agent_register_resource (int agent_message_queue_id, const char *agent_name, const char *resource_name, int resource_transactional, pid_t pid, int size, void* pointer) {
|
|
|
+void *myco_agent_register_resource (int agent_message_queue_id, const char *agent_name, const char *resource_name, int resource_transactional, pid_t pid, int size) {
|
|
|
+ int file_descriptor = shm_open(resource_name, O_CREAT | O_TRUNC | O_RDWR, 0666);
|
|
|
+ int r = ftruncate(file_descriptor, size);
|
|
|
+ void *pointer = mmap(0, size, PROT_READ | PROT_WRITE, MAP_SHARED, file_descriptor, 0);
|
|
|
+
|
|
|
message msg;
|
|
|
msg.agent_message_queue_id = agent_message_queue_id;
|
|
|
sprintf(msg.agent_name, "%s", agent_name);
|
|
@@ -81,10 +85,10 @@ int myco_agent_register_resource (int agent_message_queue_id, const char *agent_
|
|
|
}
|
|
|
|
|
|
if (strncmp(msg.message, "SUCCESS:", 8) != 0) {
|
|
|
- return -1;
|
|
|
+ return NULL;
|
|
|
}
|
|
|
|
|
|
- return 0;
|
|
|
+ return pointer;
|
|
|
}
|
|
|
|
|
|
int myco_agent_unregister_resource (int agent_message_queue_id, const char *resource_name) {
|
|
@@ -103,13 +107,16 @@ int myco_agent_unregister_resource (int agent_message_queue_id, const char *reso
|
|
|
return -1;
|
|
|
}
|
|
|
|
|
|
+ int r = shm_unlink(resource_name);
|
|
|
+
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
-int myco_agent_lock_resource (int agent_message_queue_id, const char *resource_name) {
|
|
|
+int myco_agent_lock_resource (int agent_message_queue_id, const char *agent_name, const char *resource_name) {
|
|
|
message msg;
|
|
|
msg.agent_message_queue_id = agent_message_queue_id;
|
|
|
sprintf(msg.resource_name, "%s", resource_name);
|
|
|
+ sprintf(msg.agent_name, "%s", agent_name);
|
|
|
sprintf(msg.message, "LOCK RESOURCE\n");
|
|
|
|
|
|
msg = myco_send_and_receive(msg, myco_get_global_message_queue(), agent_message_queue_id);
|
|
@@ -125,7 +132,7 @@ int myco_agent_lock_resource (int agent_message_queue_id, const char *resource_n
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
-int myco_agent_release_resource (int agent_message_queue_id, const char *resource_name) {
|
|
|
+int myco_agent_release_resource (int agent_message_queue_id, const char *resource_name, void *resource_pointer, int resource_size) {
|
|
|
message msg;
|
|
|
msg.agent_message_queue_id = agent_message_queue_id;
|
|
|
sprintf(msg.resource_name, "%s", resource_name);
|
|
@@ -141,13 +148,16 @@ int myco_agent_release_resource (int agent_message_queue_id, const char *resourc
|
|
|
return -1;
|
|
|
}
|
|
|
|
|
|
+ int r = munmap(resource_pointer, resource_size);
|
|
|
+
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
-int myco_agent_unlock_resource (int agent_message_queue_id, const char *resource_name) {
|
|
|
+int myco_agent_unlock_resource (int agent_message_queue_id, const char *agent_name, const char *resource_name) {
|
|
|
message msg;
|
|
|
msg.agent_message_queue_id = agent_message_queue_id;
|
|
|
sprintf(msg.resource_name, "%s", resource_name);
|
|
|
+ sprintf(msg.agent_name, "%s", agent_name);
|
|
|
sprintf(msg.message, "UNLOCK RESOURCE\n");
|
|
|
|
|
|
msg = myco_send_and_receive(msg, myco_get_global_message_queue(), agent_message_queue_id);
|
|
@@ -184,8 +194,8 @@ struct resource myco_agent_request_resource(int agent_message_queue_id, char *re
|
|
|
myresource.pointer = myco_malloc(msg.resource_size);
|
|
|
myresource.size = msg.resource_size;
|
|
|
|
|
|
- if (myco_read_transactional(msg.sender_pid, msg.resource_pointer, msg.resource_size, myresource.pointer, myresource.size) == -1) {
|
|
|
- fprintf(stderr, "FATAL ERROR in myco_read_transactional() %s\n", strerror(errno));
|
|
|
+ if (myco_copy_memory(msg.sender_pid, msg.resource_pointer, msg.resource_size, myresource.pointer, myresource.size) == -1) {
|
|
|
+ fprintf(stderr, "FATAL ERROR in myco_copy_memory() %s\n", strerror(errno));
|
|
|
myresource.size = -1;
|
|
|
return myresource;
|
|
|
}
|
|
@@ -208,7 +218,7 @@ int myco_agent_request_resource_list(int agent_message_queue_id) {
|
|
|
msg = myco_send_and_receive(msg, myco_get_global_message_queue(), agent_message_queue_id);
|
|
|
|
|
|
if(DEBUG) {
|
|
|
- printf("%s", msg.message);
|
|
|
+ //printf("%s", msg.message);
|
|
|
}
|
|
|
|
|
|
if (strncmp(msg.message, "SUCCESS:", 8) != 0) {
|
|
@@ -217,7 +227,7 @@ int myco_agent_request_resource_list(int agent_message_queue_id) {
|
|
|
|
|
|
resource_pointer = myco_malloc(msg.resource_size);
|
|
|
|
|
|
- if (myco_read_transactional(msg.sender_pid, msg.resource_pointer, msg.resource_size, (void *)resource_pointer, msg.resource_size) == -1) {
|
|
|
+ if (myco_copy_memory(msg.sender_pid, msg.resource_pointer, msg.resource_size, (void *)resource_pointer, msg.resource_size) == -1) {
|
|
|
printf("ERROR: %s\n", strerror(errno));
|
|
|
return -1;
|
|
|
}
|
|
@@ -278,8 +288,8 @@ struct resource myco_agent_read_remote_resource(int agent_message_queue_id, char
|
|
|
myresource.pointer = myco_malloc(msg.resource_size);
|
|
|
myresource.size = msg.resource_size;
|
|
|
|
|
|
- if (myco_read_transactional(msg.sender_pid, msg.resource_pointer, msg.resource_size, myresource.pointer, myresource.size) == -1) {
|
|
|
- fprintf(stderr, "FATAL ERROR in myco_read_transactional() %s\n", strerror(errno));
|
|
|
+ if (myco_copy_memory(msg.sender_pid, msg.resource_pointer, msg.resource_size, myresource.pointer, myresource.size) == -1) {
|
|
|
+ fprintf(stderr, "FATAL ERROR in myco_copy_memory() %s\n", strerror(errno));
|
|
|
myresource.size = -1;
|
|
|
return myresource;
|
|
|
}
|