Browse Source

created test case for push with three agents

max 8 years ago
parent
commit
7bda7343ef
6 changed files with 80 additions and 20 deletions
  1. 1 0
      CMakeLists.txt
  2. 17 13
      src/myco-agent.c
  3. 10 2
      src/myco-daemon.c
  4. 2 3
      src/myco-ipc.c
  5. 4 2
      test/mycoagent.c
  6. 46 0
      test/mycoagent3.c

+ 1 - 0
CMakeLists.txt

@@ -5,5 +5,6 @@ set(CMAKE_EXE_LINKER_FLAGS "-lrt")
 
 add_executable(mycoagent test/mycoagent.c)
 add_executable(mycoagent2 test/mycoagent2.c)
+add_executable(mycoagent3 test/mycoagent3.c)
 add_executable(mycodaemon test/mycodaemon.c)
 #target_link_libraries(mycoagent rt)

+ 17 - 13
src/myco-agent.c

@@ -21,7 +21,7 @@
 int myco_agent_register(const char *agent_name) {
     int agent_message_queue_id;
     int global_message_queue_id;
-    message msg;
+    message msg = {};
 
     sprintf(msg.agent_name, "%s", agent_name);
 
@@ -37,14 +37,14 @@ int myco_agent_register(const char *agent_name) {
     }
     if (strncmp(msg.message, "SUCCESS:", 8) != 0) {
         myco_remove_message_queue(agent_message_queue_id);
-        return -1;
+        exit(EXIT_FAILURE);
     }
 
     return agent_message_queue_id;
 }
 
 int myco_agent_unregister (const char *agent_name, int agent_message_queue_id) {
-    message msg;
+    message msg = {};
     msg.agent_message_queue_id = agent_message_queue_id;
     sprintf(msg.agent_name, "%s", agent_name);
     sprintf(msg.message, "UNREGISTER AGENT");
@@ -69,7 +69,7 @@ void *myco_agent_register_resource (int agent_message_queue_id, const char *agen
     int r = ftruncate(file_descriptor, size);
     void *pointer = mmap(0, size, PROT_READ | PROT_WRITE, MAP_SHARED, file_descriptor, 0);
 
-    message msg;
+    message msg = {};
     msg.agent_message_queue_id = agent_message_queue_id;
     sprintf(msg.agent_name, "%s", agent_name);
     sprintf(msg.resource_name, "%s", resource_name);
@@ -93,7 +93,7 @@ void *myco_agent_register_resource (int agent_message_queue_id, const char *agen
 }
 
 int myco_agent_unregister_resource (int agent_message_queue_id, const char *resource_name) {
-    message msg;
+    message msg = {};
     msg.agent_message_queue_id = agent_message_queue_id;
     sprintf(msg.resource_name, "%s", resource_name);
     sprintf(msg.message, "UNREGISTER RESOURCE");
@@ -114,7 +114,7 @@ int myco_agent_unregister_resource (int agent_message_queue_id, const char *reso
 }
 
 int myco_agent_lock_resource (int agent_message_queue_id, const char *agent_name, const char *resource_name) {
-    message msg;
+    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);
@@ -134,7 +134,7 @@ int myco_agent_lock_resource (int agent_message_queue_id, const char *agent_name
 }
 
 int myco_agent_release_resource (int agent_message_queue_id, const char *agent_name, const char *resource_name, void *resource_pointer, int resource_size) {
-    message msg;
+    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);
@@ -156,7 +156,7 @@ int myco_agent_release_resource (int agent_message_queue_id, const char *agent_n
 }
 
 int myco_agent_unlock_resource (int agent_message_queue_id, const char *agent_name, const char *resource_name) {
-    message msg;
+    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);
@@ -177,7 +177,7 @@ int myco_agent_unlock_resource (int agent_message_queue_id, const char *agent_na
 
 struct resource myco_agent_request_resource(int agent_message_queue_id, char *agent_name, char *resource_name) {
     struct resource myresource;
-    message msg;
+    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);
@@ -209,7 +209,7 @@ int myco_agent_request_resource_list(int agent_message_queue_id) {
     char *resource_pointer;
     char *split;
 
-    message msg;
+    message msg = {};
     msg.agent_message_queue_id = agent_message_queue_id;
     sprintf(msg.message, "REQUEST LIST");
     msg.resource_size = 0;
@@ -248,7 +248,7 @@ int myco_agent_request_resource_list(int agent_message_queue_id) {
 }
 
 int myco_agent_write_remote_resource(int agent_message_queue_id, char *resource_name, void *pointer, int size, int force) {
-    message msg;
+    message msg = {};
     msg.agent_message_queue_id = agent_message_queue_id;
     sprintf(msg.resource_name, "%s", resource_name);
     if (force == 1) {
@@ -271,19 +271,23 @@ int myco_agent_write_remote_resource(int agent_message_queue_id, char *resource_
         myco_write_memory(msg.sender_pid, msg.resource_pointer, msg.resource_size, pointer, size);
     }
 
+    if (strncmp(msg.message, "SUCCESS: version updated, sending information for resource", 20) == 0) {
+        myco_write_memory(msg.sender_pid, msg.resource_pointer, msg.resource_size, pointer, size);
+    }
+
     return 0;
 }
 
 struct resource myco_agent_read_remote_resource(int agent_message_queue_id, char *resource_name) {
     struct resource myresource;
-    message msg;
+    message msg = {};
     msg.agent_message_queue_id = agent_message_queue_id;
     sprintf(msg.resource_name, "%s", resource_name);
     sprintf(msg.message, "READ REMOTE RESOURCE");
 
     msg = myco_send_and_receive(msg, myco_get_global_message_queue(), agent_message_queue_id);
 
-    if(DEBUG) {
+    if (DEBUG) {
         printf("%s", msg.message);
     }
 

+ 10 - 2
src/myco-daemon.c

@@ -411,7 +411,11 @@ int myco_daemon_write_remote_resource(message msg, int force) {
             myco_send(msg.agent_message_queue_id, msg);
             return -1;
         } else {
-            sprintf(msg.message, "SUCCESS: resource %s version updated, sending information\n", msg.resource_name);
+            sprintf(msg.message, "SUCCESS: version updated, sending information for resource %s\n", msg.resource_name);
+            msg.resource_pointer = current_resource->pointer;
+            msg.resource_size = current_resource->size;
+            msg.sender_pid = current_resource->pid;
+            myco_send(msg.agent_message_queue_id, msg);
             current_resource->version += 1;
             myco_send(msg.agent_message_queue_id, msg);
             return 0;
@@ -507,7 +511,7 @@ int myco_daemon_unlock_resource(message msg) {
 
 int myco_daemon_start(pid) {
     int daemon_message_queue_id;
-    message msg;
+    message msg = {0};
 
     // Create message queue
     daemon_message_queue_id = myco_create_global_message_queue();
@@ -519,6 +523,10 @@ int myco_daemon_start(pid) {
     // Receive messages
     while (1) {
         msg = myco_receive(daemon_message_queue_id);
+        if (DEBUG) {
+            printf("%d, %s, %s, %s, %p, %d, %d, %d, %d\n", msg.agent_message_queue_id, msg.agent_name, msg.message, \
+                    msg.resource_name, msg.resource_pointer, msg.resource_size, msg.resource_transactional, msg.sender_pid, msg.version);
+        }
         if (msg.message == NULL) {
             fprintf(stderr, "FATAL ERROR: No message could be received. %s\n", strerror(errno));
             return -1;

+ 2 - 3
src/myco-ipc.c

@@ -76,6 +76,7 @@ int myco_remove_message_queue(int message_queue_id) {
 int myco_send(int message_queue_id, message msg) {
     message_item m;
     m.mtype = 1;
+
     memcpy(m.mtext, &msg, sizeof(msg));
 
     if (msgsnd(message_queue_id, &m, sizeof(m.mtext), 0) == -1) {
@@ -86,7 +87,7 @@ int myco_send(int message_queue_id, message msg) {
 }
 
 message myco_receive(int message_queue_id) {
-    message msg;
+    message msg = {0};
     message_item m;
 
     if ((msgrcv(message_queue_id, &m, sizeof(m.mtext), 0, 0)) < 0) {
@@ -95,8 +96,6 @@ message myco_receive(int message_queue_id) {
 
     memcpy(&msg, m.mtext, sizeof(msg));
 
-    //printf("%d, %s, %s, %s, %p, %d, %d, %d, %d\n", msg.agent_message_queue_id, msg.agent_name, msg.message, msg.resource_name, msg.resource_pointer, msg.resource_size, msg.resource_transactional, msg.sender_pid, msg.version);
-
     return msg;
 }
 

+ 4 - 2
test/mycoagent.c

@@ -56,11 +56,13 @@ int main() {
     }
 
     // Change some values in RESOURCE_3
-    ((int*)myresource3.pointer)[0] = 0;
+    if (myresource3.size != -1) {
+        ((int*)myresource3.pointer)[0] = 0;
+    }
 
     // MYCO push
     // #MYCO push("RESOURCE_3")
-    myco_agent_write_remote_resource(agent_message_queue_id, "RESOURCE_3", myresource3.pointer, myresource3.size, 1);
+    myco_agent_write_remote_resource(agent_message_queue_id, "RESOURCE_3", myresource3.pointer, myresource3.size, 0);
 
 
     // MYCO free

+ 46 - 0
test/mycoagent3.c

@@ -0,0 +1,46 @@
+/*  
+ * mycoagent.c
+ *
+ * This is an example agent that showcases the use of mycorrhiza.
+ */
+
+#include "../src/myco-agent.c"
+
+// MYCO fetch:          Requests a remote, transactional resource. Blocks until
+//                      the resource has been granted.
+// MYCO create:         Creates a new resource and registers it with the agent.
+// MYCO release:        Releases a resource. It can now be taken by other agents via fetch.
+// MYCO free:           Destroys a resource for the entire system. Only works if the calling agent has ownership (fetch/create) of the resource.
+// MYCO read:           Creates a local copy of a remote resource.
+// MYCO push:           Updates the remote resource with the local copy obtained from read.
+// MYCO lock:           Protects a resource from read access.
+// MYCO unlock:         Allows read access again.
+
+int main() {
+    // At the beginning every agent needs to register itself with the agent server.
+    char *agent_name = "MYAGENT3";
+    int agent_message_queue_id = myco_agent_register(agent_name);
+
+    // 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) {
+        printf("The first integer of RESOURCE_3 is: %d\n", *((int*)myresource3.pointer));
+    }
+
+    // Change some values in RESOURCE_3
+    ((int*)myresource3.pointer)[0] = 1;
+
+    sleep(10);
+
+    // MYCO push
+    // #MYCO push("RESOURCE_3")
+    myco_agent_write_remote_resource(agent_message_queue_id, "RESOURCE_3", myresource3.pointer, myresource3.size, 0);
+
+
+    // At the end of its runtime the agent unregisters with the daemon.
+    myco_agent_unregister(agent_name, agent_message_queue_id);
+
+    return EXIT_SUCCESS;
+}