ea1d0e3138965d6dadf2213228cdaea30ea679bb
[charm.git] / src / ck-core / debug-object.C
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <string.h>
4 #include <charm++.h>
5
6 #include "debug-object.h"
7
8 #if CMK_DEBUG_MODE
9
10 HashTable* objectTable;
11
12 void putObject(Chare* charePtr)
13 {
14   objectTable->putObject(charePtr);
15 }
16
17 void removeObject(Chare* charePtr)
18 {
19   objectTable->removeObject(charePtr);
20 }
21
22 char* getObjectList(void)
23 {
24   return(objectTable->getObjectList());
25 }
26
27 char* getObjectContents(int chareIndex)
28 {
29   return(objectTable->getObjectContents(chareIndex));
30 }
31
32 HashTable::HashTable()
33 {
34   for(int i = 0; i < PRIME; i++)
35     array[i] = 0;
36 }
37
38 HashTable::~HashTable()
39 {
40   struct HashTableElement *node, *temp;
41
42   for(int i = 0; i < PRIME; i++){
43     node = array[i];
44     while(node != 0){
45       temp = node;
46       node = node -> next;
47       free(temp);
48     }
49   }
50 }
51
52 void HashTable::putObject(Chare* charePtr)
53 {
54   struct HashTableElement *node;
55   int pigeonHole;
56   int chareIndex;
57   
58   chareIndex = (size_t)charePtr;
59   node = (struct HashTableElement *)malloc(sizeof(struct HashTableElement));
60   node->charePtr = charePtr;
61   node->chareIndex = chareIndex;
62   pigeonHole = chareIndex % PRIME;
63   node->next = array[pigeonHole];
64   array[pigeonHole] = node;
65 }
66
67 void HashTable::removeObject(Chare* charePtr)
68 {
69   int pigeonHole;
70   struct HashTableElement *node, *prev;
71   int chareIndex;
72   
73   chareIndex = (size_t)charePtr;
74   pigeonHole = chareIndex % PRIME;
75
76   prev = 0;
77   node = array[pigeonHole];
78   while(node != 0){
79     if(node -> chareIndex == chareIndex){
80       if(prev == 0){
81         array[pigeonHole] = node->next;
82       } else {
83         prev -> next = node -> next;
84       }
85       free(node);
86       return;
87     }
88     prev = node;
89     node = node -> next;
90   }
91   CkError("Erroneous chareIndex supplied in removeObject()\n"); 
92 }
93
94 char* HashTable::getObjectList(void)
95 {
96   struct HashTableElement *node; 
97   char *temp;
98   char *list, *oldlist;
99   char t[10];
100   int maxLength = PRIME * 20 * sizeof(char);
101   
102   list = (char *)malloc(maxLength);
103   strcpy(list, "");
104   for(int i = 0; i < PRIME; i++){
105     node = array[i];
106     while(node != 0){
107       if ((node -> chareIndex != 0) && (node -> charePtr != 0)){
108         temp = (node -> charePtr) -> showHeader();
109         if((strlen(list) + strlen(temp) + 10) > maxLength){
110           maxLength *= 2;
111           oldlist = list;
112           list = (char *)malloc(maxLength);
113           strcpy(list, oldlist);
114           free(oldlist);
115         }
116         strcat(list, temp);
117         strcat(list, "#");
118         sprintf(t, "%d", (node -> chareIndex));
119         strcat(list, t);
120         strcat(list, "#");
121         free(temp);
122       }
123       node = node -> next;
124     }
125   }
126   return(list);
127 }
128
129 char* HashTable::getObjectContents(int chareIndex)
130 {
131   struct HashTableElement *node;
132   
133   node = array[chareIndex % PRIME];
134   while(node != 0){
135     if(node -> chareIndex == chareIndex)
136       return((node -> charePtr) -> showContents());
137     node = node -> next;
138   }
139   
140   CkError("Erroneous chareIndex supplied in getObjectCOntents()\n");
141 }
142
143 extern "C"
144 void CpdInitializeObjectTable(void)
145 {
146   objectTable = new HashTable();
147 }
148
149 #endif