--- /dev/null
+#include "functional_trace.h"\r
+\r
+functional_trace dol_functional_trace;\r
+\r
+functional_trace::functional_trace()\r
+{\r
+ //DBGPRINT;\r
+ strcpy(trace_file_name, "trace1.txt");\r
+ event_num = 0;\r
+ file_index = 1;\r
+}\r
+\r
+functional_trace::~functional_trace()\r
+{\r
+ //DBGPRINT;\r
+ char temp[NAME_LENGTH];\r
+#ifdef INCLUDE_TRACE\r
+ strcpy(trace_file_name, "trace");\r
+ sprintf(temp, "%d", file_index);\r
+ strcat(trace_file_name, temp);\r
+ strcat(trace_file_name, ".txt");\r
+ write_to_file(trace_file_name);\r
+ free_traces();\r
+ //printf("The traces in the memory have been freed\n");\r
+#endif\r
+ //DBGPRINT;\r
+}\r
+\r
+void functional_trace::add_event_node(TRACE_EVENT &trace_event)\r
+{\r
+ Process_Trace *process_trace_ptr;\r
+ char temp[NAME_LENGTH];\r
+\r
+ process_trace_ptr = get_process_trace(trace_event.process_name);\r
+ if (process_trace_ptr == NULL)\r
+ {\r
+ process_trace_ptr = new Process_Trace(trace_event.process_name);\r
+ _list_process_trace.push_back(process_trace_ptr);\r
+ }\r
+\r
+ process_trace_ptr->add_entry(&trace_event);\r
+\r
+ event_num++;\r
+ if (event_num > 8000000)\r
+ {\r
+ strcpy(trace_file_name, "trace");\r
+ sprintf(temp, "%d", file_index);\r
+ strcat(trace_file_name, temp);\r
+ strcat(trace_file_name, ".txt");\r
+ write_to_file(trace_file_name);\r
+ free_traces();\r
+ file_index++;\r
+ event_num = 0;\r
+ }\r
+\r
+}\r
+\r
+/*\r
+void functional_trace::add_event_node(TRACE_EVENT &trace_event)\r
+{\r
+ XMLNode process_node;\r
+ char temp[NAME_LENGTH];\r
+ process_node = xml_main_node.getChildNode(trace_event.process_name);\r
+\r
+ if(process_node.isEmpty())\r
+ {\r
+ process_node = xml_main_node.addChild(trace_event.process_name);\r
+ }\r
+\r
+ XMLNode event_node = process_node.addChild("event");\r
+\r
+ event_node.addAttribute("type", trace_event_type_string[trace_event.event_type]);\r
+\r
+ if(trace_event.event_type == COMPUTATION_EVENT)\r
+ {\r
+\r
+ sprintf(temp, "%d", trace_event.computation_start_line);\r
+ event_node.addAttribute("start", temp);\r
+ sprintf(temp, "%d", trace_event.computation_end_line);\r
+ event_node.addAttribute("end", temp);\r
+ }\r
+ else if((trace_event.event_type == READ_EVENT) || (trace_event.event_type == WRITE_EVENT))\r
+ {\r
+ sprintf(temp, "%d", trace_event.data_num);\r
+ event_node.addAttribute("data_num", temp);\r
+ event_node.addAttribute("channel_name", trace_event.channel_name);\r
+ }\r
+}\r
+*/\r
+\r
+void functional_trace::create_computation_event(const char *process_name, int start_line, int end_line)\r
+{\r
+ TRACE_EVENT trace_event;\r
+\r
+ trace_event.event_type = COMPUTATION_EVENT;\r
+ strcpy(trace_event.process_name, process_name);\r
+ trace_event.computation_start_line = start_line;\r
+ trace_event.computation_end_line = end_line;\r
+ strcpy(trace_event.channel_name, "");\r
+ trace_event.data_num = 0;\r
+\r
+ add_event_node(trace_event);\r
+}\r
+\r
+void functional_trace::create_read_event(const char *process_name, int data_num, const char *channel_name)\r
+{\r
+ //DBGPRINT;\r
+ TRACE_EVENT trace_event;\r
+ trace_event.event_type = READ_EVENT;\r
+ strcpy(trace_event.process_name, process_name);\r
+ trace_event.data_num = data_num;\r
+ strcpy(trace_event.channel_name, channel_name);\r
+\r
+ trace_event.computation_start_line = 0;\r
+ trace_event.computation_end_line = 0;\r
+\r
+ add_event_node(trace_event);\r
+}\r
+\r
+void functional_trace::create_write_event(const char *process_name, int data_num, const char *channel_name)\r
+{\r
+ //DBGPRINT;\r
+ TRACE_EVENT trace_event;\r
+ trace_event.event_type = WRITE_EVENT;\r
+ strcpy(trace_event.process_name, process_name);\r
+ trace_event.data_num = data_num;\r
+ strcpy(trace_event.channel_name, channel_name);\r
+\r
+ trace_event.computation_start_line = 0;\r
+ trace_event.computation_end_line = 0;\r
+\r
+ add_event_node(trace_event);\r
+}\r
+\r
+\r
+Process_Trace *functional_trace::get_process_trace(const char *process_name)\r
+{\r
+ Process_Trace *process_trace_ptr;\r
+\r
+ for (_iter_process_trace = _list_process_trace.begin();\r
+ _iter_process_trace != _list_process_trace.end();\r
+ _iter_process_trace++)\r
+ {\r
+ process_trace_ptr = *_iter_process_trace;\r
+\r
+ if (strcmp(process_trace_ptr->get_name(), process_name) == 0)\r
+ {\r
+ break;\r
+ }\r
+ }\r
+\r
+ if (_iter_process_trace == _list_process_trace.end())\r
+ {\r
+ process_trace_ptr = NULL;\r
+ }\r
+\r
+ return process_trace_ptr;\r
+}\r
+\r
+void functional_trace::free_traces()\r
+{\r
+ Process_Trace *process_trace_ptr;\r
+\r
+ for (_iter_process_trace = _list_process_trace.begin();\r
+ _iter_process_trace != _list_process_trace.end();\r
+ _iter_process_trace++)\r
+ {\r
+ process_trace_ptr = *_iter_process_trace;\r
+ delete process_trace_ptr;\r
+ }\r
+ _list_process_trace.clear();\r
+}\r
+\r
+int functional_trace::write_to_file(const char *trace_file_name) {\r
+ int ret = -1;\r
+ Process_Trace *process_trace_ptr;\r
+ FILE *trace_file_handle;\r
+ EVENT_ENTRY *event_entry_ptr;\r
+\r
+ if ((trace_file_handle = fopen(trace_file_name, "w")) == NULL) {\r
+ ret = -1;\r
+ printf("Can not create file: %s\n", trace_file_name);\r
+ goto end1;\r
+ }\r
+\r
+ for (_iter_process_trace = _list_process_trace.begin();\r
+ _iter_process_trace != _list_process_trace.end();\r
+ _iter_process_trace++) {\r
+ process_trace_ptr = *_iter_process_trace;\r
+ fprintf(trace_file_handle, "$ %s\n", process_trace_ptr->get_name());\r
+\r
+ event_entry_ptr = process_trace_ptr->get_head_entry();\r
+ while (event_entry_ptr != NULL) {\r
+ if (event_entry_ptr->event_type == COMPUTATION_EVENT) {\r
+ if (event_entry_ptr->end_line!=(event_entry_ptr->start_line+1))\r
+ fprintf(trace_file_handle, "c %d %d\n",\r
+ event_entry_ptr->start_line,\r
+ event_entry_ptr->end_line);\r
+ }\r
+ else if (event_entry_ptr->event_type == WRITE_EVENT) {\r
+ fprintf(trace_file_handle, "w %d %s\n",\r
+ event_entry_ptr->data_num,\r
+ event_entry_ptr->channel_name);\r
+ }\r
+ else if (event_entry_ptr->event_type == READ_EVENT) {\r
+ fprintf(trace_file_handle, "r %d %s\n",\r
+ event_entry_ptr->data_num,\r
+ event_entry_ptr->channel_name);\r
+ }\r
+\r
+ event_entry_ptr = event_entry_ptr->next;\r
+ }\r
+ }\r
+\r
+ fflush(trace_file_handle);\r
+ fseek(trace_file_handle, 0, SEEK_SET);\r
+ fclose(trace_file_handle);\r
+\r
+end1:\r
+ return ret;\r
+}\r
+\r
+Process_Trace::Process_Trace(const char *process_name)\r
+{\r
+ strcpy(_process_name, process_name);\r
+ _head = NULL;\r
+ _tail = NULL;\r
+}\r
+\r
+Process_Trace::~Process_Trace()\r
+{\r
+ EVENT_ENTRY *temp;\r
+\r
+ while (_head != NULL)\r
+ {\r
+ temp = _head;\r
+ _head = _head->next;\r
+ if (temp->channel_name != NULL)\r
+ delete [] temp->channel_name;\r
+ delete temp;\r
+ }\r
+}\r
+\r
+const char *Process_Trace::get_name()\r
+{\r
+ return _process_name;\r
+}\r
+\r
+EVENT_ENTRY *Process_Trace::get_head_entry()\r
+{\r
+ return _head;\r
+}\r
+\r
+int Process_Trace::add_entry(TRACE_EVENT *trace_event_ptr)\r
+{\r
+ int ret = 0;\r
+ EVENT_ENTRY *temp;\r
+ int channel_name_length;\r
+\r
+ temp = new EVENT_ENTRY;\r
+ memset(temp, 0, sizeof(EVENT_ENTRY));\r
+\r
+ temp->event_type = trace_event_ptr->event_type;\r
+ temp->start_line = trace_event_ptr->computation_start_line;\r
+ temp->end_line = trace_event_ptr->computation_end_line;\r
+ temp->data_num = trace_event_ptr->data_num;\r
+\r
+ channel_name_length = strlen(trace_event_ptr->channel_name);\r
+ if (channel_name_length != 0)\r
+ {\r
+ temp->channel_name = new char[channel_name_length + 1];\r
+ strcpy(temp->channel_name, trace_event_ptr->channel_name);\r
+ }\r
+ else\r
+ {\r
+ temp->channel_name = NULL;\r
+ }\r
+\r
+ if (_head == NULL)\r
+ {\r
+ _head = temp;\r
+ _tail = temp;\r
+ temp->next = NULL;\r
+ }\r
+ else\r
+ {\r
+ _tail->next = temp;\r
+ _tail = temp;\r
+ temp->next = NULL;\r
+ }\r
+\r
+ return ret;\r
+}\r
+\r
+\r