1 #include "broadcaster.h"
3 XBT_LOG_NEW_DEFAULT_CATEGORY(msg_broadcaster,
4 "Messages specific for the broadcaster");
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_DEBUG("%s", hostname);
17 xbt_dynar_push(host_list, &hostname);
22 void delete_hostlist(xbt_dynar_t h)
27 int broadcaster_build_chain(const char **first, xbt_dynar_t host_list, xbt_dynar_iterator_t it)
29 msg_task_t task = NULL;
30 char **cur = (char**)xbt_dynar_iterator_next(it);
31 const char *me = "host0"; /* FIXME: hardcoded*/ /*MSG_host_get_name(MSG_host_self());*/
32 const char *current_host = NULL;
33 const char *prev = NULL;
34 const char *next = NULL;
35 const char *last = NULL;
37 /* Build the chain if there's at least one peer */
39 /* init: prev=NULL, host=current cur, next=next cur */
43 /* This iterator iterates one step ahead: cur is current iterated element,
44 but it's actually the next one in the chain */
46 /* following steps: prev=last, host=next, next=cur */
47 cur = (char**)xbt_dynar_iterator_next(it);
54 XBT_DEBUG("Building chain -- broadcaster:\"%s\" dest:\"%s\" prev:\"%s\" next:\"%s\"", me, current_host, prev, next);
56 /* Send message to current peer */
57 task = task_message_chain_new(me, current_host, prev, next);
58 //MSG_task_set_category(task, current_host);
59 MSG_task_send(task, current_host);
62 } while (cur != NULL);
68 int broadcaster_send_file(const char *first)
70 const char *me = MSG_host_get_name(MSG_host_self());
71 msg_task_t task = NULL;
72 msg_comm_t comm = NULL;
75 int piece_count = PIECE_COUNT;
78 for (; cur < piece_count; cur++) {
79 task = task_message_data_new(me, first, NULL, 0);
80 XBT_DEBUG("Sending (send) from %s into mailbox %s", me, first);
81 status = MSG_task_send(task, first);
83 xbt_assert(status == MSG_OK, "broadcaster_send_file() failed");
89 int broadcaster_finish(xbt_dynar_iterator_t it)
91 msg_task_t task = NULL;
92 const char *me = "host0"; /* FIXME: hardcoded*/ /*MSG_host_get_name(MSG_host_self());*/
93 const char *current_host = NULL;
96 xbt_dynar_iterator_seek(it, 0);
98 /* Send goodbye message to every peer in the order generated by iterator it */
99 for (cur = (char**)xbt_dynar_iterator_next(it); cur != NULL; cur = (char**)xbt_dynar_iterator_next(it)) {
100 /* Send message to current peer */
102 task = task_message_end_data_new(me, current_host);
103 //MSG_task_set_category(task, current_host);
104 MSG_task_send(task, current_host);
111 /** Emitter function */
112 int broadcaster(int argc, char *argv[])
114 xbt_dynar_t host_list = NULL;
115 const char *first = NULL;
116 int status = !MSG_OK;
118 XBT_INFO("broadcaster");
120 /* Add every mailbox given by the hostcount in argv[1] to a dynamic array */
121 host_list = build_hostlist_from_hostcount(atoi(argv[1]));
122 /*host_list = build_hostlist_from_argv(argc, argv);*/
124 /* Initialize iterator */
125 xbt_dynar_iterator_t it = xbt_dynar_iterator_new(host_list, forward_indices_list);
127 /* TODO: Error checking */
128 status = broadcaster_build_chain(&first, host_list, it);
129 status = broadcaster_send_file(first);
130 status = broadcaster_finish(it);
132 /* Destroy iterator and hostlist */
133 xbt_dynar_iterator_delete(it);
134 delete_hostlist(host_list);