4d359ebad7a9f746d5e913e6de9d1778d88ca348
[charm.git] / src / ck-ldb / LBComm.h
1 /*****************************************************************************
2  * $Source$
3  * $Author$
4  * $Date$
5  * $Revision$
6  *****************************************************************************/
7
8 /**
9  * \addtogroup CkLdb
10 */
11 /*@{*/
12
13 #ifndef LBCOMM_H
14 #define LBCOMM_H
15
16 #include "converse.h"
17 #include "lbdb.h"
18
19 class LBCommData {
20
21 friend class LBCommTable;
22
23 public:
24   LBCommData(int _src_proc, LDOMid _destOM, LDObjid _destObj) {
25     src_proc = _src_proc;
26     destOM = _destOM;
27     destObj = _destObj;
28     n_messages = 0;
29     n_bytes = 0;
30     mykey = compute_key();
31   };
32
33   LBCommData(LDObjHandle _srcObj, LDOMid _destOM, LDObjid _destObj) {
34     src_proc = -1;
35 /*
36     srcObj = _srcObj.id;
37     srcOM = _srcObj.omhandle.id;
38 */
39     srcObj = _srcObj;
40     destOM = _destOM;
41     destObj = _destObj;
42     n_messages = 0;
43     n_bytes = 0;
44     mykey = compute_key();
45   };
46
47   LBCommData(const LBCommData& d) {
48     src_proc = d.src_proc;
49     if (!from_proc()) {
50       srcObj = d.srcObj;
51 //      srcOM = d.srcOM;
52     }
53     destOM = d.destOM;
54     destObj = d.destObj;
55     n_messages = d.n_messages;
56     n_bytes = d.n_messages;
57     mykey = d.mykey;
58   };
59
60   ~LBCommData() { };
61
62   LBCommData& operator=(const LBCommData& d) {
63     src_proc = d.src_proc;
64     if (!from_proc()) { 
65       srcObj = d.srcObj;
66 //      srcOM = d.srcOM;
67     }
68     destOM = d.destOM;
69     destObj = d.destObj;
70     n_messages = d.n_messages;
71     n_bytes = d.n_messages;
72     mykey = d.mykey;
73     return *this;
74   };
75
76   void addMessage(int bytes) {
77     n_messages++;
78     n_bytes += bytes;
79   };
80
81   inline int key() const { return mykey; };
82   CmiBool equal(const LBCommData _d2) const;
83
84   inline int from_proc() const { return (src_proc != -1); }
85 private:
86   LBCommData() {};
87   
88   int compute_key();
89   int hash(const int i, const int m) const;
90
91   int mykey;
92   int src_proc;
93   LDObjHandle srcObj;
94 //  LDOMid srcOM;
95 //  LDObjid srcObj;
96   LDOMid destOM;
97   LDObjid destObj;
98   int n_messages;
99   int n_bytes;
100 };
101
102 class LBCommTable {
103 public:
104
105   LBCommTable() {
106     NewTable(initial_sz);
107   };
108
109   ~LBCommTable() {
110     delete [] set;
111     delete [] state;
112   };
113
114   LBCommData* HashInsert(const LBCommData data);
115   LBCommData* HashInsertUnique(const LBCommData data);
116   LBCommData* HashSearch(const LBCommData data);
117   int CommCount() { return in_use; };
118   void GetCommData(LDCommData* data);
119         
120 private:
121   void NewTable(int _sz) {
122     set = new LBCommData[_sz];
123     state = new TableState[_sz];
124     cur_sz = _sz;
125     in_use = 0;
126     for(int i=0; i < _sz; i++)
127       state[i] = nil;
128   };
129   
130   void Resize();
131
132   enum { initial_sz = 10000 };
133   enum TableState { nil, InUse } ;
134   LBCommData* set;
135   TableState* state;
136   int cur_sz;
137   int in_use;
138 public:
139   int useMem() { return cur_sz*(sizeof(LBCommData) + sizeof(TableState)) + sizeof(LBCommTable); }
140 };
141
142
143 #endif
144
145 /*@}*/