Logo AND Algorithmique Numérique Distribuée

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