_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
--- /dev/null
+#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;
+}
--- /dev/null
+$ ./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
+$
--- /dev/null
+<?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>
+
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*
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
+
+
--- /dev/null
+<?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>
+