fixed a compiler warning
[charm.git] / src / langs / streams / MStream.C
1 /*****************************************************************************
2  * $Source$
3  * $Author$
4  * $Date$
5  * $Revision$
6  *****************************************************************************/
7
8 #include "Communicate.h"
9 #include "MStream.h"
10 #include <string.h>
11
12 MIStream::MIStream(Communicate *c, int p, int t)
13 {
14   cobj = c;
15   PE = p;
16   tag = t;
17   msg = (StreamMessage *) 0;
18 }
19
20 MIStream::~MIStream()
21 {
22   if(msg!=0)
23     CmiFree(msg);
24 }
25
26 MOStream::MOStream(Communicate *c, int p, int t, unsigned int size)
27 {
28   cobj = c;
29   PE = p;
30   tag = t;
31   bufLen = size;
32   msgBuf = (StreamMessage *)CmiAlloc(sizeof(StreamMessage)+size);
33   msgBuf->PE = CmiMyPe();
34   msgBuf->tag = tag;
35   msgBuf->len = 0;
36   msgBuf->isLast = 0;
37 }
38
39 MOStream::~MOStream()
40 {
41   if(msgBuf != 0)
42     end();
43 }
44
45 MIStream *MIStream::Get(char *buf, int len)
46 {
47   while(len) {
48     if(msg==0) {
49       msg = (StreamMessage *) cobj->getMessage(PE, tag);
50       currentPos = 0;
51     }
52     if(currentPos+len <= msg->len) {
53       memcpy(buf, &(msg->data[currentPos]), len);
54       currentPos += len;
55       len = 0;
56     } else {
57       int b = msg->len-currentPos;
58       memcpy(buf, &(msg->data[currentPos]), b);
59       len -= b;
60       buf += b;
61       currentPos += b;
62     }
63     if(currentPos == msg->len) {
64       CmiFree(msg);
65       msg = 0;
66     }
67   }
68   return this;
69 }
70
71 MOStream *MOStream::Put(char *buf, int len)
72 {
73   while(len) {
74     if(msgBuf->len + len <= bufLen) {
75       memcpy(&(msgBuf->data[msgBuf->len]), buf, len);
76       msgBuf->len += len;
77       len = 0;
78     } else {
79       int b = bufLen - msgBuf->len;
80       memcpy(&(msgBuf->data[msgBuf->len]), buf, b);
81       msgBuf->len = bufLen;
82       cobj->sendMessage(PE, (void *)msgBuf, bufLen+sizeof(StreamMessage));
83       msgBuf->len = 0;
84       msgBuf->isLast = 0;
85       len -= b;
86       buf += b;
87     }
88   }
89   return this;
90 }
91
92 void MOStream::end(void)
93 {
94   msgBuf->isLast = 1;
95   cobj->sendMessage(PE,(void*)msgBuf,msgBuf->len+sizeof(StreamMessage));
96   msgBuf->len = 0;
97   msgBuf->isLast = 0;
98 }
99