Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Merge branch 'master' of git+ssh://scm.gforge.inria.fr//gitroot/simgrid/simgrid
[simgrid.git] / examples / gras / rpc / rpc.c
index edf6844..a12da53 100644 (file)
@@ -1,6 +1,7 @@
 /* rpc - demo of the RPC features in GRAS                                   */
 
-/* Copyright (c) 2006 Martin Quinson. All rights reserved.                  */
+/* Copyright (c) 2006, 2007, 2009, 2010. The SimGrid Team.
+ * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
  * under the terms of the license (GNU LGPL) which comes with this package. */
@@ -13,8 +14,8 @@ XBT_LOG_NEW_DEFAULT_CATEGORY(Rpc, "Messages specific to this example");
 static void register_messages(void)
 {
   gras_msgtype_declare_rpc("plain ping",
-                           gras_datadesc_by_name("int"),
-                           gras_datadesc_by_name("int"));
+                           xbt_datadesc_by_name("int"),
+                           xbt_datadesc_by_name("int"));
 
   gras_msgtype_declare_rpc("raise exception", NULL, NULL);
   gras_msgtype_declare_rpc("forward exception", NULL, NULL);
@@ -27,7 +28,7 @@ int forwarder(int argc, char *argv[]);
 int client(int argc, char *argv[]);
 
 #define exception_msg       "Error for the client"
-#define exception_raising() THROW0(unknown_error,42,exception_msg)
+#define exception_raising() THROWF(unknown_error,42,exception_msg)
 
 static void exception_catching(void)
 {
@@ -41,17 +42,17 @@ static void exception_catching(void)
     }
     CATCH(e) {
       gotit = 1;
+      xbt_assert(e.category == unknown_error,
+                 "Got wrong category: %d (instead of %d)", e.category,
+                 unknown_error);
+      xbt_assert(e.value == 42, "Got wrong value: %d (!=42)", e.value);
+      xbt_assert(!strncmp(e.msg, exception_msg, strlen(exception_msg)),
+                 "Got wrong message: %s", e.msg);
+      xbt_ex_free(e);
     }
     if (!gotit) {
-      THROW0(unknown_error, 0, "Didn't got the remote exception!");
+      THROWF(unknown_error, 0, "Didn't got the remote exception!");
     }
-    xbt_assert2(e.category == unknown_error,
-                "Got wrong category: %d (instead of %d)", e.category,
-                unknown_error);
-    xbt_assert1(e.value == 42, "Got wrong value: %d (!=42)", e.value);
-    xbt_assert1(!strncmp(e.msg, exception_msg, strlen(exception_msg)),
-                "Got wrong message: %s", e.msg);
-    xbt_ex_free(e);
   }
 }
 
@@ -59,19 +60,33 @@ static void exception_catching(void)
  * Client code
  * **********************************************************************/
 
+static void client_create_sockets(xbt_socket_t *toserver,
+                                  xbt_socket_t *toforwarder,
+                                  const char *srv_host, int srv_port,
+                                  const char *fwd_host, int fwd_port)
+{
+  TRY {
+    exception_catching();
+    *toserver = gras_socket_client(srv_host, srv_port);
+    *toforwarder = gras_socket_client(fwd_host, fwd_port);
+  }
+  CATCH_ANONYMOUS {
+    RETHROWF("Unable to connect to the server: %s");
+  }
+}
 
 int client(int argc, char *argv[])
 {
   xbt_ex_t e;
-  gras_socket_t toserver = NULL;        /* peer */
-  gras_socket_t toforwarder = NULL;     /* peer */
+  xbt_socket_t toserver = NULL;        /* peer */
+  xbt_socket_t toforwarder = NULL;     /* peer */
 
   int ping, pong, i;
   volatile int gotit = 0;
 
 
   const char *host = "127.0.0.1";
-  int port = 4000;
+  int port = 4001;
 
   memset(&e, 0, sizeof(xbt_ex_t));
 
@@ -83,7 +98,7 @@ int client(int argc, char *argv[])
     host = argv[1];
     port = atoi(argv[2]);
   }
-  INFO2("Launch client (server on %s:%d)", host, port);
+  XBT_INFO("Launch client (server on %s:%d)", host, port);
 
   exception_catching();
 
@@ -91,15 +106,9 @@ int client(int argc, char *argv[])
   gras_os_sleep(2);
 
   /* 4. Create a socket to speak to the server */
