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