fixed a compiler warning
[charm.git] / src / langs / streams / Communicate.C
1 /*****************************************************************************
2  * $Source$
3  * $Author$
4  * $Date$
5  * $Revision$
6  *****************************************************************************/
7
8 #include <string.h>
9 #include "Communicate.h"
10 #include "MStream.h"
11
12 CpvStaticDeclare(CmmTable, CsmMessages);
13
14 static void CsmHandler(void *msg)
15 {
16   // get start of user message
17   int *m = (int *) ((char *)msg+CmiMsgHeaderSizeBytes);
18   // sending node  & tag act as tags
19   CmmPut(CpvAccess(CsmMessages), 2, m, msg);
20 }
21
22 Communicate::Communicate(void) 
23 {
24   CpvInitialize(CmmTable, CsmMessages);
25   CsmHandlerIndex = CmiRegisterHandler((CmiHandler) CsmHandler);
26   CpvAccess(CsmMessages) = CmmNew();
27 }
28
29
30 Communicate::~Communicate(void) 
31 {
32   // do nothing
33 }
34
35 MIStream *Communicate::newInputStream(int PE, int tag)
36 {
37   MIStream *st = new MIStream(this, PE, tag);
38   return st;
39 }
40
41 MOStream *Communicate::newOutputStream(int PE, int tag, unsigned int bufSize)
42 {
43   MOStream *st = new MOStream(this, PE, tag, bufSize);
44   return st;
45 }
46
47 void *Communicate::getMessage(int PE, int tag)
48 {
49   int itag[2], rtag[2];
50   void *msg;
51
52   itag[0] = (PE==(-1)) ? (CmmWildCard) : PE;
53   itag[1] = (tag==(-1)) ? (CmmWildCard) : tag;
54   while((msg=CmmGet(CpvAccess(CsmMessages),2,itag,rtag))==0) {
55     CmiDeliverMsgs(0);
56   }
57   return msg;
58 }
59
60 void Communicate::sendMessage(int PE, void *msg, int size)
61 {
62   CmiSetHandler(msg, CsmHandlerIndex);
63   switch(PE) {
64     case ALL:
65       CmiSyncBroadcastAll(size, (char *)msg);
66       break;
67     case ALLBUTME:
68       CmiSyncBroadcast(size, (char *)msg);
69       break;
70     default:
71       CmiSyncSend(PE, size, (char *)msg);
72       break;
73   }
74 }