message_t message_new(e_message_type type, int peer_id, sg_mailbox_t return_mailbox);
/** Builds a new "have/piece" message */
message_t message_index_new(e_message_type type, int peer_id, sg_mailbox_t return_mailbox, int index);
-
message_t message_other_new(e_message_type type, int peer_id, sg_mailbox_t return_mailbox, unsigned int bitfield);
-/** Builds a new bitfield message */
-message_t message_bitfield_new(int peer_id, sg_mailbox_t return_mailbox, unsigned int bitfield);
/** Builds a new "request" message */
message_t message_request_new(int peer_id, sg_mailbox_t return_mailbox, int piece, int block_index, int block_length);
/** Build a new "piece" message */
message_t message_piece_new(int peer_id, sg_mailbox_t return_mailbox, int index, int block_index, int block_length);
-/** Free a message task */
-void message_free(void*);
-
#endif /* BITTORRENT_BITTORRENT_H_ */
connection_t connection;
xbt_dict_cursor_t cursor;
xbt_dict_foreach (peer->connected_peers, cursor, key, connection)
- connection_free(connection);
+ xbt_free(connection);
xbt_dict_free(&peer->connected_peers);
xbt_dict_free(&peer->active_peers);
void send_bitfield(const_peer_t peer, sg_mailbox_t mailbox)
{
XBT_DEBUG("Sending a BITFIELD to %s", sg_mailbox_get_name(mailbox));
- message_t message = message_bitfield_new(peer->id, peer->mailbox, peer->bitfield);
+ message_t message = message_other_new(MESSAGE_BITFIELD, peer->id, peer->mailbox, peer->bitfield);
sg_comm_t comm = sg_mailbox_put_init(mailbox, message, MESSAGE_BITFIELD_SIZE + BITS_TO_BYTES(FILE_PIECES));
sg_comm_detach(comm, NULL);
}
if (sg_comm_test(peer->comm_received)) {
peer->message = (message_t)data;
handle_message(peer, peer->message);
- message_free(peer->message);
+ xbt_free(peer->message);
peer->comm_received = NULL;
} else {
// We don't execute the choke algorithm if we don't already have a piece
if (sg_comm_test(peer->comm_received)) {
peer->message = (message_t)data;
handle_message(peer, peer->message);
- message_free(data);
+ xbt_free(peer->message);
peer->comm_received = NULL;
} else {
if (simgrid_get_clock() >= next_choked_update) {
connection->peer_speed = connection->peer_speed * 0.6 + speed * 0.4;
}
-void connection_free(void* data)
-{
- connection_t co = (connection_t)data;
- xbt_free(co);
-}
-
int connection_has_piece(const_connection_t connection, unsigned int piece)
{
return (connection->bitfield & 1U << piece);
return message;
}
-message_t message_bitfield_new(int peer_id, sg_mailbox_t return_mailbox, unsigned int bitfield)
-{
- message_t message = message_new(MESSAGE_BITFIELD, peer_id, return_mailbox);
- message->bitfield = bitfield;
- return message;
-}
-
message_t message_other_new(e_message_type type, int peer_id, sg_mailbox_t return_mailbox, unsigned int bitfield)
{
message_t message = message_new(type, peer_id, return_mailbox);
message->block_length = block_length;
return message;
}
-
-void message_free(void* task)
-{
- message_t message = (message_t)task;
- xbt_free(message);
-}
typedef const s_connection_t* const_connection_t;
connection_t connection_new(int id);
-void connection_free(void* data);
void connection_add_speed_value(connection_t connection, double speed);
int connection_has_piece(const_connection_t connection, unsigned int piece);
return xbt_dynar_member(peers, &id);
}
-/**
- * Tracker main function
- * @param argc number of arguments
- * @param argv arguments
- */
void tracker(int argc, char* argv[])
{
// Checking arguments
;
return ta;
}
-
-/**
- * Build a new task for the tracker.
- * @param issuer_host_name Hostname of the issuer. For debugging purposes
- */
-// tracker_task_data_t tracker_task_data_new(const char* issuer_host_name, sg_mailbox_t mailbox, int peer_id, int
-// uploaded,
-// int downloaded, int left)
-//{
-// tracker_task_data_t task = xbt_new(s_tracker_task_data_t, 1);
-//
-// task->type = TRACKER_TASK_QUERY;
-// task->issuer_host_name = issuer_host_name;
-// task->mailbox = mailbox;
-// task->peer_id = peer_id;
-// task->uploaded = uploaded;
-// task->downloaded = downloaded;
-// task->left = left;
-//
-// task->peers = xbt_dynar_new(sizeof(int), NULL);
-//
-// return task;
-//}
-//
-///**
-// * Free the data structure of a tracker task.
-// * @param task data to free
-// */
-// void tracker_task_data_free(tracker_task_data_t task)
-//{
-// xbt_dynar_free(&task->peers);
-// xbt_free(task);
-//}
-//
#include <xbt/dynar.h>
void tracker(int argc, char* argv[]);
-/**
- * Task types exchanged between a node and the tracker
- */
-typedef enum { TRACKER_TASK_QUERY, TRACKER_TASK_ANSWER } e_tracker_task_type_t;
-/**
- * Tasks exchanged between a tracker and peers.
- */
+/** Tasks exchanged between a tracker and peers. */
typedef struct s_tracker_query {
int peer_id; // peer id
sg_mailbox_t return_mailbox; // mailbox where the tracker should answer