+ // order is giving the task order on one computer
+ unsigned long order = -1;
+ char * char_order = agget(dag_node, (char *) "order");
+ if (char_order != NULL)
+ order = (long) dot_parse_int(char_order);
+ xbt_dynar_t computer = NULL;
+ //XBT_INFO("performer = %d, order=%d",performer,order);
+ if(performer != -1 && order != -1){
+ //necessary parameters are given
+ computer = xbt_dict_get_or_null(computers, char_performer);
+ if(computer == NULL){
+ computer = xbt_dynar_new(sizeof(SD_task_t), NULL);
+ xbt_dict_set(computers, char_performer, computer, NULL);
+ }
+ if(performer < xbt_lib_length(host_lib)){
+ // the wanted computer is available
+ SD_task_t *task_test = NULL;
+ if(order < computer->used)
+ task_test = xbt_dynar_get_ptr(computer,order);
+ if(task_test != NULL && *task_test != NULL && *task_test != current_job){
+ /*the user gives the same order to several tasks*/
+ schedule = false;
+ XBT_VERB("The task %s starts on the computer %s at the position : %s like the task %s",
+ (*task_test)->name, char_performer, char_order, current_job->name);
+ }else{
+ //the parameter seems to be ok
+ xbt_dynar_set_as(computer, order, SD_task_t, current_job);
+ }
+ }else{
+ /*the platform has not enough processors to schedule the DAG like
+ *the user wants*/
+ schedule = false;
+ XBT_VERB("The schedule is ignored, there are not enough computers");
+ }
+ }
+ else {
+ //one of necessary parameters are not given
+ schedule = false;
+ XBT_VERB("The schedule is ignored, the task %s is not correctly scheduled", current_job->name);
+ }
+ }
+}
+
+/* dot_add_output_dependencies create the dependencies between a task
+ * and a transfers. This is given by the edges in the dot file.
+ * The amount of data transfers is given by the attribute size on the
+ * edge. */
+void dot_add_input_dependencies(SD_task_t current_job, Agedge_t * edge)
+{
+ SD_task_t file = NULL;
+ char *name_tail=agnameof(agtail(edge));
+ char *name_head=agnameof(aghead(edge));
+ char *name = malloc((strlen(name_head)+strlen(name_tail)+6)*sizeof(char));
+ sprintf(name, "%s->%s", name_tail, name_head);
+ double size = dot_parse_double(agget(edge, (char *) "size"));
+ XBT_DEBUG("size : %e, get size : %s", size, agget(edge, (char *) "size"));
+
+ if (size > 0) {
+ file = xbt_dict_get_or_null(files, name);
+ if (file == NULL) {
+ file = SD_task_create_comm_e2e(name, NULL, size);
+#ifdef HAVE_TRACING
+ TRACE_sd_dotloader (file, agget (edge, (char*)"category"));
+#endif
+ xbt_dict_set(files, name, file, NULL);
+ } else {
+ if (SD_task_get_amount(file) != size) {
+ XBT_WARN("Ignoring file %s size redefinition from %.0f to %.0f",
+ name, SD_task_get_amount(file), size);
+ }
+ }
+ SD_task_dependency_add(NULL, NULL, file, current_job);