Browse Source

implemented fetch with shared memory

max 8 years ago
parent
commit
8d71ac1bbc
3 changed files with 19 additions and 41 deletions
  1. 4 8
      src/myco-agent.c
  2. 1 14
      test/mycoagent.c
  3. 14 19
      test/mycoagent2.c

+ 4 - 8
src/myco-agent.c

@@ -191,14 +191,10 @@ struct resource myco_agent_request_resource(int agent_message_queue_id, char *re
         return myresource;
     }
 
-    myresource.pointer = myco_malloc(msg.resource_size);
     myresource.size = msg.resource_size;
-
-    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;
-    }
+    int file_descriptor = shm_open(resource_name, O_RDWR, 0666);
+    int r = ftruncate(file_descriptor, myresource.size);
+    myresource.pointer = mmap(0, myresource.size, PROT_READ | PROT_WRITE, MAP_SHARED, file_descriptor, 0);
 
     sprintf(msg.message, "RESOURCE GRANTED\n");
     myco_send(msg.agent_message_queue_id, msg);
@@ -218,7 +214,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) {

+ 1 - 14
test/mycoagent.c

@@ -27,30 +27,20 @@ int main() {
     int resource_size = 1024;
     void *resource_pointer = myco_agent_register_resource(agent_message_queue_id, agent_name, resource_name, RESOURCE_TRANSACTIONAL, getpid(), resource_size);
 
-    myco_agent_request_resource_list(agent_message_queue_id);
-
     // MYCO lock
     myco_agent_lock_resource(agent_message_queue_id, agent_name, resource_name);
 
-    myco_agent_request_resource_list(agent_message_queue_id);
-
     // MYCO unlock
     myco_agent_unlock_resource(agent_message_queue_id, agent_name, resource_name);
 
-    myco_agent_request_resource_list(agent_message_queue_id);
-
     // MYCO release
-    // unmap memory
     myco_agent_release_resource(agent_message_queue_id, resource_name, resource_pointer, resource_size);
 
-    // View resources
+    // View available resources
     myco_agent_request_resource_list(agent_message_queue_id);
 
     // MYCO fetch
     // #MYCO fetch("RESOURCE_2")
-    // open shared memory
-    // mmap memory
-    /*
     struct resource myresource2;
     myresource2 = myco_agent_request_resource(agent_message_queue_id, "RESOURCE_2");
     if (myresource2.size != -1) {
@@ -58,11 +48,9 @@ int main() {
     } else {
         fprintf(stderr, "Transfer did not work!\n");
     }
-    */
 
     // MYCO read
     // #MYCO read("RESOURCE_3")
-    /*
     struct resource myresource3;
     myresource3 = myco_agent_read_remote_resource(agent_message_queue_id, "RESOURCE_3");
     if (myresource3.size != -1) {
@@ -70,7 +58,6 @@ int main() {
     } else {
         fprintf(stderr, "Transfer did not work!\n");
     }
-    */
 
     // MYCO push
     // TODO

+ 14 - 19
test/mycoagent2.c

@@ -17,7 +17,6 @@
 // MYCO unlock:         Allows read access again.
 
 int main() {
-    /*
     // At the beginning every agent needs to register itself with the agent server.
     char *agent_name = "MYAGENT2";
     int agent_message_queue_id;
@@ -25,52 +24,48 @@ int main() {
 
     // MYCO create
     // #MYCO create("RESOURCE_2", 1024, transactional)
+    char *resource_name_2 = "RESOURCE_2";
     int resource_size_2 = 1024;
-    int *resource_pointer_2;
-    resource_pointer_2 = myco_malloc(resource_size_2);
-    myco_agent_register_resource(agent_message_queue_id, agent_name, "RESOURCE_2", RESOURCE_TRANSACTIONAL, getpid(), resource_size_2, resource_pointer_2);
+    void *resource_pointer_2 = myco_agent_register_resource(agent_message_queue_id, agent_name, resource_name_2, RESOURCE_TRANSACTIONAL, getpid(), resource_size_2);
 
     // Put some random numbers into RESOURCE_2
     int i;
     srand(time(NULL));
     for (i=0; i < resource_size_2/sizeof(int); i++) {
-        resource_pointer_2[i] = rand();
+        ((int *)resource_pointer_2)[i] = rand();
     }
-    printf("The first integer of RESOURCE_2 is: %d\n", resource_pointer_2[0]);
+    printf("The first integer of RESOURCE_2 is: %d\n", ((int *)resource_pointer_2)[0]);
 
     // MYCO release
-    myco_agent_release_resource(agent_message_queue_id, "RESOURCE_2");
+    myco_agent_release_resource(agent_message_queue_id, resource_name_2, resource_pointer_2, resource_size_2);
 
     // MYCO create
-    // #MYCO create("RESOURCE_2", 1024, nottransactional)
+    // #MYCO create("RESOURCE_3", 1024, nottransactional)
+    char *resource_name_3 = "RESOURCE_3";
     int resource_size_3 = 1024;
-    int *resource_pointer_3;
-    resource_pointer_3 = myco_malloc(resource_size_3);
-    myco_agent_register_resource(agent_message_queue_id, agent_name, "RESOURCE_3", RESOURCE_NOT_TRANSACTIONAL, getpid(), resource_size_3, resource_pointer_3);
+    void *resource_pointer_3 = myco_agent_register_resource(agent_message_queue_id, agent_name, resource_name_3, RESOURCE_TRANSACTIONAL, getpid(), resource_size_3);
 
     // Put some random numbers into RESOURCE_3
-    for (i=0; i < resource_size_3/sizeof(int); i++) {
-        resource_pointer_3[i] = rand();
+    int j;
+    for (j=0; j < resource_size_3/sizeof(int); j++) {
+        ((int*)resource_pointer_3)[j] = rand();
     }
-    printf("The first integer of RESOURCE_3 is: %d\n", resource_pointer_3[0]);
+    printf("The first integer of RESOURCE_3 is: %d\n", ((int*)resource_pointer_3)[0]);
 
     // Sleep, so the showcase program can request RESOURCE_2 and read/push RESOURCE_3
     sleep(30);
 
     // MYCO free
     // #MYCO free("RESOURCE_2")
-    myco_agent_unregister_resource(agent_message_queue_id, "RESOURCE_2");
-    myco_free(resource_pointer_2);
+    myco_agent_unregister_resource(agent_message_queue_id, resource_name_2);
 
     // MYCO free
     // #MYCO free("RESOURCE_3")
-    myco_agent_unregister_resource(agent_message_queue_id, "RESOURCE_3");
-    myco_free(resource_pointer_3);
+    myco_agent_unregister_resource(agent_message_queue_id, resource_name_3);
     
 
     // At the end of its runtime the agent unregisters with the agent.
     myco_agent_unregister(agent_name, agent_message_queue_id);
-    */
 
     return EXIT_SUCCESS;
 }