00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027 #include "Message/Message.h"
00028 #include "Message/Communicate.h"
00029 #include "Utility/Inform.h"
00030 #include "Utility/IpplInfo.h"
00031 #include "Utility/PAssert.h"
00032 #include "Profile/Profiler.h"
00033
00034 #ifdef IPPL_USE_STANDARD_HEADERS
00035 #include <new>
00036 #include <memory>
00037 using namespace std;
00038 #else
00039 #include <new.h>
00040 #include <memory.h>
00041 #endif
00042
00043 #include <stdlib.h>
00044 #include <stddef.h>
00045
00046
00048
00049
00050 Message::~Message() {
00051 TAU_PROFILE("Message::~Message()", "void (void)", TAU_MESSAGE);
00052
00053
00054 clear();
00055
00056
00057 int n = MsgItemList.size();
00058 for (int i=0; i < n; ++i)
00059 MsgItemList[i].deleteData();
00060
00061
00062
00063 if (comm != 0)
00064 comm->cleanupMessage(commdata);
00065 }
00066
00067
00069
00070 void Message::deleteMsgItem() {
00071 TAU_PROFILE("Message::deleteMsgItem()", "void (void)", TAU_MESSAGE);
00072
00073 if (!empty())
00074 numRemoved++;
00075 }
00076
00077
00079
00080
00081
00082 Message& Message::putmsg(void *data, int s, int nelem) {
00083 TAU_PROFILE("Message::putmsg()", "Message (void *, int, int)", TAU_MESSAGE);
00084
00085
00086 if (nelem < 1) {
00087 nelem = 1;
00088 DoCopy = true;
00089 }
00090
00091
00092
00093
00094
00095
00096
00097 MsgItem m(data, nelem, s * nelem, DoCopy, DoDelete);
00098
00099
00100 MsgItemList.push_back(m);
00101
00102
00103 DoCopy = DoDelete = true;
00104 return *this;
00105 }
00106
00107
00109
00110
00111
00112
00113 Message& Message::getmsg(void *data) {
00114 TAU_PROFILE("Message::getmsg()", "Message (void *)", TAU_MESSAGE);
00115
00116
00117 if (empty()) {
00118 ERRORMSG("Message::getmsg() no more items in Message" << endl);
00119 PAssert(!empty());
00120 } else {
00121
00122 MsgItem &m = item(0);
00123
00124
00125 if (m.data() != 0 && data != 0) {
00126
00127
00128
00129
00130 memcpy(data, m.data(), m.numBytes());
00131 }
00132
00133
00134 deleteMsgItem();
00135 }
00136
00137 return *this;
00138 }
00139
00140
00142
00143 Message& Message::clear(void) {
00144 TAU_PROFILE("Message::clear()", "Message ()", TAU_MESSAGE);
00145
00146 while (!empty())
00147 deleteMsgItem();
00148
00149 return *this;
00150 }
00151
00152
00154
00155
00156
00157
00158
00159
00160
00161
00162 void *Message::remove() {
00163 TAU_PROFILE("Message::remove()", "void * ()", TAU_MESSAGE);
00164
00165
00166 MsgItem &m = item(0);
00167 void *retdata = m.data();
00168
00169
00170 if (m.willNeedDelete()) {
00171 m.cancelDelete();
00172 } else if (retdata != 0) {
00173 retdata = malloc(m.numBytes());
00174 memcpy(retdata, m.data(), m.numBytes());
00175 }
00176
00177
00178 deleteMsgItem();
00179
00180
00181 return retdata;
00182 }
00183
00184
00186
00187 ostream& operator<<(ostream& o, const Message& m) {
00188 TAU_PROFILE("operator<<()", "ostream& (ostream&, const Message&)",
00189 TAU_MESSAGE | TAU_IO);
00190 o << "Message contains " << m.size() << " items (" << m.removed();
00191 o << " removed). Contents:\n";
00192 for (size_t i = 0 ; i < m.size(); ++i) {
00193 const Message::MsgItem &mi = m.item(i);
00194 o << " Item " << i << ": " << mi.numElems() << " elements, ";
00195 o << mi.numBytes() << " bytes total, needDelete = ";
00196 o << mi.willNeedDelete() << endl;
00197 }
00198 return o;
00199 }
00200
00201
00202
00203
00204
00205
00206