Making msgpacker faster by reducing short envelope size and making fewer calls to...
[charm.git] / src / ck-com / MsgPacker.C
1 #include "MsgPacker.h"
2
3 CkpvExtern(int, RecvCombinedShortMsgHdlrIdx);
4
5 MsgPacker::MsgPacker(){
6     nShortMsgs = 0;
7     msgList = 0;    
8 }
9
10 MsgPacker::MsgPacker(CkQ<CharmMessageHolder *> &msgq, int n_msgs){
11
12     CkAssert(n_msgs < 65536);  //16 bit field for num messages
13
14     nShortMsgs = n_msgs;
15     msgList = new short_envelope[n_msgs];    
16
17     for(int count = 0; count < n_msgs; count ++){
18         CharmMessageHolder *cmsg = msgq.deq();
19         envelope *env = (envelope *)UsrToEnv(cmsg->getCharmMessage());
20         CkPackMessage(&env);
21
22         if(count == 0) {
23             aid = env->getsetArrayMgr();
24             if(aid.isZero()) 
25                 CkAbort("Array packing set and ArrayID is zero");
26         }        
27         
28         msgList[count].epIdx = env->getsetArrayEp();
29         msgList[count].size = env->getTotalsize() - sizeof(envelope);
30         msgList[count].idx = env->getsetArrayIndex();
31         msgList[count].data = cmsg->getCharmMessage();
32
33         if(msgList[count].size >= MAX_MESSAGE_SIZE-1)
34             CkAbort("Can't send messges larger than 64KB\n");
35
36         delete cmsg;
37     }
38 }
39
40 MsgPacker::~MsgPacker(){
41     if(nShortMsgs > 0 && msgList != NULL) {
42         for(int count = 0; count < nShortMsgs; count ++)
43             CkFreeMsg(msgList[count].data);        
44         
45         delete [] msgList;
46     }
47 }
48
49 void MsgPacker::getMessage(CombinedMessage *&cmb_msg, int &total_size){
50     int count;
51     PUP_cmiAllocSizer sp;
52
53     CombinedMessage cmb_hdr;
54     cmb_hdr.aid = aid;
55     cmb_hdr.srcPE = CkMyPe();
56     cmb_hdr.nmsgs = nShortMsgs;
57
58     sp | cmb_hdr;
59     for(count = 0; count < nShortMsgs; count ++)
60         sp | msgList[count];
61     
62     total_size = sp.size();
63     ComlibPrintf("In MsgPacker with %d bytes and %d messages\n", total_size, 
64                  nShortMsgs);
65
66     cmb_msg = (CombinedMessage *)CmiAlloc(sp.size());
67
68     PUP_toCmiAllocMem mp(cmb_msg);
69     mp | cmb_hdr;
70
71     for(count = 0; count < nShortMsgs; count ++)
72         mp | msgList[count];
73
74     CmiSetHandler(cmb_msg, CkpvAccess(RecvCombinedShortMsgHdlrIdx));
75 }