dol: initial dol commit
[jump.git] / dol / src / dol / visitor / hds / lib / functional_trace.cpp
diff --git a/dol/src/dol/visitor/hds/lib/functional_trace.cpp b/dol/src/dol/visitor/hds/lib/functional_trace.cpp
new file mode 100644 (file)
index 0000000..efca06c
--- /dev/null
@@ -0,0 +1,295 @@
+#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