40 #include <sys/types.h>
46 #include <libxml/xmlmemory.h>
47 #include <libxml/parser.h>
134 ERRPRINTF(
"Error creating new routine.\n");
139 cnode = node->xmlChildrenNode;
142 while(cnode != NULL) {
145 key = (
char *)xmlNodeListGetString(doc, cnode->xmlChildrenNode, 1);
148 if(!xmlStrcmp(cnode->name, (
const xmlChar *)
"name")) {
150 ERRPRINTF(
"set_str failed setting name\n");
154 else if(!xmlStrcmp(cnode->name, (
const xmlChar *)
"exe_path")) {
156 ERRPRINTF(
"set_str failed setting exe_path\n");
160 else if(!xmlStrcmp(cnode->name, (
const xmlChar *)
"exe_args")) {
162 ERRPRINTF(
"set_str failed setting exe_args\n");
166 else if(!xmlStrcmp(cnode->name, (
const xmlChar *)
"model_path")) {
168 ERRPRINTF(
"set_str failed failed setting model_path\n");
172 else if(!xmlStrcmp(cnode->name, (
const xmlChar *)
"parameters")) {
175 ERRPRINTF(
"Error parsing parameter definitions.\n");
179 else if(!xmlStrcmp(cnode->name, (
const xmlChar *)
"condition")) {
180 if(strcmp(
"now", key) == 0) {
187 else if(strcmp(
"idle", key) == 0) {
190 else if(strcmp(
"nousers", key) == 0) {
202 ERRPRINTF(
"Configuration error, routine:%s, condition:%s\n",
208 else if(!xmlStrcmp(cnode->name, (
const xmlChar *)
"priority")) {
211 else if(!xmlStrcmp(cnode->name, (
const xmlChar *)
"construction")) {
213 ERRPRINTF(
"Error parsing construction method definition.\n");
230 ERRPRINTF(
"Routine not parsed correctly.\n");
258 cnode = node->xmlChildrenNode;
260 key = (
char *)xmlNodeListGetString(doc, cnode->xmlChildrenNode, 1);
263 if(!xmlStrcmp(cnode->name, (
const xmlChar *)
"n_p")) {
264 pd_set->
n_p = atoi((
char *)key);
266 if(pd_set->
n_p <= 0) {
267 ERRPRINTF(
"Number of parameters must be greater than 0.\n");
279 ERRPRINTF(
"First element of parameter_array xml must be size (n_p)\n.");
294 while(cnode != NULL) {
297 key = (
char *)xmlNodeListGetString(doc, cnode->xmlChildrenNode, 1);
300 if(!xmlStrcmp(cnode->name, (
const xmlChar *)
"param"))
304 ERRPRINTF(
"Error parsring parameter defintion.\n");
310 else if(!xmlStrcmp(cnode->name, (
const xmlChar *)
"param_constraint"))
313 ERRPRINTF(
"Error parsing parameter contraint.\n");
331 if(i != pd_set->
n_p) {
332 ERRPRINTF(
"Parsed unexpected number of param_defs. (%d of %d).\n",
343 ERRPRINTF(
"Error setting up param constraint formula parser.\n");
373 cnode = node->xmlChildrenNode;
377 while(cnode != NULL) {
380 key = (
char *)xmlNodeListGetString(doc, cnode->xmlChildrenNode, 1);
383 if(!xmlStrcmp(cnode->name, (
const xmlChar *)
"formula")) {
385 ERRPRINTF(
"set_str failed setting name\n");
389 else if(!xmlStrcmp(cnode->name, (
const xmlChar *)
"max")) {
390 pd_set->
pc_max = atoi((
char *)key);
392 else if(!xmlStrcmp(cnode->name, (
const xmlChar *)
"min")) {
393 pd_set->
pc_min = atoi((
char *)key);
428 cnode = node->xmlChildrenNode;
436 while(cnode != NULL) {
439 key = (
char *)xmlNodeListGetString(doc, cnode->xmlChildrenNode, 1);
442 if(!xmlStrcmp(cnode->name, (
const xmlChar *)
"order")) {
443 p.
order = atoi((
char *)key);
446 else if(!xmlStrcmp(cnode->name, (
const xmlChar *)
"name")) {
448 ERRPRINTF(
"set_str failed setting name\n");
452 else if(!xmlStrcmp(cnode->name, (
const xmlChar *)
"max") ||
453 !xmlStrcmp(cnode->name, (
const xmlChar *)
"end")) {
454 p.
end = atoi((
char *)key);
456 else if(!xmlStrcmp(cnode->name, (
const xmlChar *)
"min") ||
457 !xmlStrcmp(cnode->name, (
const xmlChar *)
"start")) {
458 p.
start = atoi((
char *)key);
460 else if(!xmlStrcmp(cnode->name, (
const xmlChar *)
"stride")) {
461 p.
stride = atoi((
char *)key);
463 else if(!xmlStrcmp(cnode->name, (
const xmlChar *)
"offset")) {
464 p.
offset = atoi((
char *)key);
466 else if(!xmlStrcmp(cnode->name, (
const xmlChar *)
"fuzzy_max") ||
467 !xmlStrcmp(cnode->name, (
const xmlChar *)
"nonzero_end")) {
468 if(strcmp(
"yes", key) == 0 ||
469 strcmp(
"true", key) == 0 ||
470 strcmp(
"1", key) == 0)
474 else if(strcmp(
"false", key) == 0 ||
475 strcmp(
"no", key) == 0 ||
476 strcmp(
"0", key) == 0)
482 ERRPRINTF(
"Error parsing nonzero_end value : %s\n", key);
499 ERRPRINTF(
"paramdef has an order that is out of bounds order:%d.\n",
509 ERRPRINTF(
"Error copying parsed paramdef into parameter array.\n");
540 cnode = node->xmlChildrenNode;
543 while(cnode != NULL) {
546 key = (
char *)xmlNodeListGetString(doc, cnode->xmlChildrenNode, 1);
549 if(!xmlStrcmp(cnode->name, (
const xmlChar *)
"method")) {
550 if(!xmlStrcmp((
const xmlChar *)
"naive", (xmlChar *) key))
554 else if(!xmlStrcmp((
const xmlChar *)
"naive_bisect", (xmlChar *)key))
558 else if(!xmlStrcmp((
const xmlChar *)
"gbbp", (xmlChar *) key))
562 else if(!xmlStrcmp((
const xmlChar *)
"gbbp_naive", (xmlChar *) key))
566 else if(!xmlStrcmp((
const xmlChar *)
"rand", (xmlChar *) key))
572 LOGPRINTF(
"construction method unrecognised: %s\n", key);
576 if(!xmlStrcmp(cnode->name, (
const xmlChar *)
"min_sample_num")) {
579 if(!xmlStrcmp(cnode->name, (
const xmlChar *)
"min_sample_time")) {
582 if(!xmlStrcmp(cnode->name, (
const xmlChar *)
"max_completion")) {
616 xmlNodePtr root, cnode;
619 int routine_count = 0;
622 doc = xmlReadFile(cfg->
configfile, NULL, XML_PARSE_NOBLANKS);
631 root = xmlDocGetRootElement(doc);
641 if(xmlStrcmp(root->name, (
const xmlChar *)
"config")) {
642 ERRPRINTF(
"Config file is of wrong type. root node: %s\n", root->name);
648 cnode = root->xmlChildrenNode;
652 while(cnode != NULL) {
654 if(!xmlStrcmp(cnode->name, (
const xmlChar *)
"main_sleep_period")) {
656 key = (
char *)xmlNodeListGetString(doc, cnode->xmlChildrenNode, 1);
661 if(!xmlStrcmp(cnode->name,
662 (
const xmlChar *)
"model_write_time_threshold"))
665 key = (
char *)xmlNodeListGetString(doc, cnode->xmlChildrenNode, 1);
670 if(!xmlStrcmp(cnode->name,
671 (
const xmlChar *)
"model_write_execs_threshold"))
674 key = (
char *)xmlNodeListGetString(doc, cnode->xmlChildrenNode, 1);
680 if(!xmlStrcmp(cnode->name, (
const xmlChar *)
"load_monitor")) {
684 ERRPRINTF(
"Error parsing load history configuration.\n");
689 else if(!xmlStrcmp(cnode->name, (
const xmlChar *)
"routine")) {
699 ERRPRINTF(
"Error adding routine to configuration.\n");
739 ERRPRINTF(
"Error creating new loadhistory structure.\n");
744 cnode = node->xmlChildrenNode;
747 while(cnode != NULL) {
750 key = (
char *)xmlNodeListGetString(doc, cnode->xmlChildrenNode, 1);
753 if(!xmlStrcmp(cnode->name, (
const xmlChar *)
"load_path")) {
755 ERRPRINTF(
"set_str failed setting load_path\n");
759 else if(!xmlStrcmp(cnode->name, (
const xmlChar *)
"write_period")) {
762 else if(!xmlStrcmp(cnode->name, (
const xmlChar *)
"history_size")) {
764 ERRPRINTF(
"Error initializing load history.\n");
781 ERRPRINTF(
"load history config not parsed correctly.\n");
801 t = malloc(
sizeof *t);
803 ERRPRINTF(
"Error allocating timeval structure");
807 cnode = node->xmlChildrenNode;
809 while(cnode != NULL) {
810 key = (
char *)xmlNodeListGetString(doc, cnode->xmlChildrenNode, 1);
813 if(!xmlStrcmp(cnode->name, (
const xmlChar *)
"secs")) {
814 t->tv_sec = atoll((
char *)key);
816 else if(!xmlStrcmp(cnode->name, (
const xmlChar *)
"usecs")) {
817 t->tv_usec = atoll((
char *)key);
850 cnode = node->xmlChildrenNode;
852 while(cnode != NULL) {
853 key = (
char *)xmlNodeListGetString(doc, cnode->xmlChildrenNode, 1);
858 if(!xmlStrcmp(cnode->name, (
const xmlChar *)
"secs")) {
859 t->tv_sec = atoll((
char *)key);
861 else if(!xmlStrcmp(cnode->name, (
const xmlChar *)
"usecs")) {
862 t->tv_usec = atoll((
char *)key);
897 cnode = node->xmlChildrenNode;
899 key = (
char *)xmlNodeListGetString(doc, cnode->xmlChildrenNode, 1);
902 if(!xmlStrcmp(cnode->name, (
const xmlChar *)
"n_p")) {
903 *n_p = atoi((
char *)key);
906 ERRPRINTF(
"Number of parameters must be greater than 0.\n");
910 *p = malloc(*n_p *
sizeof *(*p));
918 ERRPRINTF(
"First element of parameter_array xml must be size (n_p)"
919 "got: %s\n", cnode->name);
932 while(cnode != NULL) {
934 key = (
char *)xmlNodeListGetString(doc, cnode->xmlChildrenNode, 1);
936 if(!xmlStrcmp(cnode->name, (
const xmlChar *)
"parameter")) {
938 (*p)[i++] = atoll((
char *)key);
941 ERRPRINTF(
"Parsed more parameters than expected.\n");
961 ERRPRINTF(
"Parsed unexpected number of parameters. (%d of %d).\n",
986 ERRPRINTF(
"Error allocating new benchmark.\n");
991 cnode = node->xmlChildrenNode;
994 while(cnode != NULL) {
997 key = (
char *)xmlNodeListGetString(doc, cnode->xmlChildrenNode, 1);
1002 if(!xmlStrcmp(cnode->name, (
const xmlChar *)
"parameter_array")) {
1004 ERRPRINTF(
"Error parsing parameter_array.\n");
1009 else if(!xmlStrcmp(cnode->name, (
const xmlChar *)
"complexity")) {
1010 if(sscanf((
char *)key,
"%lld", &(b->
complexity)) != 1) {
1011 ERRPRINTF(
"Error parsing complexity.\n");
1016 else if(!xmlStrcmp(cnode->name, (
const xmlChar *)
"flops")) {
1017 if(sscanf((
char *)key,
"%lf", &(b->
flops)) != 1) {
1023 else if(!xmlStrcmp(cnode->name, (
const xmlChar *)
"seconds")) {
1024 if(sscanf((
char *)key,
"%lf", &(b->
seconds)) != 1) {
1030 else if(!xmlStrcmp(cnode->name, (
const xmlChar *)
"used_time")) {
1032 ERRPRINTF(
"Error parsing used_time timeval.\n");
1037 else if(!xmlStrcmp(cnode->name, (
const xmlChar *)
"wall_time")) {
1039 ERRPRINTF(
"Error parsing wall_time timeval.\n");
1084 ERRPRINTF(
"Error creating new interval.\n");
1089 cnode = node->xmlChildrenNode;
1092 while(cnode != NULL) {
1095 key = (
char *)xmlNodeListGetString(doc, cnode->xmlChildrenNode, 1);
1098 if(!xmlStrcmp(cnode->name, (
const xmlChar *)
"plane")) {
1099 i->
plane = atoi((
char *)key);
1101 else if(!xmlStrcmp(cnode->name, (
const xmlChar *)
"climb_step")) {
1104 else if(!xmlStrcmp(cnode->name, (
const xmlChar *)
"start")) {
1108 cnode->xmlChildrenNode) < 0)
1110 ERRPRINTF(
"Error parsing parameter_array.\n");
1114 else if(!xmlStrcmp(cnode->name, (
const xmlChar *)
"end")) {
1118 cnode->xmlChildrenNode) < 0)
1120 ERRPRINTF(
"Error parsing parameter_array.\n");
1124 else if(!xmlStrcmp(cnode->name, (
const xmlChar *)
"type")) {
1125 if(!xmlStrcmp((
const xmlChar *)
"gbbp_empty", (xmlChar *) key)) {
1128 else if(!xmlStrcmp((
const xmlChar *)
"gbbp_climb", (xmlChar *) key)) {
1131 else if(!xmlStrcmp((
const xmlChar *)
"gbbp_bisect", (xmlChar *) key)) {
1134 else if(!xmlStrcmp((
const xmlChar *)
"gbbp_inflect", (xmlChar *) key)) {
1137 else if(!xmlStrcmp((
const xmlChar *)
"point", (xmlChar *) key)) {
1140 else if(!xmlStrcmp((
const xmlChar *)
"boundary_complete", (xmlChar *) key)) {
1143 else if(!xmlStrcmp((
const xmlChar *)
"complete", (xmlChar *) key)) {
1189 ERRPRINTF(
"Error creating new load structure.\n");
1194 cnode = node->xmlChildrenNode;
1197 while(cnode != NULL) {
1200 key = (
char *)xmlNodeListGetString(doc, cnode->xmlChildrenNode, 1);
1205 if(!xmlStrcmp(cnode->name, (
const xmlChar *)
"time")) {
1207 ERRPRINTF(
"Error parsign time string.\n");
1212 else if(!xmlStrcmp(cnode->name, (
const xmlChar *)
"one_min")) {
1213 if(sscanf((
char *)key,
"%lf", &(l->
load[0])) != 1) {
1214 ERRPRINTF(
"Error parsing 1 minute load.\n");
1219 else if(!xmlStrcmp(cnode->name, (
const xmlChar *)
"five_min")) {
1220 if(sscanf((
char *)key,
"%lf", &(l->
load[1])) != 1) {
1221 ERRPRINTF(
"Error parsing 5 minute load.\n");
1226 else if(!xmlStrcmp(cnode->name, (
const xmlChar *)
"fifteen_min")) {
1227 if(sscanf((
char *)key,
"%lf", &(l->
load[2])) != 1) {
1228 ERRPRINTF(
"Error parsing 15 minute load.\n");
1270 xmlNodePtr root, cnode;
1282 if(errno == ENOENT) {
1291 fl.l_type = F_RDLCK;
1292 fl.l_whence = SEEK_SET;
1298 if(fcntl(fd, F_SETLKW, &fl) == -1) {
1305 doc = xmlReadFd(fd, h->
load_path, NULL, XML_PARSE_NOBLANKS);
1326 root = xmlDocGetRootElement(doc);
1337 if(xmlStrcmp(root->name, (
const xmlChar *)
"loadhistory")) {
1338 ERRPRINTF(
"Load history file is of wrong type. root node: %s\n",
1346 cnode = root->xmlChildrenNode;
1350 while(cnode != NULL) {
1355 if(!xmlStrcmp(cnode->name, (
const xmlChar *)
"load")) {
1405 cnode = node->xmlChildrenNode;
1407 key = (
char *)xmlNodeListGetString(doc, cnode->xmlChildrenNode, 1);
1412 if(!xmlStrcmp(cnode->name, (
const xmlChar *)
"size")) {
1414 size = atoi((
char *)key);
1420 ERRPRINTF(
"First element of bench_list xml must be size "
1421 "got: %s\n.", cnode->name);
1428 cnode = cnode->next;
1431 while(cnode != NULL) {
1434 if(!xmlStrcmp(cnode->name, (
const xmlChar *)
"benchmark")) {
1439 ERRPRINTF(
"Error parsing benchmark.\n");
1446 ERRPRINTF(
"Error inserting bench into bench list.\n");
1485 cnode = node->xmlChildrenNode;
1488 while(cnode != NULL) {
1491 if(!xmlStrcmp(cnode->name, (
const xmlChar *)
"interval")) {
1526 xmlNodePtr root, cnode;
1539 ERRPRINTF(
"Error, attempting to parse model file into non empty model:"
1550 if(errno == ENOENT) {
1559 fl.l_type = F_RDLCK;
1560 fl.l_whence = SEEK_SET;
1566 if(fcntl(fd, F_SETLKW, &fl) == -1) {
1573 doc = xmlReadFd(fd, m->
model_path, NULL, XML_PARSE_NOBLANKS);
1575 ERRPRINTF(
"Model file: %s not parsed correctly continuing with new "
1596 root = xmlDocGetRootElement(doc);
1606 if(xmlStrcmp(root->name, (
const xmlChar *)
"model")) {
1607 ERRPRINTF(
"Model xml has wrong type. root node: %s\n", root->name);
1613 cnode = root->xmlChildrenNode;
1616 while(cnode != NULL) {
1619 key = (
char *)xmlNodeListGetString(doc, cnode->xmlChildrenNode, 1);
1622 if(!xmlStrcmp(cnode->name, (
const xmlChar *)
"n_p")) {
1623 m->
n_p = atoi((
char *)key);
1628 ERRPRINTF(
"model / routine parameter mismatch m:%d r:%d.\n",
1634 else if(!xmlStrcmp(cnode->name, (
const xmlChar *)
"completion")) {
1637 completion = atoi((
char *)key);
1639 else if(!xmlStrcmp(cnode->name, (
const xmlChar *)
"complete")) {
1642 else if(!xmlStrcmp(cnode->name, (
const xmlChar *)
"parameters")) {
1647 ERRPRINTF(
"Error parsing parameter definitions.\n");
1653 if(pd_set->
n_p != m->
n_p) {
1654 ERRPRINTF(
"Parameter definition and model mismatch.\n");
1662 ERRPRINTF(
"Current parameter definitions do not match "
1663 "those initially used to build model.\n");
1684 else if(!xmlStrcmp(cnode->name, (
const xmlChar *)
"bench_list")) {
1686 ERRPRINTF(
"Error parsing bench list.\n");
1692 else if(!xmlStrcmp(cnode->name, (
const xmlChar *)
"interval_list")) {
1695 ERRPRINTF(
"Error parsing interval list.\n");
1717 ERRPRINTF(
"Model completion mismatch, model: %s, %d benchmarks parsed, %d expected\n",
1738 for(i=0; i<c->
used; i++) {
1742 LOGPRINTF(
"Loading model: %s for routine: %s\n",
1753 ERRPRINTF(
"Error initialising bench list.\n");
1782 rc = xmlTextWriterStartElement(writer, BAD_CAST
"interval");
1784 ERRPRINTF(
"Error @ xmlTextWriterStartElement (interval)\n");
1790 rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST
"type",
"%s",
1794 rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST
"type",
"%s",
1799 rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST
"type",
"%s",
1804 rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST
"type",
"%s",
1809 rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST
"type",
"%s",
1810 "boundary_complete");
1814 rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST
"type",
"%s",
1819 rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST
"type",
"%s",
1824 ERRPRINTF(
"Invalid interval type: %s (%d)\n",
1831 ERRPRINTF(
"Error @ xmlTextWriterWriteFormatElement (type)\n");
1840 rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST
"climb_step",
1843 ERRPRINTF(
"Error @ xmlTextWriterWriteFormatElement (plane)\n");
1849 rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST
"plane",
1852 ERRPRINTF(
"Error @ xmlTextWriterWriteFormatElement (plane)\n");
1858 rc = xmlTextWriterStartElement(writer, BAD_CAST
"start");
1860 ERRPRINTF(
"Error @ xmlTextWriterStartElement (start)\n");
1866 ERRPRINTF(
"Error writing parameter array (start)\n");
1870 rc = xmlTextWriterEndElement(writer);
1872 ERRPRINTF(
"Error @ xmlTextWriterEndElement\n");
1878 rc = xmlTextWriterStartElement(writer, BAD_CAST
"end");
1880 ERRPRINTF(
"Error @ xmlTextWriterStartElement (end)\n");
1886 ERRPRINTF(
"Error writing parameter array (end)\n");
1890 rc = xmlTextWriterEndElement(writer);
1892 ERRPRINTF(
"Error @ xmlTextWriterEndElement\n");
1900 rc = xmlTextWriterStartElement(writer, BAD_CAST
"start");
1902 ERRPRINTF(
"Error @ xmlTextWriterStartElement (start)\n");
1908 ERRPRINTF(
"Error writing parameter array (start)\n");
1912 rc = xmlTextWriterEndElement(writer);
1914 ERRPRINTF(
"Error @ xmlTextWriterEndElement\n");
1926 ERRPRINTF(
"Invalid interval type: %s (%d)\n",
1936 rc = xmlTextWriterEndElement(writer);
1938 ERRPRINTF(
"Error @ xmlTextWriterEndElement\n");
1961 xmlTextWriterPtr writer;
1962 xmlOutputBufferPtr output_buffer;
1964 struct flock fl = {F_WRLCK, SEEK_SET, 0, 0, 0};
1965 int temp_fd, hist_fd;
1967 DBGPRINTF(
"writing file: %s\n", h->
load_path);
1970 if(asprintf(&temp_file,
"%s.XXXXXX", h->
load_path)
1973 ERRPRINTF(
"filename too long: %s\n", temp_file);
1983 temp_fd = mkstemp(temp_file);
1985 ERRPRINTF(
"Error opening temp file for writing: %s\n", temp_file);
1992 output_buffer = xmlOutputBufferCreateFd(temp_fd, NULL);
1993 if(output_buffer == NULL) {
1994 ERRPRINTF(
"Error creating xml output buffer.\n");
2007 writer = xmlNewTextWriter(output_buffer);
2008 if (writer == NULL) {
2009 ERRPRINTF(
"Error creating the xml writer\n");
2019 rc = xmlTextWriterSetIndent(writer, 1);
2023 xmlFreeTextWriter(writer);
2035 ERRPRINTF(
"Error writing history, partial history saved in: %s\n",
2038 xmlFreeTextWriter(writer);
2046 xmlFreeTextWriter(writer);
2048 if(fsync(temp_fd) < 0) {
2049 ERRPRINTF(
"Error syncing data for file, remove:%s manually.\n",
2062 if(close(temp_fd) < 0) {
2063 ERRPRINTF(
"Error closing file, remove:%s manually\n", temp_file);
2071 hist_fd = open(h->
load_path, O_WRONLY|O_CREAT, S_IRWXU);
2082 fl.l_type = F_WRLCK;
2083 fl.l_whence = SEEK_SET;
2089 if(fcntl(hist_fd, F_SETLKW, &fl) == -1) {
2090 ERRPRINTF(
"Error aquiring lock on load history file: %s\n",
2103 if(rename(temp_file, h->
load_path) < 0) {
2104 ERRPRINTF(
"Error renaming %s to %s, leaving %s on filesystem\n",
2118 if(close(hist_fd) < 0) {
2135 #define TIME_STR_SIZE 256
2153 rc = xmlTextWriterStartDocument(writer, NULL,
"ISO-8859-1", NULL);
2155 ERRPRINTF(
"Error @ xmlTextWriterStartDocument\n");
2160 rc = xmlTextWriterStartElement(writer, BAD_CAST
"loadhistory");
2162 ERRPRINTF(
"Error @ xmlTextWriterStartElement (loadhistory)\n");
2167 while(i != h->
end_i) {
2170 rc = xmlTextWriterStartElement(writer, BAD_CAST
"load");
2172 ERRPRINTF(
"Error @ xmlTextWriterStartElement (load)\n");
2179 "%Y-%m-%dT%H:%M:%S%z",
2182 ERRPRINTF(
"Error converting time_t to ISO 8601 string.\n");
2187 rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST
"time",
2190 ERRPRINTF(
"Error @ xmlTextWriterWriteFormatElement (time)\n");
2204 rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST
"one_min",
2207 ERRPRINTF(
"Error @ xmlTextWriterWriteFormatElement (one_min)\n");
2211 rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST
"five_min",
2214 ERRPRINTF(
"Error @ xmlTextWriterWriteFormatElement (five_min)\n");
2218 rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST
"fifteen_min",
2221 ERRPRINTF(
"Error @ xmlTextWriterWriteFormatElement (fifteen_min)\n");
2226 rc = xmlTextWriterEndElement(writer);
2228 ERRPRINTF(
"Error @ xmlTextWriterEndElement\n");
2237 rc = xmlTextWriterEndDocument(writer);
2239 ERRPRINTF(
"Error @ xmlTextWriterEndDocument\n");
2260 fl.l_whence = SEEK_SET;
2265 if(fcntl(fd, F_GETLK, &fl) == -1) {
2266 ERRPRINTF(
"Error checking lock status on fd: %d\n", fd);
2272 if(fl.l_type == F_UNLCK) {
2296 for(i=0; i<cfg->
used; i++) {
2298 ERRPRINTF(
"Error writing model for routine: %s.\n",
2320 xmlTextWriterPtr writer;
2321 xmlOutputBufferPtr output_buffer;
2324 int temp_fd, model_fd;
2326 DBGPRINTF(
"writing model file: %s\n", m->
model_path);
2329 if(asprintf(&temp_file,
"%s.XXXXXX", m->
model_path)
2332 ERRPRINTF(
"filename too long: %s\n", temp_file);
2340 temp_fd = mkstemp(temp_file);
2342 ERRPRINTF(
"Error opening temp file for writing: %s\n", temp_file);
2349 output_buffer = xmlOutputBufferCreateFd(temp_fd, NULL);
2350 if(output_buffer == NULL) {
2351 ERRPRINTF(
"Error creating xml output buffer.\n");
2362 writer = xmlNewTextWriter(output_buffer);
2363 if (writer == NULL) {
2364 ERRPRINTF(
"Error creating the xml writer\n");
2374 rc = xmlTextWriterSetIndent(writer, 1);
2378 xmlFreeTextWriter(writer);
2390 ERRPRINTF(
"Error writing model, partial model saved in: %s\n",
2393 xmlFreeTextWriter(writer);
2401 xmlFreeTextWriter(writer);
2403 if(fsync(temp_fd) < 0) {
2404 ERRPRINTF(
"Error syncing data for file, remove:%s manually.\n",
2417 if(close(temp_fd) < 0) {
2418 ERRPRINTF(
"Error closing file, remove:%s manually\n", temp_file);
2426 model_fd = open(m->
model_path, O_WRONLY|O_CREAT, S_IRWXU);
2437 fl.l_type = F_WRLCK;
2438 fl.l_whence = SEEK_SET;
2444 if(fcntl(model_fd, F_SETLKW, &fl) == -1) {
2458 ERRPRINTF(
"Error renaming %s to %s, leaving %s on filesystem\n",
2472 if(close(model_fd) < 0) {
2506 ERRPRINTF(
"Error syncing data for file descriptor: %d.\n", fd);
2514 ERRPRINTF(
"Error closing file descriptor: %d.\n", fd);
2539 dir_c = strdup(file_path);
2541 ERRPRINTF(
"Could not allocate memory to copy file_path.\n");
2550 dir_name = dirname(dir_c);
2552 dir_fd = open(dir_name, O_RDONLY);
2554 ERRPRINTF(
"Error opening directory: %s.\n", dir_name);
2563 if(fsync(dir_fd) < 0) {
2564 ERRPRINTF(
"Error fsycing directory: %s.\n", dir_name);
2570 if(close(dir_fd) < 0) {
2571 ERRPRINTF(
"Error closing directory: %s.\n", dir_name);
2597 rc = xmlTextWriterStartDocument(writer, NULL,
"ISO-8859-1", NULL);
2599 ERRPRINTF(
"Error @ xmlTextWriterStartDocument\n");
2604 rc = xmlTextWriterStartElement(writer, BAD_CAST
"model");
2606 ERRPRINTF(
"Error @ xmlTextWriterStartElement (model)\n");
2611 rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST
"completion",
2614 ERRPRINTF(
"Error @ xmlTextWriterWriteFormatElement (completion)\n");
2619 rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST
"n_p",
2622 ERRPRINTF(
"Error @ xmlTextWriterWriteFormatElement (n_p)\n");
2627 rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST
"complete",
2630 ERRPRINTF(
"Error @ xmlTextWriterWriteFormatElement (complete)\n");
2637 ERRPRINTF(
"Error in write_paramdef_set_xtwp.\n");
2644 ERRPRINTF(
"Error in write_bench_list_xtwp.\n");
2649 rc = xmlTextWriterStartElement(writer, BAD_CAST
"interval_list");
2651 ERRPRINTF(
"Error @ xmlTextWriterStartElement (interval_list)\n");
2669 rc = xmlTextWriterEndElement(writer);
2671 ERRPRINTF(
"Error @ xmlTextWriterEndElement\n");
2676 rc = xmlTextWriterEndDocument(writer);
2678 ERRPRINTF(
"Error @ xmlTextWriterEndDocument\n");
2701 rc = xmlTextWriterStartElement(writer, BAD_CAST
"bench_list");
2703 ERRPRINTF(
"Error @ xmlTextWriterStartElement (bench_list)\n");
2708 rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST
"size",
"%d",
2711 ERRPRINTF(
"Error @ xmlTextWriterWriteFormatElement (size)\n");
2716 b = bench_list->
first;
2721 ERRPRINTF(
"Error in write_benchmark_xtwp\n");
2728 rc = xmlTextWriterEndElement(writer);
2730 ERRPRINTF(
"Error @ xmlTextWriterEndElement (bench_list)\n");
2757 rc = xmlTextWriterStartElement(writer, BAD_CAST
"parameters");
2759 ERRPRINTF(
"Error @ xmlTextWriterStartElement (parameters)\n");
2764 rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST
"n_p",
2767 ERRPRINTF(
"Error @ xmlTextWriterWriteFormatElement (n_p)\n");
2772 for(i=0; i<pd_set->
n_p; i++) {
2775 ERRPRINTF(
"Error writing parameter definition\n");
2782 rc = xmlTextWriterStartElement(writer, BAD_CAST
"param_constraint");
2784 ERRPRINTF(
"Error @ xmlTextWriterStartElement (param_constraint)\n");
2789 rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST
"formula",
2792 ERRPRINTF(
"Error @ xmlTextWriterWriteFormatElement (pc_formula)\n");
2796 rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST
"pc_max",
2799 ERRPRINTF(
"Error @ xmlTextWriterWriteFormatElement (pc_max)\n");
2803 rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST
"pc_min",
2806 ERRPRINTF(
"Error @ xmlTextWriterWriteFormatElement (pc_min)\n");
2811 rc = xmlTextWriterEndElement(writer);
2813 ERRPRINTF(
"Error @ xmlTextWriterEndElement\n");
2819 rc = xmlTextWriterEndElement(writer);
2821 ERRPRINTF(
"Error @ xmlTextWriterEndElement\n");
2842 rc = xmlTextWriterStartElement(writer, BAD_CAST
"param");
2844 ERRPRINTF(
"Error @ xmlTextWriterStartElement (param)\n");
2849 rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST
"order",
"%d",
2852 ERRPRINTF(
"Error @ xmlTextWriterWriteFormatElement (order)\n");
2857 rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST
"name",
"%s",
2860 ERRPRINTF(
"Error @ xmlTextWriterWriteFormatElement (name)\n");
2865 rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST
"start",
"%d",
2868 ERRPRINTF(
"Error @ xmlTextWriterWriteFormatElement (start)\n");
2873 rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST
"end",
"%d",
2876 ERRPRINTF(
"Error @ xmlTextWriterWriteFormatElement (end)\n");
2881 rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST
"stride",
"%d",
2884 ERRPRINTF(
"Error @ xmlTextWriterWriteFormatElement (stride)\n");
2889 rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST
"offset",
"%d",
2892 ERRPRINTF(
"Error @ xmlTextWriterWriteFormatElement (offset)\n");
2897 rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST
"nonzero_end",
"%d",
2900 ERRPRINTF(
"Error @ xmlTextWriterWriteFormatElement (nonzero_end)\n");
2905 rc = xmlTextWriterEndElement(writer);
2907 ERRPRINTF(
"Error @ xmlTextWriterEndElement\n");
2940 rc = xmlTextWriterStartElement(writer, BAD_CAST
"parameter_array");
2942 ERRPRINTF(
"Error @ xmlTextWriterStartElement (parameter_array)\n");
2947 rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST
"n_p",
2950 ERRPRINTF(
"Error @ xmlTextWriterWriteFormatElement (n_p)\n");
2954 for(i=0; i<n; i++) {
2956 rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST
"parameter",
2959 ERRPRINTF(
"Error @ xmlTextWriterWriteFormatElement "
2966 rc = xmlTextWriterEndElement(writer);
2968 ERRPRINTF(
"Error @ xmlTextWriterEndElement\n");
2989 rc = xmlTextWriterStartElement(writer, BAD_CAST
"benchmark");
2991 ERRPRINTF(
"Error @ xmlTextWriterStartElement (bench)\n");
2998 ERRPRINTF(
"Error writing parameter array.\n");
3003 rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST
"complexity",
3006 ERRPRINTF(
"Error @ xmlTextWriterWriteFormatElement (complexity)\n");
3011 rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST
"flops",
3014 ERRPRINTF(
"Error @ xmlTextWriterWriteFormatElement (flops)\n");
3018 rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST
"seconds",
3021 ERRPRINTF(
"Error @ xmlTextWriterWriteFormatElement (seconds)\n");
3026 rc = xmlTextWriterStartElement(writer, BAD_CAST
"used_time");
3028 ERRPRINTF(
"Error @ xmlTextWriterStartElement (used_time)\n");
3035 rc = xmlTextWriterEndElement(writer);
3037 ERRPRINTF(
"Error @ xmlTextWriterEndElement\n");
3042 rc = xmlTextWriterStartElement(writer, BAD_CAST
"wall_time");
3044 ERRPRINTF(
"Error @ xmlTextWriterStartElement (wall_time)\n");
3051 rc = xmlTextWriterEndElement(writer);
3053 ERRPRINTF(
"Error @ xmlTextWriterEndElement\n");
3058 rc = xmlTextWriterEndElement(writer);
3060 ERRPRINTF(
"Error @ xmlTextWriterEndElement\n");
3081 rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST
"secs",
3084 ERRPRINTF(
"Error @ xmlTextWriterWriteFormatElement (secs)\n");
3089 rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST
"usecs",
3092 ERRPRINTF(
"Error @ xmlTextWriterWriteFormatElement (usecs)\n");