drake
1.0.0
|
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>