1 /* Copyright (c) 2009, 2010. The SimGrid Team.
2 * All rights reserved. */
4 /* This program is free software; you can redistribute it and/or modify it
5 * under the terms of the license (GNU LGPL) which comes with this package. */
7 /* This datatype stores a a trace as produced by examples/simdag/dax, or other means
8 * It can be replayed in simulation with examples/msg/actions or on a real platform with
9 * examples/gras/replay.
13 #include "xbt/sysdep.h"
16 #include "gras/datadesc.h"
18 XBT_LOG_NEW_DEFAULT_SUBCATEGORY(xbt_workload, xbt,
19 "Workload characterisation mecanisms");
22 xbt_workload_elm_t xbt_workload_elm_parse(char *line)
24 xbt_workload_elm_t res = xbt_new(s_xbt_workload_elm_t, 1);
26 res->comment = NULL; /* it's not enough to memset for valgrind, apparently */
30 xbt_dynar_t w = xbt_str_split(line, " ");
32 if (xbt_dynar_is_empty(w)) {
38 char **words = xbt_dynar_get_ptr(w, 0);
40 if (words[i][0] == '[') {
41 sscanf(words[i] + 1, "%lg", &(res->date));
44 res->who = xbt_strdup(words[i++]);
45 if (!strcmp(words[i], "recv")) {
46 res->action = XBT_WORKLOAD_RECV;
47 res->str_arg = xbt_strdup(words[++i]);
48 sscanf(words[++i], "%lg", &(res->d_arg));
50 } else if (!strcmp(words[i], "send")) {
51 res->action = XBT_WORKLOAD_SEND;
52 res->str_arg = xbt_strdup(words[++i]);
53 sscanf(words[++i], "%lg", &(res->d_arg));
55 } else if (!strcmp(words[i], "compute")) {
56 res->action = XBT_WORKLOAD_COMPUTE;
57 sscanf(words[++i], "%lg", &(res->d_arg));
59 xbt_die("Unparsable command: %s (in %s)", words[i], line);
62 if (words[i] && words[i][0] == '#') {
63 res->comment = xbt_strdup(strchr(line, '#') + 1);
70 void xbt_workload_elm_free(xbt_workload_elm_t cmd)
80 void xbt_workload_elm_free_voidp(void *cmd)
82 xbt_workload_elm_free(*(xbt_workload_elm_t *) cmd);
85 char *xbt_workload_elm_to_string(xbt_workload_elm_t cmd)
91 return xbt_strdup("(null command)");
92 if (cmd->date != -1) {
93 addon = bprintf("[%f] ", cmd->date);
97 addon = bprintf("'%s' ", cmd->who);
101 switch (cmd->action) {
102 case XBT_WORKLOAD_COMPUTE:
103 addon = bprintf("computed %f flops", cmd->d_arg);
107 case XBT_WORKLOAD_SEND:
108 addon = bprintf("sent %f bytes to '%s'", cmd->d_arg, cmd->str_arg);
112 case XBT_WORKLOAD_RECV:
114 bprintf("received %f bytes from '%s'", cmd->d_arg, cmd->str_arg);
119 xbt_die("Unknown command %d in '%s...'", cmd->action, res);
122 addon = bprintf(" (comment: %s)", cmd->comment);
126 return xbt_strdup(res);
129 int xbt_workload_elm_cmp_who_date(const void *_c1, const void *_c2)
131 xbt_workload_elm_t c1 = *(xbt_workload_elm_t *) _c1;
132 xbt_workload_elm_t c2 = *(xbt_workload_elm_t *) _c2;
137 int r = strcmp(c1->who, c2->who);
140 if (c1->date == c2->date)
142 if (c1->date < c2->date)
147 void xbt_workload_sort_who_date(xbt_dynar_t c)
149 qsort(xbt_dynar_get_ptr(c, 0), xbt_dynar_length(c),
150 sizeof(xbt_workload_elm_t), xbt_workload_elm_cmp_who_date);
153 xbt_dynar_t xbt_workload_parse_file(char *filename)
156 file_in = fopen(filename, "r");
157 xbt_assert(file_in, "cannot open tracefile '%s'", filename);
158 char *str_in = xbt_str_from_file(file_in);
160 xbt_dynar_t in = xbt_str_split(str_in, "\n");
163 xbt_dynar_new(sizeof(xbt_workload_elm_t),
164 xbt_workload_elm_free_voidp);
168 xbt_dynar_foreach(in, cursor, line) {
169 xbt_workload_elm_t cmd = xbt_workload_elm_parse(line);
171 xbt_dynar_push(cmds, &cmd);
173 xbt_dynar_shrink(cmds, 0);
179 void xbt_workload_declare_datadesc(void)
181 gras_datadesc_type_t ddt;
183 ddt = gras_datadesc_struct("s_xbt_workload_elm_t");
184 gras_datadesc_struct_append(ddt, "who", gras_datadesc_by_name("string"));
185 gras_datadesc_struct_append(ddt, "comment",
186 gras_datadesc_by_name("string"));
187 gras_datadesc_struct_append(ddt, "action", gras_datadesc_by_name("int"));
188 gras_datadesc_struct_append(ddt, "date",
189 gras_datadesc_by_name("double"));
190 gras_datadesc_struct_append(ddt, "d_arg",
191 gras_datadesc_by_name("double"));
192 gras_datadesc_struct_append(ddt, "str_arg",
193 gras_datadesc_by_name("string"));
194 gras_datadesc_struct_close(ddt);
196 gras_datadesc_ref("xbt_workload_elm_t", ddt);
198 ddt = gras_datadesc_struct("s_xbt_workload_data_chunk_t");
199 gras_datadesc_struct_append(ddt, "size", gras_datadesc_by_name("int"));
200 gras_datadesc_cb_field_push(ddt, "size");
201 gras_datadesc_struct_append(ddt, "chunk",
202 gras_datadesc_ref_pop_arr
203 (gras_datadesc_by_name("char")));
204 gras_datadesc_struct_close(ddt);
206 gras_datadesc_ref("xbt_workload_data_chunk_t", ddt);
211 xbt_workload_data_chunk_t xbt_workload_data_chunk_new(int size)
213 xbt_workload_data_chunk_t res = xbt_new0(s_xbt_workload_data_chunk_t, 1);
214 res->size = size - sizeof(res) - sizeof(int);
215 res->chunk = xbt_new(char, res->size);
219 void xbt_workload_data_chunk_free(xbt_workload_data_chunk_t c)