/* Copyright (c) 2012-2014. The SimGrid Team.
 * All rights reserved.                                                     */

/* This program is free software; you can redistribute it and/or modify it
 * under the terms of the license (GNU LGPL) which comes with this package. */

#include "messages.h"

msg_task_t task_message_new(e_message_type type, unsigned int len)
{
  message_t msg      = xbt_new(s_message_t, 1);
  msg->type          = type;
  msg->prev_hostname = NULL;
  msg->next_hostname = NULL;
  msg_task_t task    = MSG_task_create(NULL, 0, len, msg);

  return task;
}

msg_task_t task_message_chain_new(const char* prev, const char* next, const unsigned int num_pieces)
{
  msg_task_t task    = task_message_new(MESSAGE_BUILD_CHAIN, MESSAGE_BUILD_CHAIN_SIZE);
  message_t msg      = MSG_task_get_data(task);
  msg->prev_hostname = xbt_strdup(prev);
  msg->next_hostname = xbt_strdup(next);
  msg->num_pieces    = num_pieces;

  return task;
}

msg_task_t task_message_data_new(const char* block, unsigned int len)
{
  msg_task_t task  = task_message_new(MESSAGE_SEND_DATA, MESSAGE_SEND_DATA_HEADER_SIZE + len);
  message_t msg    = MSG_task_get_data(task);
  msg->data_block  = block;
  msg->data_length = len;

  return task;
}

void task_message_delete(void* task)
{
  message_t msg = MSG_task_get_data(task);
  xbt_free(msg);
  MSG_task_destroy(task);
}
