Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
The files needed for the example of lesson 11 (explicit wait)
[simgrid.git] / doc / gtut-files / 11-explicitwait.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;
+}