1 /* Copyright (c) 2007, 2010. The SimGrid Team.
2 * All rights reserved. */
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. */
10 XBT_LOG_NEW_DEFAULT_CATEGORY(test, "My little example");
12 void message_declaration(void)
14 gras_msgtype_declare("request", NULL);
15 gras_msgtype_declare("grant", NULL);
16 gras_msgtype_declare("release", NULL);
21 xbt_dynar_t waiting_queue;
24 int server_request_cb(gras_msg_cb_ctx_t ctx, void *payload)
26 server_data_t *globals = (server_data_t *) gras_userdata_get();
27 gras_socket_t s = gras_msg_cb_ctx_from(ctx);
29 if (globals->process_in_CS) {
30 xbt_dynar_push(globals->waiting_queue, &s);
31 INFO2("put %s:%d in waiting queue", gras_socket_peer_name(s),
32 gras_socket_peer_port(s));
34 globals->process_in_CS = 1;
35 INFO2("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);
40 } /* end_of_request_callback */
42 int server_release_cb(gras_msg_cb_ctx_t ctx, void *payload)
44 server_data_t *globals = (server_data_t *) gras_userdata_get();
46 if (xbt_dynar_length(globals->waiting_queue)) {
48 xbt_dynar_pop(globals->waiting_queue, &s);
50 INFO2("grant %s:%d since token released", gras_socket_peer_name(s),
51 gras_socket_peer_port(s));
52 gras_msg_send(s, "grant", NULL);
54 globals->process_in_CS = 0;
58 } /* end_of_release_callback */
60 int server(int argc, char *argv[])
62 gras_socket_t mysock; /* socket on which I listen */
63 server_data_t *globals;
66 gras_init(&argc, argv);
67 mysock = gras_socket_server(atoi(argv[1]));
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 */ );
75 message_declaration();
76 gras_cb_register("request", &server_request_cb);
77 gras_cb_register("release", &server_release_cb);
79 for (i = 0; i < 20; i++) /* 5 requests of each process, 2 processes, 2 messages per request */
86 void lock(gras_socket_t toserver)
88 gras_msg_send(toserver, "request", NULL);
89 gras_msg_wait(-1, "grant", NULL, NULL);
90 INFO0("Granted by server");
93 void unlock(gras_socket_t toserver)
95 INFO0("Release the token");
96 gras_msg_send(toserver, "release", NULL);
99 int client(int argc, char *argv[])
102 gras_socket_t mysock; /* socket on which I listen */
103 gras_socket_t toserver; /* socket used to write to the server */
105 gras_init(&argc, argv);
107 mysock = gras_socket_server_range(1024, 10000, 0, 0);
109 VERB1("Client ready; listening on %d", gras_socket_my_port(mysock));
111 gras_os_sleep(1.5); /* sleep 1 second and half */
112 message_declaration();
113 toserver = gras_socket_client(argv[1], atoi(argv[2]));
115 for (i = 0; i < 5; i++) {