Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
The files needed for the example of lesson 11 (explicit wait)
authormquinson <mquinson@48e7efb5-ca39-0410-a469-dd3cf9ba447f>
Mon, 12 Feb 2007 21:54:44 +0000 (21:54 +0000)
committermquinson <mquinson@48e7efb5-ca39-0410-a469-dd3cf9ba447f>
Mon, 12 Feb 2007 21:54:44 +0000 (21:54 +0000)
git-svn-id: svn+ssh://scm.gforge.inria.fr/svn/simgrid/simgrid/trunk@3131 48e7efb5-ca39-0410-a469-dd3cf9ba447f

doc/gtut-files/.cvsignore
doc/gtut-files/11-explicitwait.c [new file with mode: 0644]
doc/gtut-files/11-explicitwait.output [new file with mode: 0644]
doc/gtut-files/11-explicitwait.xml [new file with mode: 0644]
doc/gtut-files/Makefile
doc/gtut-files/gtut-platform-3nodes.xml [new file with mode: 0644]

index 86ec688..2047637 100644 (file)
@@ -88,3 +88,12 @@ _09-simpledata_simulator.c
 _10-rpc_client.c
 _10-rpc_server.c
 _10-rpc_simulator.c
+
+11-explicitwait.mk
+11-explicitwait.trace
+11-explicitwait_client
+11-explicitwait_server
+11-explicitwait_simulator
+_11-explicitwait_client.c
+_11-explicitwait_server.c
+_11-explicitwait_simulator.c
diff --git a/doc/gtut-files/11-explicitwait.c b/doc/gtut-files/11-explicitwait.c
new file mode 100644 (file)
index 0000000..70478d8
--- /dev/null
@@ -0,0 +1,105 @@
+#include <stdlib.h>
+#include <gras.h>
+
+XBT_LOG_NEW_DEFAULT_CATEGORY(test,"My little example");
+
+void message_declaration(void) {
+  gras_msgtype_declare("request", NULL);
+  gras_msgtype_declare("grant", NULL);
+  gras_msgtype_declare("release", NULL);
+}
+
+typedef struct {
+   int process_in_CS;
+   xbt_dynar_t waiting_queue;
+} server_data_t;
+
+int server_request_cb(gras_msg_cb_ctx_t ctx, void *payload) {
+  server_data_t *globals=(server_data_t*)gras_userdata_get();
+  gras_socket_t s = gras_msg_cb_ctx_from(ctx);
+  if (globals->process_in_CS) {
+     xbt_dynar_push(globals->waiting_queue, &s);
+     INFO2("put %s:%d in waiting queue",gras_socket_peer_name(s),gras_socket_peer_port(s));
+  } else {     
+     globals->process_in_CS = 1;
+     INFO2("grant %s:%d since nobody wanted it",gras_socket_peer_name(s),gras_socket_peer_port(s));
+     gras_msg_send(s, gras_msgtype_by_name("grant"), NULL);     
+  }
+  return 1;
+} /* end_of_request_callback */
+
+int server_release_cb(gras_msg_cb_ctx_t ctx, void *payload) {
+  server_data_t *globals=(server_data_t*)gras_userdata_get();
+   
+  if (xbt_dynar_length(globals->waiting_queue)) {
+     gras_socket_t s;
+     xbt_dynar_pop(globals->waiting_queue, &s);
+     
+     INFO2("grant %s:%d since token released",gras_socket_peer_name(s),gras_socket_peer_port(s));
+     gras_msg_send(s, gras_msgtype_by_name("grant"), NULL);
+  } else {
+     globals->process_in_CS = 0;
+  }
+   
+  return 1;
+} /* end_of_release_callback */
+
+int server(int argc, char *argv[]) { 
+  gras_socket_t mysock;   /* socket on which I listen */
+  server_data_t *globals;
+  int i;
+  
+  gras_init(&argc,argv);
+  mysock = gras_socket_server(atoi(argv[1]));
+
+  globals=gras_userdata_new(server_data_t);
+  globals->process_in_CS=0;
+  globals->waiting_queue=xbt_dynar_new( sizeof(gras_socket_t), NULL /* not closing sockets */);
+
+  message_declaration();   
+  gras_cb_register(gras_msgtype_by_name("request"),&server_request_cb);
+  gras_cb_register(gras_msgtype_by_name("release"),&server_release_cb);
+
+  for (i=0; i<20; i++)  /* 5 requests of each process, 2 processes, 2 messages per request */
+    gras_msg_handle(-1); 
+    
+  gras_exit();
+  return 0;
+} /* end_of_server */
+
+void lock(gras_socket_t toserver) {
+   gras_msg_send(toserver,gras_msgtype_by_name("request"),NULL);
+   gras_msg_wait(-1, gras_msgtype_by_name("grant"),NULL,NULL);
+   INFO0("Granted by server");
+} /* end_of_lock */
+
+void unlock(gras_socket_t toserver) {
+   INFO0("Release the token");
+   gras_msg_send(toserver,gras_msgtype_by_name("release"),NULL);
+} /* end_of_unlock */
+
+int client(int argc, char *argv[]) {
+  int i;
+  gras_socket_t mysock;   /* socket on which I listen */
+  gras_socket_t toserver; /* socket used to write to the server */
+
+  gras_init(&argc,argv);
+
+  mysock = gras_socket_server_range(1024, 10000, 0, 0);
+  
+  VERB1("Client ready; listening on %d", gras_socket_my_port(mysock));
+  
+  gras_os_sleep(1.5); /* sleep 1 second and half */
+  message_declaration();
+  toserver = gras_socket_client(argv[1], atoi(argv[2]));
+
+  for (i=0;i<5; i++) {
+     gras_os_sleep(0.1);
+     lock(toserver);
+     gras_os_sleep(0.1);
+     unlock(toserver);
+  }
+  gras_exit();
+  return 0;
+}
diff --git a/doc/gtut-files/11-explicitwait.output b/doc/gtut-files/11-explicitwait.output
new file mode 100644 (file)
index 0000000..28758ae
--- /dev/null
@@ -0,0 +1,87 @@
+$ ./test_server & ./test_client 127.0.0.1 12345 & ./test_client 127.0.0.1 12345 
+[blaise:server:(1764) 0.000004] test.c:26: [test/INFO] grant 127.0.0.1:1024 since nobody wanted it
+[blaise:server:(1764) 0.000099] test.c:23: [test/INFO] put 127.0.0.1:1025 in waiting queue
+[blaise:client:(1761) 0.000005] test.c:76: [test/INFO] Granted by server
+[blaise:client:(1761) 0.103627] test.c:80: [test/INFO] Release the token
+[blaise:server:(1764) 0.103866] test.c:39: [test/INFO] grant 127.0.0.1:1025 since token released
+[blaise:client:(1763) 0.000005] test.c:76: [test/INFO] Granted by server
+[blaise:client:(1763) 0.103875] test.c:80: [test/INFO] Release the token
+[blaise:server:(1764) 0.208551] test.c:23: [test/INFO] put 127.0.0.1:1024 in waiting queue
+[blaise:server:(1764) 0.208586] test.c:39: [test/INFO] grant 127.0.0.1:1024 since token released
+[blaise:client:(1761) 0.208528] test.c:76: [test/INFO] Granted by server
+[blaise:client:(1761) 0.311813] test.c:80: [test/INFO] Release the token
+[blaise:server:(1764) 0.312047] test.c:26: [test/INFO] grant 127.0.0.1:1025 since nobody wanted it
+[blaise:client:(1763) 0.208146] test.c:76: [test/INFO] Granted by server
+[blaise:client:(1763) 0.311882] test.c:80: [test/INFO] Release the token
+[blaise:server:(1764) 0.415899] test.c:23: [test/INFO] put 127.0.0.1:1024 in waiting queue
+[blaise:server:(1764) 0.415935] test.c:39: [test/INFO] grant 127.0.0.1:1024 since token released
+[blaise:client:(1761) 0.415837] test.c:76: [test/INFO] Granted by server
+[blaise:client:(1761) 0.519757] test.c:80: [test/INFO] Release the token
+[blaise:server:(1764) 0.519990] test.c:26: [test/INFO] grant 127.0.0.1:1025 since nobody wanted it
+[blaise:client:(1763) 0.416088] test.c:76: [test/INFO] Granted by server
+[blaise:client:(1763) 0.519898] test.c:80: [test/INFO] Release the token
+[blaise:server:(1764) 0.623919] test.c:23: [test/INFO] put 127.0.0.1:1024 in waiting queue
+[blaise:server:(1764) 0.623957] test.c:39: [test/INFO] grant 127.0.0.1:1024 since token released
+[blaise:client:(1761) 0.623859] test.c:76: [test/INFO] Granted by server
+[blaise:client:(1761) 0.727900] test.c:80: [test/INFO] Release the token
+[blaise:server:(1764) 0.728191] test.c:26: [test/INFO] grant 127.0.0.1:1025 since nobody wanted it
+[blaise:client:(1763) 0.624339] test.c:76: [test/INFO] Granted by server
+[blaise:client:(1763) 0.727929] test.c:80: [test/INFO] Release the token
+[blaise:server:(1764) 0.831965] test.c:23: [test/INFO] put 127.0.0.1:1024 in waiting queue
+[blaise:server:(1764) 0.832004] test.c:39: [test/INFO] grant 127.0.0.1:1024 since token released
+[blaise:client:(1761) 0.831906] test.c:76: [test/INFO] Granted by server
+[blaise:client:(1761) 0.935809] test.c:80: [test/INFO] Release the token
+[blaise:client:(1761) 0.935857] gras/gras.c:86: [gras/INFO] Exiting GRAS
+[blaise:server:(1764) 0.937221] test.c:26: [test/INFO] grant 127.0.0.1:1025 since nobody wanted it
+[blaise:client:(1763) 0.833421] test.c:76: [test/INFO] Granted by server
+[blaise:client:(1763) 0.935865] test.c:80: [test/INFO] Release the token
+[blaise:client:(1763) 0.935930] gras/gras.c:86: [gras/INFO] Exiting GRAS
+[blaise:server:(1764) 1.040199] gras/gras.c:86: [gras/INFO] Exiting GRAS
+$
+$ killall test_server
+$
+$ ./test_simulator platform.xml test.xml
+[Jacquelin:server:(1) 0.000000] test.c:26: [test/INFO] grant Boivin:1024 since nobody wanted it
+[Boivin:client:(2) 0.000537] test.c:76: [test/INFO] Granted by server
+[Jacquelin:server:(1) 0.000727] test.c:23: [test/INFO] put Geoff:1024 in waiting queue
+[Boivin:client:(2) 0.100537] test.c:80: [test/INFO] Release the token
+[Jacquelin:server:(1) 0.101074] test.c:39: [test/INFO] grant Geoff:1024 since token released
+[Geoff:client:(3) 0.101264] test.c:76: [test/INFO] Granted by server
+[Geoff:client:(3) 0.201264] test.c:80: [test/INFO] Release the token
+[Jacquelin:server:(1) 0.201611] test.c:23: [test/INFO] put Boivin:1024 in waiting queue
+[Jacquelin:server:(1) 0.201801] test.c:39: [test/INFO] grant Boivin:1024 since token released
+[Boivin:client:(2) 0.202338] test.c:76: [test/INFO] Granted by server
+[Jacquelin:server:(1) 0.301991] test.c:23: [test/INFO] put Geoff:1024 in waiting queue
+[Boivin:client:(2) 0.302338] test.c:80: [test/INFO] Release the token
+[Jacquelin:server:(1) 0.302875] test.c:39: [test/INFO] grant Geoff:1024 since token released
+[Geoff:client:(3) 0.303065] test.c:76: [test/INFO] Granted by server
+[Geoff:client:(3) 0.403065] test.c:80: [test/INFO] Release the token
+[Jacquelin:server:(1) 0.403412] test.c:23: [test/INFO] put Boivin:1024 in waiting queue
+[Jacquelin:server:(1) 0.403602] test.c:39: [test/INFO] grant Boivin:1024 since token released
+[Boivin:client:(2) 0.404139] test.c:76: [test/INFO] Granted by server
+[Jacquelin:server:(1) 0.503792] test.c:23: [test/INFO] put Geoff:1024 in waiting queue
+[Boivin:client:(2) 0.504139] test.c:80: [test/INFO] Release the token
+[Jacquelin:server:(1) 0.504675] test.c:39: [test/INFO] grant Geoff:1024 since token released
+[Geoff:client:(3) 0.504865] test.c:76: [test/INFO] Granted by server
+[Geoff:client:(3) 0.604865] test.c:80: [test/INFO] Release the token
+[Jacquelin:server:(1) 0.605212] test.c:23: [test/INFO] put Boivin:1024 in waiting queue
+[Jacquelin:server:(1) 0.605402] test.c:39: [test/INFO] grant Boivin:1024 since token released
+[Boivin:client:(2) 0.605939] test.c:76: [test/INFO] Granted by server
+[Jacquelin:server:(1) 0.705592] test.c:23: [test/INFO] put Geoff:1024 in waiting queue
+[Boivin:client:(2) 0.705939] test.c:80: [test/INFO] Release the token
+[Jacquelin:server:(1) 0.706476] test.c:39: [test/INFO] grant Geoff:1024 since token released
+[Geoff:client:(3) 0.706666] test.c:76: [test/INFO] Granted by server
+[Geoff:client:(3) 0.806666] test.c:80: [test/INFO] Release the token
+[Jacquelin:server:(1) 0.807013] test.c:23: [test/INFO] put Boivin:1024 in waiting queue
+[Jacquelin:server:(1) 0.807203] test.c:39: [test/INFO] grant Boivin:1024 since token released
+[Boivin:client:(2) 0.807740] test.c:76: [test/INFO] Granted by server
+[Jacquelin:server:(1) 0.907393] test.c:23: [test/INFO] put Geoff:1024 in waiting queue
+[Boivin:client:(2) 0.907740] test.c:80: [test/INFO] Release the token
+[Boivin:client:(2) 0.908277] gras/gras.c:86: [gras/INFO] Exiting GRAS
+[Jacquelin:server:(1) 0.908277] test.c:39: [test/INFO] grant Geoff:1024 since token released
+[Geoff:client:(3) 0.908467] test.c:76: [test/INFO] Granted by server
+[Geoff:client:(3) 1.008467] test.c:80: [test/INFO] Release the token
+[Geoff:client:(3) 1.008657] gras/gras.c:86: [gras/INFO] Exiting GRAS
+[Jacquelin:server:(1) 1.008657] gras/gras.c:86: [gras/INFO] Exiting GRAS
+[1.008657] msg/global.c:426: [msg_kernel/INFO] Congratulations ! Simulation terminated : all processes are over
+$
diff --git a/doc/gtut-files/11-explicitwait.xml b/doc/gtut-files/11-explicitwait.xml
new file mode 100644 (file)
index 0000000..63ef17e
--- /dev/null
@@ -0,0 +1,16 @@
+<?xml version='1.0'?>
+<!DOCTYPE platform_description SYSTEM "surfxml.dtd">
+<platform_description version="1">
+  <process host="Jacquelin" function="server">
+    <argument value="12345"/>
+  </process>
+  <process host="Boivin" function="client">
+    <argument value="Jacquelin"/>
+    <argument value="12345"/>
+  </process>
+  <process host="Geoff" function="client">
+    <argument value="Jacquelin"/>
+    <argument value="12345"/>
+  </process>
+</platform_description>
+
index efd9d95..c5237b8 100644 (file)
@@ -3,7 +3,7 @@ export LD_LIBRARY_PATH=$(GRAS_ROOT)/lib
 
 all: 01-bones.output 02-simple.output 03-args.output 04-callback.output \
      05-globals.output 06-logs.output 07-timers.output 08-exceptions.output \
