From 2ec08b460af40de357a004f07deaaeb01dc099f5 Mon Sep 17 00:00:00 2001 From: mquinson Date: Mon, 12 Feb 2007 21:54:44 +0000 Subject: [PATCH] The files needed for the example of lesson 11 (explicit wait) git-svn-id: svn+ssh://scm.gforge.inria.fr/svn/simgrid/simgrid/trunk@3131 48e7efb5-ca39-0410-a469-dd3cf9ba447f --- doc/gtut-files/.cvsignore | 9 ++ doc/gtut-files/11-explicitwait.c | 105 ++++++++++++++++++++++++ doc/gtut-files/11-explicitwait.output | 87 ++++++++++++++++++++ doc/gtut-files/11-explicitwait.xml | 16 ++++ doc/gtut-files/Makefile | 29 ++++++- doc/gtut-files/gtut-platform-3nodes.xml | 21 +++++ 6 files changed, 266 insertions(+), 1 deletion(-) create mode 100644 doc/gtut-files/11-explicitwait.c create mode 100644 doc/gtut-files/11-explicitwait.output create mode 100644 doc/gtut-files/11-explicitwait.xml create mode 100644 doc/gtut-files/gtut-platform-3nodes.xml diff --git a/doc/gtut-files/.cvsignore b/doc/gtut-files/.cvsignore index 86ec6889cf..204763762d 100644 --- a/doc/gtut-files/.cvsignore +++ b/doc/gtut-files/.cvsignore @@ -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 index 0000000000..70478d8e75 --- /dev/null +++ b/doc/gtut-files/11-explicitwait.c @@ -0,0 +1,105 @@ +#include +#include + +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 index 0000000000..28758aeccc --- /dev/null +++ b/doc/gtut-files/11-explicitwait.output @@ -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 index 0000000000..63ef17e940 --- /dev/null +++ b/doc/gtut-files/11-explicitwait.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/doc/gtut-files/Makefile b/doc/gtut-files/Makefile index efd9d95e11..c5237b8dd5 100644 --- a/doc/gtut-files/Makefile +++ b/doc/gtut-files/Makefile @@ -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 index 0000000000..ca0d0387ab --- /dev/null +++ b/doc/gtut-files/gtut-platform-3nodes.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + -- 2.20.1