Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Use new macros THROWF and RETHROWF.
[simgrid.git] / examples / gras / rpc / rpc.c
index b43db35..da1e116 100644 (file)
@@ -1,54 +1,57 @@
-/* $Id$ */
-
 /* 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. */
 
 #include "gras.h"
 
-XBT_LOG_NEW_DEFAULT_CATEGORY(Rpc,"Messages specific to this example");
+XBT_LOG_NEW_DEFAULT_CATEGORY(Rpc, "Messages specific to this example");
 
 /* register messages which may be sent (common to client and server) */
-static void register_messages(void) {
+static void register_messages(void)
+{
   gras_msgtype_declare_rpc("plain ping",
-                          gras_datadesc_by_name("int"),
-                          gras_datadesc_by_name("int"));
+                           gras_datadesc_by_name("int"),
+                           gras_datadesc_by_name("int"));
 
   gras_msgtype_declare_rpc("raise exception", NULL, NULL);
   gras_msgtype_declare_rpc("forward exception", NULL, NULL);
-  gras_msgtype_declare("kill",NULL);
+  gras_msgtype_declare("kill", NULL);
 }
 
 /* Function prototypes */
-int server (int argc,char *argv[]);
-int forwarder (int argc,char *argv[]);
-int client (int argc,char *argv[]);
+int server(int argc, char *argv[]);
+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) {
-  int gotit = 0,i;
+static void exception_catching(void)
+{
+  int gotit = 0, i;
   xbt_ex_t e;
 
-  for (i=0; i<5; i++) {
-    gotit=0;
+  for (i = 0; i < 5; i++) {
+    gotit = 0;
     TRY {
       exception_raising();
-    } CATCH(e) {
+    }
+    CATCH(e) {
       gotit = 1;
     }
     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_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_assert1(!strncmp(e.msg, exception_msg, strlen(exception_msg)),
+                "Got wrong message: %s", e.msg);
     xbt_ex_free(e);
   }
 }
@@ -58,29 +61,30 @@ static void exception_catching(void) {
  * **********************************************************************/
 
 
-int client(int argc,char *argv[]) {
+int client(int argc, char *argv[])
+{
   xbt_ex_t e;
-  gras_socket_t toserver=NULL; /* peer */
-  gras_socket_t toforwarder=NULL; /* peer */
+  gras_socket_t toserver = NULL;        /* peer */
+  gras_socket_t toforwarder = NULL;     /* peer */
 
   int ping, pong, i;
-  volatile int gotit=0;
+  volatile int gotit = 0;
 
 
   const char *host = "127.0.0.1";
-               int   port = 4000;
+  int port = 4001;
 
-  memset(&e,0,sizeof(xbt_ex_t));
+  memset(&e, 0, sizeof(xbt_ex_t));
 
   /* 1. Init the GRAS's infrastructure */
   gras_init(&argc, argv);
 
   /* 2. Get the server's address. The command line override defaults when specified */
   if (argc == 5) {
-    host=argv[1];
-    port=atoi(argv[2]);
+    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();
 
@@ -90,113 +94,123 @@ int client(int argc,char *argv[]) {
   /* 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");
+    toserver = gras_socket_client(host, port);
+    toforwarder = gras_socket_client(argv[3], atoi(argv[4]));
   }
-  INFO2("Connected to %s:%d.",host,port);
+  CATCH(e) {
+    RETHROWF("Unable to connect to the server: %s");
+  }
+  XBT_INFO("Connected to %s:%d.", host, port);
 
 
   /* 5. Register the messages.
-        See, it doesn't have to be done completely at the beginning,
-       but only before use */
+     See, it doesn't have to be done completely at the beginning,
+     but only before use */
   exception_catching();
   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",
+        gras_socket_peer_name(toserver), gras_socket_peer_port(toserver));
 
   /* 7. Prepare and send the ping message to the server */
   ping = 1234;
   TRY {
     exception_catching();
     gras_msg_rpccall(toserver, 6000.0, "plain ping", &ping, &pong);
-  } CATCH(e) {
+  }
+  CATCH(e) {
     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)",
-       ping,
-       gras_socket_peer_name(toserver),gras_socket_peer_port(toserver),
-       pong);
+  XBT_INFO("The answer to PING(%d) on %s:%d is PONG(%d)",
+        ping,
+        gras_socket_peer_name(toserver), gras_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) {
+  }
+  CATCH(e) {
     gotit = 1;
     xbt_assert2(e.category == unknown_error,
-               "Got wrong category: %d (instead of %d)",
-             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);
-    INFO0("Got the expected exception when calling the exception raising RPC");
+    xbt_assert1(!strncmp(e.msg, exception_msg, strlen(exception_msg)),
+                "Got wrong message: %s", e.msg);
+    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);
-     TRY {
-       gras_msg_rpccall(toserver, 6000.0, "raise exception", NULL, NULL);
-     } CATCH(e) {
-       gotit = 1;
-       xbt_ex_free(e);
-     }
-     if (!gotit) {
-       THROW0(unknown_error,0,"Didn't got the remote exception!");
-     }
+  for (i = 0; i < 5; i++) {
+
+    XBT_INFO("Call the exception raising RPC (i=%d)", i);
+    TRY {
+      gras_msg_rpccall(toserver, 6000.0, "raise exception", NULL, NULL);
+    }
+    CATCH(e) {
+      gotit = 1;
+      xbt_ex_free(e);
+    }
+    if (!gotit) {
+      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);
+  for (i = 0; i < 5; 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);
-    } CATCH(e) {
+      gras_msg_rpccall(toforwarder, 6000.0, "forward exception", NULL,
+                       NULL);
+    }
+    CATCH(e) {
       gotit = 1;
     }
     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_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");
+                "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);
     exception_catching();
   }
 
-  INFO2("Ask %s:%d to die",gras_socket_peer_name(toforwarder),gras_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));
-  gras_msg_send(toserver,"kill",NULL);
+  XBT_INFO("Ask %s:%d to die", gras_socket_peer_name(toforwarder),
+        gras_socket_peer_port(toforwarder));
+  gras_msg_send(toforwarder, "kill", NULL);
+  XBT_INFO("Ask %s:%d to die", gras_socket_peer_name(toserver),
+        gras_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 */
+}                               /* end_of_client */
 
 
 /* **********************************************************************
@@ -207,47 +221,50 @@ typedef struct {
   int done;
 } s_forward_data_t, *forward_data_t;
 
-static int forwarder_cb_kill(gras_msg_cb_ctx_t ctx,
-                                void             *payload_data) {
+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));
-  fdata=gras_userdata_get();
+  XBT_INFO("Asked to die by %s:%d", gras_socket_peer_name(expeditor),
+        gras_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) {
-  forward_data_t fdata=gras_userdata_get();
+                                   void *payload_data)
+{
+  forward_data_t fdata = gras_userdata_get();
 
-  INFO0("Forward a request");
-  gras_msg_rpccall(fdata->server, 60, "raise exception",NULL,NULL);
+  XBT_INFO("Forward a request");
+  gras_msg_rpccall(fdata->server, 60, "raise exception", NULL, NULL);
   return 0;
 }
 
-int forwarder (int argc,char *argv[]) {
+int forwarder(int argc, char *argv[])
+{
   gras_socket_t mysock;
   int port;
   forward_data_t fdata;
 
-  gras_init(&argc,argv);
+  gras_init(&argc, argv);
 
   xbt_assert(argc == 4);
 
-  fdata=gras_userdata_new(s_forward_data_t);
+  fdata = gras_userdata_new(s_forward_data_t);
   fdata->done = 0;
-  port=atoi(argv[1]);
+  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 */
-  fdata->server=gras_socket_client(argv[2],atoi(argv[3]));
+  gras_os_sleep(1);             /* wait for the server to be ready */
+  fdata->server = gras_socket_client(argv[2], atoi(argv[3]));
 
   register_messages();
   gras_cb_register("forward exception", &forwarder_cb_forward_ex);
-  gras_cb_register("kill",              &forwarder_cb_kill);
+  gras_cb_register("kill", &forwarder_cb_kill);
 
   while (!fdata->done) {
     gras_msg_handle(600.0);
@@ -256,7 +273,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;
 }
@@ -269,78 +286,81 @@ typedef struct {
   int done;
 } s_server_data_t, *server_data_t;
 
-static int server_cb_kill(gras_msg_cb_ctx_t ctx,
-                         void             *payload_data) {
+static int server_cb_kill(gras_msg_cb_ctx_t ctx, void *payload_data)
+{
   gras_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", gras_socket_peer_name(expeditor),
+        gras_socket_peer_port(expeditor));
 
-  sdata=gras_userdata_get();
+  sdata = gras_userdata_get();
   sdata->done = 1;
   return 0;
 }
 
-static int server_cb_raise_ex(gras_msg_cb_ctx_t ctx,
-                             void             *payload_data) {
+static int server_cb_raise_ex(gras_msg_cb_ctx_t ctx, void *payload_data)
+{
   exception_raising();
   return 0;
 }
 
-static int server_cb_ping(gras_msg_cb_ctx_t ctx,
-                         void             *payload_data) {
+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;
+  int msg = *(int *) payload_data;
   gras_socket_t expeditor = gras_msg_cb_ctx_from(ctx);
 
   /* 2. Log which client connected */
-  INFO3("Got message PING(%d) from %s:%d",
-       msg,
-       gras_socket_peer_name(expeditor), gras_socket_peer_port(expeditor));
+  XBT_INFO("Got message PING(%d) from %s:%d",
+        msg,
+        gras_socket_peer_name(expeditor),
+        gras_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)");
+  gras_msg_rpcreturn(6000, ctx, &msg);
+  XBT_INFO("Answered with PONG(4321)");
 
   /* 6. Cleanups, if any */
 
   /* 7. Tell GRAS that we consummed this message */
   return 0;
-} /* end_of_server_cb_ping */
+}                               /* end_of_server_cb_ping */
 
 
-int server (int argc,char *argv[]) {
+int server(int argc, char *argv[])
+{
   gras_socket_t mysock;
   server_data_t sdata;
 
-  int port = 4000;
+  int port = 4001;
 
   /* 1. Init the GRAS infrastructure */
-  gras_init(&argc,argv);
+  gras_init(&argc, argv);
 
   /* 2. Get the port I should listen on from the command line, if specified */
   if (argc == 2)
-    port=atoi(argv[1]);
+    port = atoi(argv[1]);
 
-  sdata=gras_userdata_new(s_server_data_t);
+  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);
 
   /* 4. Register the known messages and register my callback */
   register_messages();
-  gras_cb_register("plain ping",&server_cb_ping);
-  gras_cb_register("raise exception",&server_cb_raise_ex);
-  gras_cb_register("kill",&server_cb_kill);
+  gras_cb_register("plain ping", &server_cb_ping);
+  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", gras_socket_my_port(mysock));
 
   /* 5. Wait for the ping incomming messages */
 
@@ -376,9 +396,8 @@ 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;
-} /* end_of_server */
-
+}                               /* end_of_server */