-     09-simpledata.output 10-rpc.output
+     09-simpledata.output 10-rpc.output 11-explicitwait.output
 
 veryclean: clean
        rm *.output*
@@ -274,3 +274,30 @@ clean::
        rm -f _10-rpc_client.c _10-rpc_server.c _10-rpc_simulator.c 10-rpc.trace 10-rpc.mk
 
 
+# Lesson 11: Explicit wait
+########################################
+11-explicitwait.output: 11-explicitwait_client 11-explicitwait_server 11-explicitwait_simulator
+       (echo '$$ ./test_server & ./test_client 127.0.0.1 12345 & ./test_client 127.0.0.1 12345 '; \
+        ./11-explicitwait_client 127.0.0.1 12345            & \
+        ./11-explicitwait_client 127.0.0.1 12345            & \
+        ./11-explicitwait_server 12345                        \
+       ) 2>&1 | sed s/11-explicitwait/test/ > $@
+       sleep 1
+       echo '$$'                                                     >> $@
+       killall 11-explicitwait_server 11-explicitwait_client 2>/dev/null || true
+       echo '$$'                                                     >> $@
+       echo '$$ ./test_simulator platform-3nodes.xml test.xml'              >> $@
+       ./11-explicitwait_simulator gtut-platform-3nodes.xml 11-explicitwait.xml   2>&1 |sed s/11-explicitwait/test/  >> $@ 2>&1
+       echo '$$'                                                     >> $@ 
+
+11-explicitwait_client 11-explicitwait_server 11-explicitwait_simulator: _11-explicitwait_client.c _11-explicitwait_server.c _11-explicitwait_simulator.c
+       make -f 11-explicitwait.mk
+
+_11-explicitwait_client.c _11-explicitwait_server.c _11-explicitwait_simulator.c: 11-explicitwait.c 03-args.xml
+       ../../tools/gras/gras_stub_generator 11-explicitwait 03-args.xml >/dev/null
+
+clean::
+       if [ -e 11-explicitwait.mk ] ; then make -f 11-explicitwait.mk clean; fi
+       rm -f _11-explicitwait_client.c _11-explicitwait_server.c _11-explicitwait_simulator.c 11-explicitwait.trace 11-explicitwait.mk
+
+
diff --git a/doc/gtut-files/gtut-platform-3nodes.xml b/doc/gtut-files/gtut-platform-3nodes.xml
new file mode 100644 (file)
index 0000000..ca0d038
--- /dev/null
@@ -0,0 +1,21 @@
+<?xml version='1.0'?>
+<!DOCTYPE platform_description SYSTEM "surfxml.dtd">
+<platform_description version="1">
+  <cpu name="Jacquelin" power="137333000"/>
+  <cpu name="Boivin"    power="98095000"/>
+  <cpu name="Geoff"     power="42917000"/>
+  
+  <network_link name="1" bandwidth="3430125"  latency="0.000536941"/>
+  <network_link name="2" bandwidth="11618875" latency="0.00018998"/>
+  <network_link name="3" bandwidth="10314625" latency="0.006932556"/>
+    
+  <route src="Jacquelin" dst="Boivin">   <route_element name="1"/></route>
+  <route src="Boivin"    dst="Jacquelin"><route_element name="1"/></route>
+
+  <route src="Jacquelin" dst="Geoff">    <route_element name="2"/></route>
+  <route src="Geoff"     dst="Jacquelin"><route_element name="2"/></route>
+
+  <route src="Geoff"  dst="Boivin">      <route_element name="3"/></route>
+  <route src="Boivin" dst="Geoff">       <route_element name="3"/></route>
+</platform_description>
+