drake  1.0.0
src/task.c
Go to the documentation of this file.
00001 /*
00002  Copyright 2015 Nicolas Melot
00003 
00004  This file is part of Drake.
00005 
00006  Drake is free software: you can redistribute it and/or modify
00007  it under the terms of the GNU General Public License as published by
00008  the Free Software Foundation, either version 3 of the License, or
00009  (at your option) any later version.
00010 
00011  Drake is distributed in the hope that it will be useful,
00012  but WITHOUT ANY WARRANTY; without even the implied warranty of
00013  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
00014  GNU General Public License for more details.
00015 
00016  You should have received a copy of the GNU General Public License
00017  along with Drake. If not, see <http://www.gnu.org/licenses/>.
00018 
00019 */
00020 
00021 #include <stdlib.h>
00022 #include <string.h>
00023 #include <math.h>
00024 
00025 #include <drake/link.h>
00026 #include <drake/task.h>
00027 #include <pelib/string.h>
00028 #include <pelib/integer.h>
00029 #include <drake/platform.h>
00030 
00031 #if 1 
00032 #define debug(var) printf("[%s:%s:%d:CORE %zu] %s = \"%s\"\n", __FILE__, __FUNCTION__, __LINE__, drake_platform_core_id(), #var, var); fflush(NULL)
00033 #define debug_addr(var) printf("[%s:%s:%d:CORE %zu] %s = \"%p\"\n", __FILE__, __FUNCTION__, __LINE__, drake_platform_core_id(), #var, var); fflush(NULL)
00034 #define debug_int(var) printf("[%s:%s:%d:CORE %zu] %s = \"%d\"\n", __FILE__, __FUNCTION__, __LINE__, drake_platform_core_id(), #var, var); fflush(NULL)
00035 #define debug_size_t(var) printf("[%s:%s:%d:CORE %zu] %s = \"%zu\"\n", __FILE__, __FUNCTION__, __LINE__, drake_platform_core_id(), #var, var); fflush(NULL)
00036 #else
00037 #define debug(var)
00038 #define debug_addr(var)
00039 #define debug_int(var)
00040 #define debug_size_t(var)
00041 #endif
00042 
00043 FILE*
00044 pelib_printf(task_tp)(FILE* stream, task_tp task)
00045 {
00046   char * str = NULL;
00047   str = pelib_string(task_tp)(task);
00048   fprintf(stream, "%s", str);
00049 
00050   free(str);
00051 
00052   return stream;
00053 }
00054 
00055 FILE*
00056 pelib_printf_detail(task_tp)(FILE* stream, task_tp task, int level)
00057 {
00058         char *str;
00059         str = pelib_string_detail(task_tp)(task, level);
00060         fprintf(stream, "%s", str);
00061         free(str);
00062 
00063         return stream;
00064 }
00065 
00066 char *
00067 pelib_string(task_tp)(task_tp task)
00068 {
00069         size_t size;
00070         char *str;
00071 
00072         if(task == NULL)
00073         {
00074                 str = malloc(sizeof(char) * 2);
00075                 sprintf(str, ".");
00076                 return str;
00077         }
00078 
00079         if(task->id > 0)
00080         {
00081                 size = (size_t)log10(task->id);
00082         }
00083         else
00084         {
00085                 size = 1;
00086         }
00087         
00088   str = malloc((size + 1) * sizeof(char));
00089   sprintf(str, "%u", task->id);
00090 
00091   return str;
00092 }
00093 
00094 char*
00095 pelib_string_detail(task_tp)(task_tp task, int level)
00096 {
00097         if(level == 0)
00098         {
00099                 return pelib_string(task_tp)(task);
00100         }
00101         else
00102         {
00103                 char *simple_str, *complete_str, *pred_str, *succ_str, *src_str, *sink_str;
00104 
00105                 simple_str = pelib_string(task_tp)(task);
00106                 if(task->pred != NULL)
00107                 {
00108                         pred_str = pelib_string_detail(map_t(string, link_tp))(*task->pred, level - 1);
00109                 }
00110                 else
00111                 {
00112                         pred_str = malloc(sizeof(char));
00113                         pred_str[0] = '\0';
00114                 }
00115                 
00116                 if(task->pred != NULL)
00117                 {
00118                         succ_str = pelib_string_detail(map_t(string, link_tp))(*task->succ, level - 1);
00119                 }
00120                 else
00121                 {
00122                         succ_str = malloc(sizeof(char));
00123                         succ_str[0] = '\0';
00124                 }
00125                 
00126                 if(task->source != NULL)
00127                 {
00128                         src_str = pelib_string_detail(array_t(cross_link_tp))(*task->source, level - 1);
00129                 }
00130                 else
00131                 {
00132                         src_str = malloc(sizeof(char));
00133                         src_str[0] = '\0';
00134                 }
00135 
00136                 if(task->sink != NULL)
00137                 {
00138                         sink_str = pelib_string_detail(array_t(cross_link_tp))(*task->sink, level - 1);
00139                 }
00140                 else
00141                 {
00142                         sink_str = malloc(sizeof(char));
00143                         sink_str[0] = '\0';
00144                 }
00145                 complete_str = malloc((1 + strlen(simple_str) + 6 + strlen(pred_str) + 6 + strlen(succ_str) + 8 + strlen(src_str) + 6 + strlen(sink_str) + 2) * sizeof(char));
00146                 sprintf(complete_str, "{%s:pred=%s:succ=%s:source=%s:sink=%s}", simple_str, pred_str, succ_str, src_str, sink_str);
00147 
00148                 free(simple_str);
00149                 free(pred_str);
00150                 free(succ_str);
00151                 free(src_str);
00152                 free(sink_str);
00153 
00154                 return complete_str;
00155         }
00156 }
00157 
00158 int
00159 pelib_compare(task_tp)(task_tp a, task_tp b)
00160 {
00161   return 0;
00162 }
00163 
00164 task_t*
00165 pelib_alloc(task)()
00166 {
00167         return malloc(sizeof(task_t));
00168 }
00169 
00170 task_tp*
00171 pelib_alloc(task_tp)(void* aux)
00172 {
00173         task_tp* res = malloc(sizeof(task_tp));
00174 
00175         return res;
00176 }
00177 
00178 int
00179 pelib_init(task_tp)(task_tp* task)
00180 {
00181         return 0;
00182 }
00183 
00184 size_t
00185 pelib_fread(task_tp)(task_tp* ptr, FILE* stream)
00186 {
00187         return 0;
00188 }
00189 
00190 int
00191 pelib_copy(task_tp)(task_tp source, task_tp* dest)
00192 {
00193         *dest = source;
00194         
00195         return 0;
00196 }
00197 
00198 int
00199 pelib_destroy(task_tp)(task_tp task)
00200 {
00201         if(task->core != NULL)
00202         {
00203                 free(task->core);
00204         }
00205         return 1;
00206 }
00207 
00208 int
00209 drake_task_killed(task_tp task)
00210 {
00211         return task->status >= TASK_KILLED;
00212 }
00213 
00214 int
00215 drake_task_depleted(task_tp task)
00216 {
00217         int all_killed = 1;
00218         int all_empty = 1;
00219 
00220         if(task == NULL)
00221         {
00222                 return 1;
00223         }
00224 
00225         map_iterator_t(string, link_tp)* i;
00226         for(i = pelib_map_begin(string, link_tp)(task->pred); i != pelib_map_end(string, link_tp)(task->pred); i = pelib_map_next(string, link_tp)(i))
00227         {
00228                 link_tp link = pelib_map_read(string, link_tp)(i).value;
00229                 all_killed = all_killed && ((link->prod == NULL) ? 1 : link->prod->status >= TASK_KILLED);
00230                 all_empty = all_empty && (pelib_cfifo_length(int)(link->buffer) == 0);
00231         }
00232 
00233         return (all_killed && all_empty) || (task->status >= TASK_KILLED);
00234 }
00235 
00236 #define PAIR_KEY_T string
00237 #define PAIR_VALUE_T task_tp
00238 #include <pelib/pair.c>
00239 
00240 #define ITERATOR_T pair_t(string, task_tp)
00241 #include <pelib/iterator.c>
00242 
00243 #define MAP_KEY_T string
00244 #define MAP_VALUE_T task_tp
00245 #include <pelib/map.c>
00246 
00247 #define ARRAY_T task_tp
00248 #include <pelib/array.c>