28aca4e1902f3a9ebcda3e2a8c839db30b0f3861
[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 // point to point communication data
20 class LBCommData {
21
22 friend class LBCommTable;
23
24 public:
25   LBCommData(int _src_proc, LDOMid _destOM, LDObjid _destObj, int _destObjProc) {
26     src_proc = _src_proc;
27     destObj.init_objmsg(_destOM, _destObj, _destObjProc);
28     n_messages = 0;
29     n_bytes = 0;
30     mykey = compute_key();
31   };
32
33   LBCommData(LDObjHandle _srcObj, LDOMid _destOM, LDObjid _destObj, int _destObjProc) {
34     src_proc = -1;
35     srcObj = _srcObj;
36     destObj.init_objmsg(_destOM, _destObj, _destObjProc);
37     n_messages = 0;
38     n_bytes = 0;
39     mykey = compute_key();
40   };
41
42   // multicast
43   LBCommData(LDObjHandle _srcObj, LDOMid _destOM, LDObjid *_destObjs, int _nobjs) {
44     src_proc = -1;
45     srcObj = _srcObj;
46     destObj.init_mcastmsg(_destOM, _destObjs, _nobjs);
47     n_messages = 0;
48     n_bytes = 0;
49     mykey = compute_key();
50   };
51
52   LBCommData(const LBCommData& d) {
53     src_proc = d.src_proc;
54     if (!from_proc()) {
55       srcObj = d.srcObj;
56 //      srcOM = d.srcOM;
57     }
58     destObj = d.destObj;
59     n_messages = d.n_messages;
60     n_bytes = d.n_bytes;
61     mykey = d.mykey;
62   };
63
64   ~LBCommData() { };
65
66   LBCommData& operator=(const LBCommData& d) {
67     src_proc = d.src_proc;
68     if (!from_proc()) { 
69       srcObj = d.srcObj;
70 //      srcOM = d.srcOM;
71     }
72     destObj = d.destObj;
73     n_messages = d.n_messages;
74     n_bytes = d.n_bytes;
75     mykey = d.mykey;
76     return *this;
77   };
78
79   void addMessage(int bytes, int nMsgs=1) {
80     n_messages += nMsgs;
81     n_bytes += bytes;
82   };
83
84   inline int key() const { return mykey; };
85   CmiBool equal(const LBCommData &_d2) const;
86
87   inline int from_proc() const { return (src_proc != -1); }
88 private:
89   LBCommData(): mykey(0), src_proc(0), n_messages(0), n_bytes(0) {};
90   
91   int compute_key();
92   int hash(const int i, const int m) const;
93
94   int mykey;
95   int src_proc;
96   LDObjHandle srcObj;
97   LDCommDesc   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 /*@}*/