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) {
13 gras_msgtype_declare("request", NULL);
14 gras_msgtype_declare("grant", NULL);
15 gras_msgtype_declare("release", NULL);
20 xbt_dynar_t waiting_queue;
23 int server_request_cb(gras_msg_cb_ctx_t ctx, void *payload) {
24 server_data_t *globals=(server_data_t*)gras_userdata_get();
25 gras_socket_t s = gras_msg_cb_ctx_from(ctx);
27 if (globals->process_in_CS) {
28 xbt_dynar_push(globals->waiting_queue, &s);
29 INFO2("put %s:%d in waiting queue",gras_socket_peer_name(s),gras_socket_peer_port(s));
31 globals->process_in_CS = 1;
32 INFO2("grant %s:%d since nobody wanted it",gras_socket_peer_name(s),gras_socket_peer_port(s));
33 gras_msg_send(s, "grant", NULL);
36 } /* end_of_request_callback */
38 int server_release_cb(gras_msg_cb_ctx_t ctx, void *payload) {
39 server_data_t *globals=(server_data_t*)gras_userdata_get();
41 if (xbt_dynar_length(globals->waiting_queue)) {
43 xbt_dynar_pop(globals->waiting_queue, &s);
45 INFO2("grant %s:%d since token released",gras_socket_peer_name(s),gras_socket_peer_port(s));
46 gras_msg_send(s, "grant", NULL);
48 globals->process_in_CS = 0;
52 } /* end_of_release_callback */
54 int server(int argc, char *argv[]) {
55 gras_socket_t mysock; /* socket on which I listen */
56 server_data_t *globals;
59 gras_init(&argc,argv);
60 mysock = gras_socket_server(atoi(argv[1]));
62 globals=gras_userdata_new(server_data_t);
63 globals->process_in_CS=0;
64 globals->waiting_queue=xbt_dynar_new( sizeof(gras_socket_t), NULL /* not closing sockets */);
66 message_declaration();
67 gras_cb_register("request",&server_request_cb);
68 gras_cb_register("release",&server_release_cb);
70 for (i=0; i<20; i++) /* 5 requests of each process, 2 processes, 2 messages per request */
77 void lock(gras_socket_t toserver) {
78 gras_msg_send(toserver,"request",NULL);
79 gras_msg_wait(-1, "grant",NULL,NULL);
80 INFO0("Granted by server");
83 void unlock(gras_socket_t toserver) {
84 INFO0("Release the token");
85 gras_msg_send(toserver,"release",NULL);
88 int client(int argc, char *argv[]) {
90 gras_socket_t mysock; /* socket on which I listen */
91 gras_socket_t toserver; /* socket used to write to the server */
93 gras_init(&argc,argv);
95 mysock = gras_socket_server_range(1024, 10000, 0, 0);
97 VERB1("Client ready; listening on %d", gras_socket_my_port(mysock));
99 gras_os_sleep(1.5); /* sleep 1 second and half */
100 message_declaration();
101 toserver = gras_socket_client(argv[1], atoi(argv[2]));