a897f47d589c55650f0ce7ec3a453ab5db0b32f9
[charm.git] / src / ck-core / debug-message.C
1 #include <converse.h>
2 #include <charm.h>
3 #ifdef CMK_OPTIMIZE
4 #define NDEBUG
5 #endif
6 #include <assert.h>
7 #include "envelope.h"
8 #include <stdio.h>
9 #include <stdlib.h>
10 #include <string.h>
11 #include "fifo.h"
12 #include "queueing.h"
13
14 #if CMK_DEBUG_MODE
15
16 #define NUM_MESSAGES 100
17
18 extern "C" void  CpdInitializeHandlerArray(void);
19 extern void handlerArrayRegister(int, hndlrIDFunction, hndlrIDFunction);
20 extern char* genericViewMsgFunction(char *msg, int type);
21 extern char* getMsgListSched(void);
22 extern char* getMsgListPCQueue(void);
23 extern char* getMsgListFIFO(void);
24 extern char* getMsgListDebug(void);
25 extern char* getMsgContentsSched(int index);
26 extern char* getMsgContentsPCQueue(int index);
27 extern char* getMsgContentsFIFO(int index);
28 extern char* getMsgContentsDebug(int index);
29 extern void  msgListCache(void);
30 extern void  msgListCleanup(void);
31 extern int   getCharmMsgHandlers(int *handleArray);
32 extern char* getEnvInfo(envelope *env);
33 extern char* getSymbolTableInfo(void);
34
35 extern "C" void  CqsEnumerateQueue(Queue, void ***);
36 extern "C" void  FIFO_Enumerate(FIFO_QUEUE*, void***);
37
38 CpvDeclare(handlerType, handlerArray);
39
40 void **schedQueue=0;
41 void **FIFOQueue=0;
42 void **DQueue=0;
43
44 int schedIndex;
45 int debugIndex;
46 int FIFOIndex;
47
48 void msgListCleanup(void)
49 {
50   if(schedQueue != 0) CmiFree(schedQueue);
51   if(FIFOQueue != 0) free(FIFOQueue);
52   if(DQueue != 0) free(DQueue);
53   schedIndex = 0;
54   FIFOIndex = 0;
55   debugIndex = 0;
56
57   schedQueue = 0;
58   FIFOQueue = 0;
59   DQueue = 0;
60 }
61
62 void msgListCache(void)
63 {
64   CqsEnumerateQueue((Queue)CpvAccess(CsdSchedQueue), &schedQueue);
65   FIFO_Enumerate((FIFO_QUEUE *)CpvAccess(CmiLocalQueue), &FIFOQueue);
66   schedIndex = 0;
67   FIFOIndex = 0;
68   debugIndex = 0;
69 }
70
71 extern "C"
72 void CpdInitializeHandlerArray(void){
73   int i;
74
75   CpvInitialize(handlerType, handlerArray);
76   for(i = 0; i < MAX_NUM_HANDLERS; i++){
77     CpvAccess(handlerArray)[i][0] = 0;
78     CpvAccess(handlerArray)[i][1] = 0;
79   }
80 }
81
82 void handlerArrayRegister(int hndlrID, hndlrIDFunction fHeader, 
83                                        hndlrIDFunction fContent){
84     CpvAccess(handlerArray)[hndlrID][0] = fHeader;
85     CpvAccess(handlerArray)[hndlrID][1] = fContent;
86 }
87
88 static const char *HeaderUnknownFormat =
89 "<HEADER>:Unknown Format #"
90 ;
91
92 // type = 0 header required
93 //      = 1 contents required
94 char* genericViewMsgFunction(char *msg, int type){
95   int hndlrID;
96   char *unknownContentsMsg;
97   char *unknownFormatMsg;
98   char *temp;
99   hndlrIDFunction f;
100
101   hndlrID = CmiGetHandler(msg);
102   f = CpvAccess(handlerArray)[hndlrID][type];
103   if(f == 0){
104     // Undefined Content/Header function
105     temp = (char *)malloc(strlen(HeaderUnknownFormat)+1);
106     strcpy(temp, HeaderUnknownFormat);
107     return(temp);
108   } else{
109     return((*f)(msg));
110   }
111 }
112
113 char* getMsgListSched(void)
114 {
115   int ending;
116   int count = 0;
117   char *list;
118   char t[10];
119   int maxLength;
120
121   ending = NUM_MESSAGES;
122   if ( (ending + schedIndex) > ((Queue)(CpvAccess(CsdSchedQueue)))->length) {
123     ending = (((Queue)(CpvAccess(CsdSchedQueue)))->length) - schedIndex;
124   }
125   maxLength = ending * sizeof(char) * 20 + 1;
126   list = (char *)malloc(maxLength);
127   strcpy(list, "");
128
129   for(int i = schedIndex; i < ending + schedIndex; i++){
130     char *temp = genericViewMsgFunction((char *)schedQueue[i], 0);
131     if(strlen(list) + strlen(temp) + 10 > maxLength){ 
132       free(temp);
133       break;
134     }
135     strcat(list, temp);
136     strcat(list, "#");
137     sprintf(t, "%d", i);
138     strcat(list, t);
139     strcat(list, "#");
140     count++;
141     free(temp);
142   }
143   schedIndex += count;
144   return(list);
145 }
146
147 static const char *NotImpl = "Not Implemented";
148
149 char* getMsgListPCQueue(void)
150 {
151   char *list;
152
153   list = (char *)malloc(strlen(NotImpl)+1);
154   strcpy(list, NotImpl);
155   return(list);
156 }
157
158 char* getMsgListFIFO(void)
159 {
160   int ending;
161   char *temp;
162   int count = 0;
163   char *list;
164   char t[10];
165   int maxLength;
166
167   ending = NUM_MESSAGES;
168   if ( (ending+FIFOIndex) > ((FIFO_QUEUE *)(CpvAccess(CmiLocalQueue)))->fill) {
169     ending = (((FIFO_QUEUE *)(CpvAccess(CmiLocalQueue)))->fill) - FIFOIndex;
170   }
171   maxLength = ending * sizeof(char) * 20 + 1;
172   list = (char *)malloc(maxLength);
173   strcpy(list, "");
174
175   for(int i=FIFOIndex; i < FIFOIndex+ending; i++){
176     temp = genericViewMsgFunction((char *)FIFOQueue[i], 0);
177     if(strlen(list) + strlen(temp) + 10 > maxLength){
178       free(temp); 
179       break;
180     }
181     strcat(list, temp);
182     strcat(list, "#");
183     sprintf(t, "%d", i);
184     strcat(list, t);
185     strcat(list, "#");
186     count++;
187     free(temp);
188   }
189   FIFOIndex += count;
190   return(list);
191 }
192
193 char* getMsgListDebug(void)
194 {
195   int ending;
196   int count = 0;
197   char *list;
198   char t[10];
199   int maxLength;
200   char *temp;
201
202   ending = NUM_MESSAGES;
203   if ( (ending+debugIndex) > ((FIFO_QUEUE *)(CpvAccess(debugQueue)))->fill) {
204       ending = (((FIFO_QUEUE *)(CpvAccess(debugQueue)))->fill) - debugIndex;
205   }
206   maxLength = ending * sizeof(char) * 20 + 1;
207   list = (char *)malloc(maxLength);
208   strcpy(list, "");
209
210   if(DQueue != 0) free(DQueue);
211   FIFO_Enumerate((FIFO_QUEUE *)CpvAccess(debugQueue), &DQueue);
212
213   for(int i=debugIndex; i < ending+debugIndex; i++){
214     temp = genericViewMsgFunction((char *)DQueue[i], 0);
215     if(strlen(list) + strlen(temp) + 10 > maxLength){ 
216       free(temp);
217       break;
218     }
219     strcat(list, temp);
220     strcat(list, "#");
221     sprintf(t, "%d", i);
222     strcat(list, t);
223     strcat(list, "#");
224     count++;
225     free(temp);
226   }
227   debugIndex += count;
228   return(list);
229 }
230
231 char* getMsgContentsSched(int index)
232 {
233   return genericViewMsgFunction((char *)schedQueue[index], 1);
234 }
235
236 char* getMsgContentsPCQueue(int index)
237 {
238   char *temp;
239   temp = (char *)malloc(strlen(NotImpl)+1);
240   strcpy(temp, NotImpl);
241   return(temp);
242 }
243
244 char* getMsgContentsFIFO(int index)
245 {
246   return genericViewMsgFunction((char *)FIFOQueue[index], 1);
247 }
248
249 char* getMsgContentsDebug(int index)
250 {
251   return genericViewMsgFunction((char *)DQueue[index], 1);
252 }
253
254 #endif