if (!strcmp(kind, "request")) { // that's a request
char *req = MSG_task_get_data(task);
if (CS_used) { // need to push the request in the vector
if (!strcmp(kind, "request")) { // that's a request
char *req = MSG_task_get_data(task);
if (CS_used) { // need to push the request in the vector
xbt_dynar_push(requests, &req);
} else { // can serve it immediatly
xbt_dynar_push(requests, &req);
} else { // can serve it immediatly
m_task_t answer = MSG_task_create("grant", 0, 1000, NULL);
MSG_task_send(answer, req);
CS_used = 1;
}
} else { // that's a release. Check if someone was waiting for the lock
if (xbt_dynar_length(requests) > 0) {
m_task_t answer = MSG_task_create("grant", 0, 1000, NULL);
MSG_task_send(answer, req);
CS_used = 1;
}
} else { // that's a release. Check if someone was waiting for the lock
if (xbt_dynar_length(requests) > 0) {
xbt_dynar_length(requests));
char *req;
xbt_dynar_pop(requests, &req);
MSG_task_send(MSG_task_create("grant", 0, 1000, NULL), req);
todo--;
} else { // nobody wants it
xbt_dynar_length(requests));
char *req;
xbt_dynar_pop(requests, &req);
MSG_task_send(MSG_task_create("grant", 0, 1000, NULL), req);
todo--;
} else { // nobody wants it
// request the CS 3 times, sleeping a bit in between
int i;
for (i = 0; i < CS_PER_PROCESS; i++) {
// request the CS 3 times, sleeping a bit in between
int i;
for (i = 0; i < CS_PER_PROCESS; i++) {
MSG_task_send(MSG_task_create("request", 0, 1000, my_mailbox),
"coordinator");
// wait the answer
m_task_t grant = NULL;
MSG_task_receive(&grant, my_mailbox);
MSG_task_destroy(grant);
MSG_task_send(MSG_task_create("request", 0, 1000, my_mailbox),
"coordinator");
// wait the answer
m_task_t grant = NULL;
MSG_task_receive(&grant, my_mailbox);
MSG_task_destroy(grant);
MSG_process_sleep(1);
MSG_task_send(MSG_task_create("release", 0, 1000, NULL),
"coordinator");
MSG_process_sleep(my_pid);
}
MSG_process_sleep(1);
MSG_task_send(MSG_task_create("release", 0, 1000, NULL),
"coordinator");
MSG_process_sleep(my_pid);
}