3 XBT_LOG_NEW_DEFAULT_CATEGORY(msg_peer,
4 "Messages specific for the peer");
6 /*******************************************************
8 *******************************************************/
10 void peer_init_chain(peer_t peer, message_t msg)
12 peer->prev = msg->prev_hostname;
13 peer->next = msg->next_hostname;
17 void peer_forward_msg(peer_t peer, message_t msg)
20 msg_task_t task = task_message_data_new(peer->me, peer->next, NULL, 0);
21 msg_comm_t comm = NULL;
22 XBT_INFO("Sending (isend) from %s into mailbox %s", peer->me, peer->next);
23 comm = MSG_task_isend(task, peer->next);
24 queue_pending_connection(comm, peer->pending_sends);
27 int peer_execute_task(peer_t peer, msg_task_t task)
30 message_t msg = MSG_task_get_data(task);
32 //XBT_INFO("Peer %s got message of type %d\n", peer->me, msg->type);
34 case MESSAGE_BUILD_CHAIN:
35 peer_init_chain(peer, msg);
37 case MESSAGE_SEND_DATA:
38 xbt_assert(peer->init, __FILE__ ": peer_execute_task() failed: got msg_type %d before initialization", msg->type);
39 if (peer->next != NULL)
40 peer_forward_msg(peer, msg);
43 case MESSAGE_END_DATA:
44 xbt_assert(peer->init, __FILE__ ": peer_execute_task() failed: got msg_type %d before initialization", msg->type);
46 XBT_INFO("%d pieces receieved", peer->pieces);
50 MSG_task_execute(task);
55 msg_error_t peer_wait_for_message(peer_t peer)
58 msg_comm_t comm = NULL;
59 msg_task_t task = NULL;
63 if (comm == NULL) // FIXME I should have a recv queue
64 comm = MSG_task_irecv(&task, peer->me);
66 if (MSG_comm_test(comm)) {
67 status = MSG_comm_get_status(comm);
68 //XBT_INFO("peer_wait_for_message: error code = %d", status);
69 xbt_assert(status == MSG_OK, "peer_wait_for_message() failed");
70 MSG_comm_destroy(comm);
72 done = peer_execute_task(peer, task);
73 task_message_delete(task);
76 process_pending_connections(peer->pending_sends);
77 MSG_process_sleep(0.1);
84 void peer_init(peer_t p, int argc, char *argv[])
91 p->pending_sends = xbt_dynar_new(sizeof(msg_comm_t), NULL);
92 p->me = xbt_new(char, HOSTNAME_LENGTH);
93 /* Set mailbox name: use host number from argv or hostname if no argument given */
95 snprintf(p->me, HOSTNAME_LENGTH, "host%s", argv[1]);
97 strncpy(p->me, MSG_host_get_name(MSG_host_self()), HOSTNAME_LENGTH);
101 void peer_shutdown(peer_t p)
103 float start_time = MSG_get_clock();
104 float end_time = start_time + PEER_SHUTDOWN_DEADLINE;
106 XBT_INFO("Waiting for sends to finish before shutdown...");
107 while (xbt_dynar_length(p->pending_sends) && MSG_get_clock() < end_time) {
108 process_pending_connections(p->pending_sends);
109 MSG_process_sleep(0.1);
112 xbt_assert(xbt_dynar_length(p->pending_sends) == 0, "Shutdown failed, sends still pending after deadline");
113 xbt_dynar_free(&p->pending_sends);
120 int peer(int argc, char *argv[])
122 peer_t p = xbt_new(s_peer_t, 1);
127 peer_init(p, argc, argv);
128 status = peer_wait_for_message(p);
132 } /* end_of_receiver */