Code clean
[IRC.git] / Robust / src / Runtime / bamboo / multicoretaskprofile.h
1 #ifndef BAMBOO_MULTICORE_TASK_PROFILE_H
2 #define BAMBOO_MULTICORE_TASK_PROFILE_H
3 #include "multicore.h"
4
5 #ifdef TASK
6 // data structures for profile mode
7 #ifdef PROFILE
8 #define TASKINFOLENGTH 3000
9
10 typedef struct task_info {
11   char* taskName;
12   unsigned long long startTime;
13   unsigned long long endTime;
14   unsigned long long exitIndex;
15   struct Queue * newObjs;
16 } TaskInfo;
17
18 TaskInfo * taskInfoArray[TASKINFOLENGTH];
19 int taskInfoIndex;
20 bool taskInfoOverflow;
21 volatile int profilestatus[NUMCORESACTIVE]; // records status of each core
22                                             // 1: running tasks
23                                             // 0: stall
24 #ifdef PROFILE_INTERRUPT
25 #define INTERRUPTINFOLENGTH 50
26 typedef struct interrupt_info {
27   unsigned long long startTime;
28   unsigned long long endTime;
29 } InterruptInfo;
30
31 InterruptInfo * interruptInfoArray[INTERRUPTINFOLENGTH];
32 int interruptInfoIndex;
33 bool interruptInfoOverflow;
34 #endif
35
36 void outputProfileData();
37 void inittaskprofiledata();
38
39 INLINE static void setTaskExitIndex(int index) {
40   taskInfoArray[taskInfoIndex]->exitIndex = index;
41 }
42
43 INLINE static void addNewObjInfo(void * nobj) {
44   if(taskInfoArray[taskInfoIndex]->newObjs == NULL) {
45     taskInfoArray[taskInfoIndex]->newObjs = createQueue();
46   }
47   addNewItem(taskInfoArray[taskInfoIndex]->newObjs, nobj);
48 }
49
50 INLINE static void profileTaskStart(char * taskname) {
51   if(!taskInfoOverflow) {
52     TaskInfo* taskInfo = RUNMALLOC(sizeof(struct task_info));
53     taskInfoArray[taskInfoIndex] = taskInfo;
54     taskInfo->taskName = taskname;
55     taskInfo->startTime = BAMBOO_GET_EXE_TIME();
56     taskInfo->endTime = -1;
57     taskInfo->exitIndex = -1;
58     taskInfo->newObjs = NULL;
59   }
60 }
61
62 INLINE staitc void profileTaskEnd() {
63   if(!taskInfoOverflow) {
64     taskInfoArray[taskInfoIndex]->endTime = BAMBOO_GET_EXE_TIME();
65     taskInfoIndex++;
66     if(taskInfoIndex == TASKINFOLENGTH) {
67       taskInfoOverflow = true;
68     }
69   }
70 }
71
72 #ifdef PROFILE_INTERRUPT
73 INLINE static void profileInterruptStart_I(void) {
74   if(!interruptInfoOverflow) {
75     InterruptInfo* intInfo = RUNMALLOC_I(sizeof(struct interrupt_info));
76     interruptInfoArray[interruptInfoIndex] = intInfo;
77     intInfo->startTime = BAMBOO_GET_EXE_TIME();
78     intInfo->endTime = -1;
79   }
80 }
81
82 INLINE static void profileInterruptEnd_I(void) {
83   if(!interruptInfoOverflow) {
84     interruptInfoArray[interruptInfoIndex]->endTime=BAMBOO_GET_EXE_TIME();
85     interruptInfoIndex++;
86     if(interruptInfoIndex == INTERRUPTINFOLENGTH) {
87       interruptInfoOverflow = true;
88     }
89   }
90 }
91 #endif // PROFILE_INTERRUPT
92
93 #define INIT_TASKPROFILE_DATA() inittaskprofiledata()
94 #define PROFILE_TASK_START(s) profileTaskStart(s)
95 #define PROFILE_TASK_END() profileTaskEnd()
96 #ifdef PROFILE_INTERRUPT
97 INLINE void profileInterruptStart_I(void);
98 INLINE void profileInterruptEnd_I(void);
99
100 #define PROFILE_INTERRUPT_START() profileInterruptStart_I()
101 #define PROFILE_INTERRUPT_END() profileInterruptEnd_I()
102 #else
103 #define PROFILE_INTERRUPT_START() 
104 #define PROFILE_INTERRUPT_END() 
105 #endif
106 #else // PROFILE
107 #define INIT_TASKPROFILE_DATA() 
108 #define PROFILE_TASK_START(s)
109 #define PROFILE_TASK_END()
110 #define PROFILE_INTERRUPT_START() 
111 #define PROFILE_INTERRUPT_END() 
112 #endif // PROFILE
113 #else // TASK
114 #define INIT_TASKPROFILE_DATA() 
115 #define PROFILE_TASK_START(s)
116 #define PROFILE_TASK_END()
117 #define PROFILE_INTERRUPT_START() 
118 #define PROFILE_INTERRUPT_END()
119 #endif // TASK
120 #endif // BAMBOO_MULTICORE_TASK_PROFILE_H