1 #include "broadcaster.h"
3 XBT_LOG_NEW_DEFAULT_CATEGORY(msg_broadcaster,
4 "Messages specific for kadeploy");
6 xbt_dynar_t build_hostlist_from_hostcount(int hostcount)
8 xbt_dynar_t host_list = xbt_dynar_new(sizeof(char*), NULL);
13 for (; i < hostcount+1; i++) {
14 hostname = xbt_new(char, HOSTNAME_LENGTH);
15 snprintf(hostname, HOSTNAME_LENGTH, "host%d", i);
16 //XBT_INFO("%s", hostname);
17 h = MSG_get_host_by_name(hostname);
19 XBT_INFO("Unknown host %s. Stopping Now! ", hostname);
22 xbt_dynar_push(host_list, &hostname);
28 /*xbt_dynar_t build_hostlist_from_argv(int argc, char *argv[])
30 xbt_dynar_t host_list = xbt_dynar_new(sizeof(char*), NULL);
34 for (; i < argc; i++) {
35 XBT_INFO("host%d = %s", i, argv[i]);
36 h = MSG_get_host_by_name(argv[i]);
38 XBT_INFO("Unknown host %s. Stopping Now! ", argv[i]);
41 xbt_dynar_push(host_list, &(argv[i]));
47 void delete_hostlist(xbt_dynar_t h)
52 int broadcaster_build_chain(const char **first, xbt_dynar_t host_list)
54 xbt_dynar_iterator_t it = xbt_dynar_iterator_new(host_list, forward_indices_list);
55 msg_task_t task = NULL;
56 char **cur = (char**)xbt_dynar_iterator_next(it);
57 const char *me = MSG_host_get_name(MSG_host_self());
58 const char *current_host = NULL;
59 const char *prev = NULL;
60 const char *next = NULL;
61 const char *last = NULL;
63 /* Build the chain if there's at least one peer */
65 /* init: prev=NULL, host=current cur, next=next cur */
69 /* This iterator iterates one step ahead: cur is current iterated element,
70 but it's actually the next one in the chain */
72 /* following steps: prev=last, host=next, next=cur */
73 cur = (char**)xbt_dynar_iterator_next(it);
80 //XBT_INFO("Building chain -- broadcaster:\"%s\" dest:\"%s\" prev:\"%s\" next:\"%s\"", me, current_host, prev, next);
82 /* Send message to current peer */
83 task = task_message_chain_new(me, current_host, prev, next);
84 //MSG_task_set_category(task, current_host);
85 MSG_task_send(task, current_host);
88 } while (cur != NULL);
90 xbt_dynar_iterator_delete(it);
95 int broadcaster_send_file(const char *first)
97 const char *me = MSG_host_get_name(MSG_host_self());
98 msg_task_t task = NULL;
99 msg_comm_t comm = NULL;
102 int piece_count = PIECE_COUNT;
105 for (; cur < piece_count; cur++) {
106 task = task_message_data_new(me, first, NULL, 0);
107 XBT_INFO("Sending (send) from %s into mailbox %s", me, first);
108 status = MSG_task_send(task, first);
110 xbt_assert(status == MSG_OK, __FILE__ ": broadcaster_send_file() failed");
116 /* FIXME: I should iterate nodes in the same order as the one used to build the chain */
117 int broadcaster_finish(xbt_dynar_t host_list)
119 xbt_dynar_iterator_t it = xbt_dynar_iterator_new(host_list, forward_indices_list);
120 msg_task_t task = NULL;
121 const char *me = MSG_host_get_name(MSG_host_self());
122 const char *current_host = NULL;
125 /* Send goodbye message to every peer */
126 for (cur = (char**)xbt_dynar_iterator_next(it); cur != NULL; cur = (char**)xbt_dynar_iterator_next(it)) {
127 /* Send message to current peer */
129 task = task_message_end_data_new(me, current_host);
130 //MSG_task_set_category(task, current_host);
131 MSG_task_send(task, current_host);
138 /** Emitter function */
139 int broadcaster(int argc, char *argv[])
141 xbt_dynar_t host_list = NULL;
142 const char *first = NULL;
143 int status = !MSG_OK;
145 XBT_INFO("broadcaster");
147 /* Check that every host given by the hostcount in argv[1] exists and add it
148 to a dynamic array */
149 host_list = build_hostlist_from_hostcount(atoi(argv[1]));
150 /*host_list = build_hostlist_from_argv(argc, argv);*/
152 /* TODO: Error checking */
153 status = broadcaster_build_chain(&first, host_list);
154 status = broadcaster_send_file(first);
155 status = broadcaster_finish(host_list);
157 delete_hostlist(host_list);