Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
We need the os threads here
[simgrid.git] / doc / gtut-files / 11-explicitwait.c
1 #include <stdlib.h>
2 #include <gras.h>
3
4 XBT_LOG_NEW_DEFAULT_CATEGORY(test,"My little example");
5
6 void message_declaration(void) {
7   gras_msgtype_declare("request", NULL);
8   gras_msgtype_declare("grant", NULL);
9   gras_msgtype_declare("release", NULL);
10 }
11
12 typedef struct {
13    int process_in_CS;
14    xbt_dynar_t waiting_queue;
15 } server_data_t;
16
17 int server_request_cb(gras_msg_cb_ctx_t ctx, void *payload) {
18   server_data_t *globals=(server_data_t*)gras_userdata_get();
19   gras_socket_t s = gras_msg_cb_ctx_from(ctx);
20  
21   if (globals->process_in_CS) {
22      xbt_dynar_push(globals->waiting_queue, &s);
23      INFO2("put %s:%d in waiting queue",gras_socket_peer_name(s),gras_socket_peer_port(s));
24   } else {     
25      globals->process_in_CS = 1;
26      INFO2("grant %s:%d since nobody wanted it",gras_socket_peer_name(s),gras_socket_peer_port(s));
27      gras_msg_send(s, "grant", NULL);     
28   }
29   return 0;
30 } /* end_of_request_callback */
31
32 int server_release_cb(gras_msg_cb_ctx_t ctx, void *payload) {
33   server_data_t *globals=(server_data_t*)gras_userdata_get();
34    
35   if (xbt_dynar_length(globals->waiting_queue)) {
36      gras_socket_t s;
37      xbt_dynar_pop(globals->waiting_queue, &s);
38      
39      INFO2("grant %s:%d since token released",gras_socket_peer_name(s),gras_socket_peer_port(s));
40      gras_msg_send(s, "grant", NULL);
41   } else {
42      globals->process_in_CS = 0;
43   }
44    
45   return 0;
46 } /* end_of_release_callback */
47
48 int server(int argc, char *argv[]) { 
49   gras_socket_t mysock;   /* socket on which I listen */
50   server_data_t *globals;
51   int i;
52   
53   gras_init(&argc,argv);
54   mysock = gras_socket_server(atoi(argv[1]));
55
56   globals=gras_userdata_new(server_data_t);
57   globals->process_in_CS=0;
58   globals->waiting_queue=xbt_dynar_new( sizeof(gras_socket_t), NULL /* not closing sockets */);
59
60   message_declaration();   
61   gras_cb_register("request",&server_request_cb);
62   gras_cb_register("release",&server_release_cb);
63
64   for (i=0; i<20; i++)  /* 5 requests of each process, 2 processes, 2 messages per request */
65     gras_msg_handle(-1); 
66     
67   gras_exit();
68   return 0;
69 } /* end_of_server */
70
71 void lock(gras_socket_t toserver) {
72    gras_msg_send(toserver,"request",NULL);
73    gras_msg_wait(-1, "grant",NULL,NULL);
74    INFO0("Granted by server");
75 } /* end_of_lock */
76
77 void unlock(gras_socket_t toserver) {
78    INFO0("Release the token");
79    gras_msg_send(toserver,"release",NULL);
80 } /* end_of_unlock */
81
82 int client(int argc, char *argv[]) {
83   int i;
84   gras_socket_t mysock;   /* socket on which I listen */
85   gras_socket_t toserver; /* socket used to write to the server */
86
87   gras_init(&argc,argv);
88
89   mysock = gras_socket_server_range(1024, 10000, 0, 0);
90   
91   VERB1("Client ready; listening on %d", gras_socket_my_port(mysock));
92   
93   gras_os_sleep(1.5); /* sleep 1 second and half */
94   message_declaration();
95   toserver = gras_socket_client(argv[1], atoi(argv[2]));
96
97   for (i=0;i<5; i++) {
98      gras_os_sleep(0.1);
99      lock(toserver);
100      gras_os_sleep(0.1);
101      unlock(toserver);
102   }
103   gras_exit();
104   return 0;
105 }