-  TRY {
-    exception_catching();
-    toserver = gras_socket_client(host, port);
-    toforwarder = gras_socket_client(argv[3], atoi(argv[4]));
-  }
-  CATCH(e) {
-    RETHROW0("Unable to connect to the server: %s");
-  }
-  INFO2("Connected to %s:%d.", host, port);
+  client_create_sockets(&toserver, &toforwarder,
+                        host, port, argv[3], atoi(argv[4]));
+  XBT_INFO("Connected to %s:%d.", host, port);
 
 
   /* 5. Register the messages.
@@ -109,8 +118,8 @@ int client(int argc, char *argv[])
   register_messages();
 
   /* 6. Keep the user informed of what's going on */
-  INFO2("Connected to server which is on %s:%d",
-        gras_socket_peer_name(toserver), gras_socket_peer_port(toserver));
+  XBT_INFO("Connected to server which is on %s:%d",
+        xbt_socket_peer_name(toserver), xbt_socket_peer_port(toserver));
 
   /* 7. Prepare and send the ping message to the server */
   ping = 1234;
@@ -118,46 +127,46 @@ int client(int argc, char *argv[])
     exception_catching();
     gras_msg_rpccall(toserver, 6000.0, "plain ping", &ping, &pong);
   }
-  CATCH(e) {
+  CATCH_ANONYMOUS {
     gras_socket_close(toserver);
-    RETHROW0("Failed to execute a PING rpc on the server: %s");
+    RETHROWF("Failed to execute a PING rpc on the server: %s");
   }
   exception_catching();
 
   /* 8. Keep the user informed of what's going on, again */
-  INFO4("The answer to PING(%d) on %s:%d is PONG(%d)",
+  XBT_INFO("The answer to PING(%d) on %s:%d is PONG(%d)",
         ping,
-        gras_socket_peer_name(toserver), gras_socket_peer_port(toserver),
+        xbt_socket_peer_name(toserver), xbt_socket_peer_port(toserver),
         pong);
 
   /* 9. Call a RPC which raises an exception (to test exception propagation) */
-  INFO0("Call the exception raising RPC");
+  XBT_INFO("Call the exception raising RPC");
   TRY {
     gras_msg_rpccall(toserver, 6000.0, "raise exception", NULL, NULL);
   }
   CATCH(e) {
     gotit = 1;
-    xbt_assert2(e.category == unknown_error,
+    xbt_assert(e.category == unknown_error,
                 "Got wrong category: %d (instead of %d)",
                 e.category, unknown_error);
-    xbt_assert1(e.value == 42, "Got wrong value: %d (!=42)", e.value);
-    xbt_assert1(!strncmp(e.msg, exception_msg, strlen(exception_msg)),
+    xbt_assert(e.value == 42, "Got wrong value: %d (!=42)", e.value);
+    xbt_assert(!strncmp(e.msg, exception_msg, strlen(exception_msg)),
                 "Got wrong message: %s", e.msg);
-    INFO0
-      ("Got the expected exception when calling the exception raising RPC");
+    XBT_INFO
+        ("Got the expected exception when calling the exception raising RPC");
     xbt_ex_free(e);
   }
 
   if (!gotit)
-    THROW0(unknown_error, 0, "Didn't got the remote exception!");
+    THROWF(unknown_error, 0, "Didn't got the remote exception!");
 
-  INFO0("Called the exception raising RPC");
+  XBT_INFO("Called the exception raising RPC");
   exception_catching();
 
   /* doxygen_ignore */
   for (i = 0; i < 5; i++) {
 
-    INFO1("Call the exception raising RPC (i=%d)", i);
+    XBT_INFO("Call the exception raising RPC (i=%d)", i);
     TRY {
       gras_msg_rpccall(toserver, 6000.0, "raise exception", NULL, NULL);
     }
@@ -166,46 +175,47 @@ int client(int argc, char *argv[])
       xbt_ex_free(e);
     }
     if (!gotit) {
-      THROW0(unknown_error, 0, "Didn't got the remote exception!");
+      THROWF(unknown_error, 0, "Didn't got the remote exception!");
     }
   }
   /* doxygen_resume */
 
   /* 9. Call a RPC which raises an exception (to test that exception propagation works) */
   for (i = 0; i < 5; i++) {
-    INFO1("Call the exception raising RPC on the forwarder (i=%d)", i);
+    XBT_INFO("Call the exception raising RPC on the forwarder (i=%d)", i);
     TRY {
-      gras_msg_rpccall(toforwarder, 6000.0, "forward exception", NULL, NULL);
+      gras_msg_rpccall(toforwarder, 6000.0, "forward exception", NULL,
+                       NULL);
     }
     CATCH(e) {
       gotit = 1;
+      xbt_assert(e.value == 42, "Got wrong value: %d (!=42)", e.value);
+      xbt_assert(!strncmp(e.msg, exception_msg, strlen(exception_msg)),
+                 "Got wrong message: %s", e.msg);
+      xbt_assert(e.category == unknown_error,
+                 "Got wrong category: %d (instead of %d)",
+                 e.category, unknown_error);
+      XBT_INFO
+        ("Got the expected exception when calling the exception raising RPC");
+      xbt_ex_free(e);
     }
     if (!gotit) {
-      THROW0(unknown_error, 0, "Didn't got the remote exception!");
+      THROWF(unknown_error, 0, "Didn't got the remote exception!");
     }
-    xbt_assert1(e.value == 42, "Got wrong value: %d (!=42)", e.value);
-    xbt_assert1(!strncmp(e.msg, exception_msg, strlen(exception_msg)),
-                "Got wrong message: %s", e.msg);
-    xbt_assert2(e.category == unknown_error,
-                "Got wrong category: %d (instead of %d)",
-                e.category, unknown_error);
-    INFO0
-      ("Got the expected exception when calling the exception raising RPC");
-    xbt_ex_free(e);
     exception_catching();
   }
 
-  INFO2("Ask %s:%d to die", gras_socket_peer_name(toforwarder),
-        gras_socket_peer_port(toforwarder));
+  XBT_INFO("Ask %s:%d to die", xbt_socket_peer_name(toforwarder),
+        xbt_socket_peer_port(toforwarder));
   gras_msg_send(toforwarder, "kill", NULL);
-  INFO2("Ask %s:%d to die", gras_socket_peer_name(toserver),
-        gras_socket_peer_port(toserver));
+  XBT_INFO("Ask %s:%d to die", xbt_socket_peer_name(toserver),
+        xbt_socket_peer_port(toserver));
   gras_msg_send(toserver, "kill", NULL);
 
   /* 11. Cleanup the place before leaving */
   gras_socket_close(toserver);
   gras_socket_close(toforwarder);
-  INFO0("Done.");
+  XBT_INFO("Done.");
   gras_exit();
   return 0;
 }                               /* end_of_client */
@@ -215,33 +225,34 @@ int client(int argc, char *argv[])
  * Forwarder code
  * **********************************************************************/
 typedef struct {
-  gras_socket_t server;
+  xbt_socket_t server;
   int done;
 } s_forward_data_t, *forward_data_t;
 
 static int forwarder_cb_kill(gras_msg_cb_ctx_t ctx, void *payload_data)
 {
   forward_data_t fdata;
-  gras_socket_t expeditor = gras_msg_cb_ctx_from(ctx);
-  INFO2("Asked to die by %s:%d", gras_socket_peer_name(expeditor),
-        gras_socket_peer_port(expeditor));
+  xbt_socket_t expeditor = gras_msg_cb_ctx_from(ctx);
+  XBT_INFO("Asked to die by %s:%d", xbt_socket_peer_name(expeditor),
+        xbt_socket_peer_port(expeditor));
   fdata = gras_userdata_get();
   fdata->done = 1;
   return 0;
 }
 
-static int forwarder_cb_forward_ex(gras_msg_cb_ctx_t ctx, void *payload_data)
+static int forwarder_cb_forward_ex(gras_msg_cb_ctx_t ctx,
+                                   void *payload_data)
 {
   forward_data_t fdata = gras_userdata_get();
 
-  INFO0("Forward a request");
+  XBT_INFO("Forward a request");
   gras_msg_rpccall(fdata->server, 60, "raise exception", NULL, NULL);
   return 0;
 }
 
 int forwarder(int argc, char *argv[])
 {
-  gras_socket_t mysock;
+  xbt_socket_t mysock;
   int port;
   forward_data_t fdata;
 
@@ -253,7 +264,7 @@ int forwarder(int argc, char *argv[])
   fdata->done = 0;
   port = atoi(argv[1]);
 
-  INFO1("Launch forwarder (port=%d)", port);
+  XBT_INFO("Launch forwarder (port=%d)", port);
   mysock = gras_socket_server(port);
 
   gras_os_sleep(1);             /* wait for the server to be ready */
@@ -270,7 +281,7 @@ int forwarder(int argc, char *argv[])
   gras_socket_close(mysock);
   gras_socket_close(fdata->server);
   free(fdata);
-  INFO0("Done.");
+  XBT_INFO("Done.");
   gras_exit();
   return 0;
 }
@@ -279,17 +290,17 @@ int forwarder(int argc, char *argv[])
  * Server code
  * **********************************************************************/
 typedef struct {
-  gras_socket_t server;
+  xbt_socket_t server;
   int done;
 } s_server_data_t, *server_data_t;
 
 static int server_cb_kill(gras_msg_cb_ctx_t ctx, void *payload_data)
 {
-  gras_socket_t expeditor = gras_msg_cb_ctx_from(ctx);
+  xbt_socket_t expeditor = gras_msg_cb_ctx_from(ctx);
   server_data_t sdata;
 
-  INFO2("Asked to die by %s:%d", gras_socket_peer_name(expeditor),
-        gras_socket_peer_port(expeditor));
+  XBT_INFO("Asked to die by %s:%d", xbt_socket_peer_name(expeditor),
+        xbt_socket_peer_port(expeditor));
 
   sdata = gras_userdata_get();
   sdata->done = 1;
@@ -307,19 +318,20 @@ static int server_cb_ping(gras_msg_cb_ctx_t ctx, void *payload_data)
 
   /* 1. Get the payload into the msg variable, and retrieve who called us */
   int msg = *(int *) payload_data;
-  gras_socket_t expeditor = gras_msg_cb_ctx_from(ctx);
+  xbt_socket_t expeditor = gras_msg_cb_ctx_from(ctx);
 
   /* 2. Log which client connected */
-  INFO3("Got message PING(%d) from %s:%d",
+  XBT_INFO("Got message PING(%d) from %s:%d",
         msg,
-        gras_socket_peer_name(expeditor), gras_socket_peer_port(expeditor));
+        xbt_socket_peer_name(expeditor),
+        xbt_socket_peer_port(expeditor));
 
   /* 4. Change the value of the msg variable */
   msg = 4321;
 
   /* 5. Return as result */
   gras_msg_rpcreturn(6000, ctx, &msg);
-  INFO0("Answered with PONG(4321)");
+  XBT_INFO("Answered with PONG(4321)");
 
   /* 6. Cleanups, if any */
 
@@ -330,10 +342,10 @@ static int server_cb_ping(gras_msg_cb_ctx_t ctx, void *payload_data)
 
 int server(int argc, char *argv[])
 {
-  gras_socket_t mysock;
+  xbt_socket_t mysock;
   server_data_t sdata;
 
-  int port = 4000;
+  int port = 4001;
 
   /* 1. Init the GRAS infrastructure */
   gras_init(&argc, argv);
@@ -345,7 +357,7 @@ int server(int argc, char *argv[])
   sdata = gras_userdata_new(s_server_data_t);
   sdata->done = 0;
 
-  INFO1("Launch server (port=%d)", port);
+  XBT_INFO("Launch server (port=%d)", port);
 
   /* 3. Create my master socket */
   mysock = gras_socket_server(port);
@@ -356,13 +368,13 @@ int server(int argc, char *argv[])
   gras_cb_register("raise exception", &server_cb_raise_ex);
   gras_cb_register("kill", &server_cb_kill);
 
-  INFO1("Listening on port %d", gras_socket_my_port(mysock));
+  XBT_INFO("Listening on port %d", xbt_socket_my_port(mysock));
 
-  /* 5. Wait for the ping incomming messages */
+  /* 5. Wait for the ping incoming messages */
 
   /** \bug if the server is gone before the forwarder tries to connect,
      it dies awfully with the following message. The problem stands somewhere
-     at the interface between the gras_socket_t and the msg mess. There is thus
+     at the interface between the xbt_socket_t and the msg mess. There is thus
      no way for me to dive into this before this interface is rewritten
 ==15875== Invalid read of size 4
 ==15875==    at 0x408B805: find_port (transport_plugin_sg.c:68)
@@ -392,7 +404,7 @@ int server(int argc, char *argv[])
   /* 8. Free the allocated resources, and shut GRAS down */
   free(sdata);
   gras_socket_close(mysock);
-  INFO0("Done.");
+  XBT_INFO("Done.");
   gras_exit();
 
   return 0;