important changes:
[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) {
26     src_proc = _src_proc;
27     destObj.init_objmsg(_destOM, _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     srcObj = _srcObj;
36     destObj.init_objmsg(_destOM, _destObj);
37     n_messages = 0;
38     n_bytes = 0;
39     mykey = compute_key();
40   };
41
42   LBCommData(const LBCommData& d) {
43     src_proc = d.src_proc;
44     if (!from_proc()) {
45       srcObj = d.srcObj;
46 //      srcOM = d.srcOM;
47     }
48     destObj = d.destObj;
49     n_messages = d.n_messages;
50     n_bytes = d.n_messages;
51     mykey = d.mykey;
52   };
53
54   ~LBCommData() { };
55
56   LBCommData& operator=(const LBCommData& d) {
57     src_proc = d.src_proc;
58     if (!from_proc()) { 
59       srcObj = d.srcObj;
60 //      srcOM = d.srcOM;
61     }
62     destObj = d.destObj;
63     n_messages = d.n_messages;
64     n_bytes = d.n_messages;
65     mykey = d.mykey;
66     return *this;
67   };
68
69   void addMessage(int bytes) {
70     n_messages++;
71     n_bytes += bytes;
72   };
73
74   inline int key() const { return mykey; };
75   CmiBool equal(const LBCommData _d2) const;
76
77   inline int from_proc() const { return (src_proc != -1); }
78 private:
79   LBCommData() {};
80   
81   int compute_key();
82   int hash(const int i, const int m) const;
83
84   int mykey;
85   int src_proc;
86   LDObjHandle srcObj;
87   LDCommDesc   destObj;
88   int n_messages;
89   int n_bytes;
90 };
91
92 class LBCommTable {
93 public:
94
95   LBCommTable() {
96     NewTable(initial_sz);
97   };
98
99   ~LBCommTable() {
100     delete [] set;
101     delete [] state;
102   };
103
104   LBCommData* HashInsert(const LBCommData &data);
105   LBCommData* HashInsertUnique(const LBCommData &data);
106   LBCommData* HashSearch(const LBCommData &data);
107   int CommCount() { return in_use; };
108   void GetCommData(LDCommData* data);
109         
110 private:
111   void NewTable(int _sz) {
112     set = new LBCommData[_sz];
113     state = new TableState[_sz];
114     cur_sz = _sz;
115     in_use = 0;
116     for(int i=0; i < _sz; i++)
117       state[i] = nil;
118   };
119   
120   void Resize();
121
122   enum { initial_sz = 10000 };
123   enum TableState { nil, InUse } ;
124   LBCommData* set;
125   TableState* state;
126   int cur_sz;
127   int in_use;
128 public:
129   int useMem() { return cur_sz*(sizeof(LBCommData) + sizeof(TableState)) + sizeof(LBCommTable); }
130 };
131
132
133 #endif
134
135 /*@}*/