Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
all DHT examples are now called dht-<protocol>
[simgrid.git] / examples / msg / dht-kademlia / task.c
1 /* Copyright (c) 2012, 2014, 2016. The SimGrid Team.
2  * All rights reserved.                                                     */
3
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. */
6
7 #include "task.h"
8 #include "answer.h"
9 XBT_LOG_NEW_DEFAULT_CATEGORY(msg_kademlia_task, "Messages specific for this msg example");
10
11 /** @brief Creates a new "find node" task
12   * @param sender_id the id of the node who sends the task
13   * @param destination_id the id the sender is trying to find
14   * @param hostname the hostname of the node, for logging purposes
15   */
16 msg_task_t task_new_find_node(unsigned int sender_id, unsigned int destination_id, char *mailbox, const char *hostname)
17 {
18   task_data_t data = xbt_new(s_task_data_t, 1);
19
20   data->type = TASK_FIND_NODE;
21   data->sender_id = sender_id;
22   data->destination_id = destination_id;
23   data->answer = NULL;
24   data->answer_to = mailbox;
25   data->issuer_host_name = hostname;
26
27   msg_task_t task = MSG_task_create(NULL, COMP_SIZE, COMM_SIZE, data);
28
29   return task;
30 }
31
32 /** @brief Creates a new "answer to find node" task
33   *  @param sender_id the node who sent the task
34   *  @param destination_id the node that should be found
35   *  @param answer the answer to send
36   *  @param mailbox The mailbox of the sender
37   *  @param hostname sender hostname
38   */
39 msg_task_t task_new_find_node_answer(unsigned int sender_id, unsigned int destination_id, answer_t answer,
40                                      char *mailbox, const char *hostname)
41 {
42   task_data_t data = xbt_new(s_task_data_t, 1);
43
44   data->type = TASK_FIND_NODE_ANSWER;
45   data->sender_id = sender_id;
46   data->destination_id = destination_id;
47   data->answer = answer;
48   data->answer_to = mailbox;
49   data->issuer_host_name = hostname;
50
51   msg_task_t task = MSG_task_create(NULL, COMP_SIZE, COMM_SIZE, data);
52
53   return task;
54 }
55
56 /** @brief Creates a new "ping" task
57   * @param sender_id : sender node identifier
58   * @param mailbox : mailbox where we should respond
59   * @param hostname : hostname of the sender, for debugging purposes
60   */
61 msg_task_t task_new_ping(unsigned int sender_id, char *mailbox, const char *hostname)
62 {
63   task_data_t data = xbt_new(s_task_data_t, 1);
64
65   data->type = TASK_PING;
66   data->sender_id = sender_id;
67   data->destination_id = 0;
68   data->answer = NULL;
69   data->answer_to = mailbox;
70   data->issuer_host_name = hostname;
71
72   msg_task_t task = MSG_task_create(NULL, COMP_SIZE, COMM_SIZE, data);
73
74   return task;
75 }
76
77 /** @brief Creates a new "ping answer" task
78   * @param sender_id : sender node identifier
79   * @param mailbox : mailbox of the sender
80   * @param hostname : hostname of the sender, for debugging purposes
81   */
82 msg_task_t task_new_ping_answer(unsigned int sender_id, char *mailbox, const char *hostname)
83 {
84   task_data_t data = xbt_new(s_task_data_t, 1);
85
86   data->type = TASK_PING_ANSWER;
87   data->sender_id = sender_id;
88   data->destination_id = 0;
89   data->answer = NULL;
90   data->answer_to = mailbox;
91   data->issuer_host_name = hostname;
92
93   msg_task_t task = MSG_task_create(NULL, COMP_SIZE, COMM_SIZE, data);
94
95   return task;
96 }
97
98 /** @brief Destroys a task and its data
99   * @param task the task that'll be destroyed
100   */
101 void task_free(msg_task_t task)
102 {
103   xbt_assert((task != NULL), "Tried to free a NULL task");
104
105   task_data_t data = MSG_task_get_data(task);
106
107   if (data->answer) {
108     answer_free(data->answer);
109   }
110   xbt_free(data);
111
112   MSG_task_destroy(task);
113 }
114
115 /** @brief Destroys a task and its data (taking a void* pointer
116   * @param task The task that'll be destroyed
117   */
118 void task_free_v(void *task)
119 {
120   task_free(task);
121 }