Changeset 1330
- Timestamp:
- 11/15/17 15:21:13 (7 years ago)
- Location:
- XIOS/dev/XIOS_DEV_CMIP6/src
- Files:
-
- 13 edited
Legend:
- Unmodified
- Added
- Removed
-
XIOS/dev/XIOS_DEV_CMIP6/src/cxios.cpp
r1243 r1330 158 158 // Initialize all aspects MPI 159 159 CServer::initialize(); 160 if (CServer::getRank()==0 ) globalRegistry = new CRegistry(CServer::intraComm) ;160 if (CServer::getRank()==0 && CServer::serverLevel != 1) globalRegistry = new CRegistry(CServer::intraComm) ; 161 161 162 162 if (printLogs2Files) -
XIOS/dev/XIOS_DEV_CMIP6/src/node/axis.cpp
r1314 r1330 153 153 * \return A map associating the server rank with its minimum buffer size. 154 154 */ 155 std::map<int, StdSize> CAxis::getAttributesBufferSize(CContextClient* client) 156 { 157 // For now the assumption is that secondary server pools consist of the same number of procs. 158 // CHANGE the line below if the assumption changes. 159 // CContext* context = CContext::getCurrent(); 160 // CContextClient* client = (0 != context->clientPrimServer.size()) ? context->clientPrimServer[0] : context->client; 161 162 std::map<int, StdSize> attributesSizes = getMinimumBufferSizeForAttributes(); 155 std::map<int, StdSize> CAxis::getAttributesBufferSize(CContextClient* client, bool bufferForWriting /*= false*/) 156 { 157 158 std::map<int, StdSize> attributesSizes = getMinimumBufferSizeForAttributes(client); 163 159 164 160 bool isNonDistributed = (n = n_glo); -
XIOS/dev/XIOS_DEV_CMIP6/src/node/axis.hpp
r1249 r1330 74 74 CArray<int, 1>& getCompressedIndexToWriteOnServer(MPI_Comm writtenCom); 75 75 76 std::map<int, StdSize> getAttributesBufferSize(CContextClient* client );76 std::map<int, StdSize> getAttributesBufferSize(CContextClient* client, bool bufferForWriting = false); 77 77 78 78 /// Test /// -
XIOS/dev/XIOS_DEV_CMIP6/src/node/context.cpp
r1318 r1330 297 297 } 298 298 299 void CContext::setClientServerBuffer(CContextClient* contextClient) 299 /*! 300 Sets client buffers. 301 \param [in] contextClient 302 \param [in] bufferForWriting True if buffers are used for sending data for writing 303 This flag is only true for client and server-1 for communication with server-2 304 */ 305 void CContext::setClientServerBuffer(CContextClient* contextClient, bool bufferForWriting) 300 306 { 301 307 // Estimated minimum event size for small events (10 is an arbitrary constant just for safety) … … 314 320 // Compute the buffer sizes needed to send the attributes and data corresponding to fields 315 321 std::map<int, StdSize> maxEventSize; 316 std::map<int, StdSize> bufferSize = getAttributesBufferSize(maxEventSize, contextClient );317 std::map<int, StdSize> dataBufferSize = getDataBufferSize(maxEventSize, contextClient );322 std::map<int, StdSize> bufferSize = getAttributesBufferSize(maxEventSize, contextClient, bufferForWriting); 323 std::map<int, StdSize> dataBufferSize = getDataBufferSize(maxEventSize, contextClient, bufferForWriting); 318 324 319 325 std::map<int, StdSize>::iterator it, ite = dataBufferSize.end(); … … 544 550 distributeFiles(); 545 551 546 setClientServerBuffer(client );552 setClientServerBuffer(client, (hasClient && !hasServer)); 547 553 for (int i = 0; i < clientPrimServer.size(); ++i) 548 setClientServerBuffer(clientPrimServer[i] );554 setClientServerBuffer(clientPrimServer[i], true); 549 555 550 556 if (hasClient) … … 1334 1340 /*! 1335 1341 * Compute the required buffer size to send the attributes (mostly those grid related). 1336 *1337 1342 * \param maxEventSize [in/out] the size of the bigger event for each connected server 1343 * \param [in] contextClient 1344 * \param [in] bufferForWriting True if buffers are used for sending data for writing 1345 This flag is only true for client and server-1 for communication with server-2 1338 1346 */ 1339 std::map<int, StdSize> CContext::getAttributesBufferSize(std::map<int, StdSize>& maxEventSize, CContextClient* contextClient) 1347 std::map<int, StdSize> CContext::getAttributesBufferSize(std::map<int, StdSize>& maxEventSize, 1348 CContextClient* contextClient, bool bufferForWriting /*= "false"*/) 1340 1349 { 1341 1350 std::map<int, StdSize> attributesSize; 1342 1351 1343 if (hasClient) 1344 { 1345 size_t numEnabledFiles = this->enabledWriteModeFiles.size(); 1352 // if (hasClient) 1353 { 1354 std::vector<CFile*>& fileList = bufferForWriting ? this->enabledWriteModeFiles : this->enabledReadModeFiles; 1355 // size_t numEnabledFiles = this->enabledWriteModeFiles.size(); 1356 size_t numEnabledFiles = fileList.size(); 1346 1357 for (size_t i = 0; i < numEnabledFiles; ++i) 1347 1358 { 1348 CFile* file = this->enabledWriteModeFiles[i]; 1349 // if (file->getContextClient() == contextClient) 1359 // CFile* file = this->enabledWriteModeFiles[i]; 1360 CFile* file = fileList[i]; 1361 // if (file->getContextClient() == contextClient) 1350 1362 { 1351 1363 std::vector<CField*> enabledFields = file->getEnabledFields(); … … 1353 1365 for (size_t j = 0; j < numEnabledFields; ++j) 1354 1366 { 1355 const std::map<int, StdSize> mapSize = enabledFields[j]->getGridAttributesBufferSize(contextClient );1367 const std::map<int, StdSize> mapSize = enabledFields[j]->getGridAttributesBufferSize(contextClient, bufferForWriting); 1356 1368 std::map<int, StdSize>::const_iterator it = mapSize.begin(), itE = mapSize.end(); 1357 1369 for (; it != itE; ++it) 1358 1370 { 1359 1371 // If attributesSize[it->first] does not exist, it will be zero-initialized 1360 // so we can use it safely without checking for its exist ance1372 // so we can use it safely without checking for its existence 1361 1373 if (attributesSize[it->first] < it->second) 1362 1374 attributesSize[it->first] = it->second; … … 1369 1381 } 1370 1382 1371 // Not a good approach here, duplicate code1372 if (!hasServer)1373 {1374 size_t numEnabledFiles = this->enabledReadModeFiles.size();1375 for (size_t i = 0; i < numEnabledFiles; ++i)1376 {1377 CFile* file = this->enabledReadModeFiles[i]; 1378 {1379 std::vector<CField*> enabledFields = file->getEnabledFields();1380 size_t numEnabledFields = enabledFields.size();1381 for (size_t j = 0; j < numEnabledFields; ++j)1382 {1383 const std::map<int, StdSize> mapSize = enabledFields[j]->getGridAttributesBufferSize(contextClient);1384 std::map<int, StdSize>::const_iterator it = mapSize.begin(), itE = mapSize.end();1385 for (; it != itE; ++it)1386 {1387 // If attributesSize[it->first] does not exist, it will be zero-initialized1388 // so we can use it safely without checking for its existance1389 if (attributesSize[it->first] < it->second)1390 attributesSize[it->first] = it->second;1391 1392 if (maxEventSize[it->first] < it->second)1393 maxEventSize[it->first] = it->second;1394 }1395 }1396 }1397 }1398 }1383 // // Not a good approach here, duplicate code 1384 // if (!hasServer) 1385 // { 1386 // size_t numEnabledFiles = this->enabledReadModeFiles.size(); 1387 // for (size_t i = 0; i < numEnabledFiles; ++i) 1388 // { 1389 // CFile* file = this->enabledReadModeFiles[i]; 1390 // { 1391 // std::vector<CField*> enabledFields = file->getEnabledFields(); 1392 // size_t numEnabledFields = enabledFields.size(); 1393 // for (size_t j = 0; j < numEnabledFields; ++j) 1394 // { 1395 // const std::map<int, StdSize> mapSize = enabledFields[j]->getGridAttributesBufferSize(contextClient); 1396 // std::map<int, StdSize>::const_iterator it = mapSize.begin(), itE = mapSize.end(); 1397 // for (; it != itE; ++it) 1398 // { 1399 // // If attributesSize[it->first] does not exist, it will be zero-initialized 1400 // // so we can use it safely without checking for its existance 1401 // if (attributesSize[it->first] < it->second) 1402 // attributesSize[it->first] = it->second; 1403 // 1404 // if (maxEventSize[it->first] < it->second) 1405 // maxEventSize[it->first] = it->second; 1406 // } 1407 // } 1408 // } 1409 // } 1410 // } 1399 1411 } 1400 1412 … … 1404 1416 /*! 1405 1417 * Compute the required buffer size to send the fields data. 1406 *1407 1418 * \param maxEventSize [in/out] the size of the bigger event for each connected server 1419 * \param [in] contextClient 1420 * \param [in] bufferForWriting True if buffers are used for sending data for writing 1421 This flag is only true for client and server-1 for communication with server-2 1408 1422 */ 1409 std::map<int, StdSize> CContext::getDataBufferSize(std::map<int, StdSize>& maxEventSize, CContextClient* contextClient) 1410 { 1411 CFile::mode_attr::t_enum mode = hasClient ? CFile::mode_attr::write : CFile::mode_attr::read; 1423 std::map<int, StdSize> CContext::getDataBufferSize(std::map<int, StdSize>& maxEventSize, 1424 CContextClient* contextClient, bool bufferForWriting /*= "false"*/) 1425 { 1426 // CFile::mode_attr::t_enum mode = hasClient ? CFile::mode_attr::write : CFile::mode_attr::read; 1412 1427 1413 1428 std::map<int, StdSize> dataSize; 1414 1429 1415 1430 // Find all reference domain and axis of all active fields 1416 size_t numEnabledFiles = this->enabledFiles.size(); 1431 std::vector<CFile*>& fileList = bufferForWriting ? this->enabledWriteModeFiles : this->enabledReadModeFiles; 1432 size_t numEnabledFiles = fileList.size(); 1433 // size_t numEnabledFiles = this->enabledFiles.size(); 1417 1434 for (size_t i = 0; i < numEnabledFiles; ++i) 1418 1435 { 1419 CFile* file = this->enabledFiles[i]; 1436 // CFile* file = this->enabledFiles[i]; 1437 CFile* file = fileList[i]; 1420 1438 if (file->getContextClient() == contextClient) 1421 1439 { 1422 CFile::mode_attr::t_enum fileMode = file->mode.isEmpty() ? CFile::mode_attr::write : file->mode.getValue();1423 1424 if (fileMode == mode) 1440 // CFile::mode_attr::t_enum fileMode = file->mode.isEmpty() ? CFile::mode_attr::write : file->mode.getValue(); 1441 // if (fileMode == mode) 1442 1425 1443 { 1426 1444 std::vector<CField*> enabledFields = file->getEnabledFields(); … … 1429 1447 { 1430 1448 // const std::vector<std::map<int, StdSize> > mapSize = enabledFields[j]->getGridDataBufferSize(contextClient); 1431 const std::map<int, StdSize> mapSize = enabledFields[j]->getGridDataBufferSize(contextClient );1449 const std::map<int, StdSize> mapSize = enabledFields[j]->getGridDataBufferSize(contextClient,bufferForWriting); 1432 1450 // for (size_t c = 0; c < mapSize.size(); ++c) 1433 1451 // { -
XIOS/dev/XIOS_DEV_CMIP6/src/node/context.hpp
r1318 r1330 134 134 void sendGridComponentEnabledFieldsInFiles(const std::vector<CFile*>& activeFiles) ; 135 135 136 // std::map<int, StdSize> getAttributesBufferSize(std::map<int, StdSize>& maxEventSize); 137 // std::map<int, StdSize> getDataBufferSize(std::map<int, StdSize>& maxEventSize); 138 // void setClientServerBuffer(); 139 std::map<int, StdSize> getAttributesBufferSize(std::map<int, StdSize>& maxEventSize, CContextClient* contextClient); 140 std::map<int, StdSize> getDataBufferSize(std::map<int, StdSize>& maxEventSize, CContextClient* contextClient); 141 void setClientServerBuffer(CContextClient* contextClient); 136 std::map<int, StdSize> getAttributesBufferSize(std::map<int, StdSize>& maxEventSize, CContextClient* contextClient, bool bufferForWriting = false); 137 std::map<int, StdSize> getDataBufferSize(std::map<int, StdSize>& maxEventSize, CContextClient* contextClient, bool bufferForWriting = false); 138 void setClientServerBuffer(CContextClient* contextClient, bool bufferForWriting = false); 142 139 143 140 // Distribute files (in write mode) among secondary-server pools according to the estimated data flux -
XIOS/dev/XIOS_DEV_CMIP6/src/node/domain.cpp
r1325 r1330 129 129 * \return A map associating the server rank with its minimum buffer size. 130 130 */ 131 std::map<int, StdSize> CDomain::getAttributesBufferSize(CContextClient* client) 132 { 133 CContext* context = CContext::getCurrent(); 134 // For now the assumption is that secondary server pools consist of the same number of procs. 135 // CHANGE the line below if the assumption changes. 136 // CContextClient* client = (0 != context->clientPrimServer.size()) ? context->clientPrimServer[0] : context->client; 137 138 std::map<int, StdSize> attributesSizes = getMinimumBufferSizeForAttributes(); 131 std::map<int, StdSize> CDomain::getAttributesBufferSize(CContextClient* client, bool bufferForWriting /*= false*/) 132 { 133 134 std::map<int, StdSize> attributesSizes = getMinimumBufferSizeForAttributes(client); 139 135 140 136 if (client->isServerLeader()) -
XIOS/dev/XIOS_DEV_CMIP6/src/node/domain.hpp
r1311 r1330 97 97 CArray<int,1>& getCompressedIndexToWriteOnServer(MPI_Comm writtenCom); 98 98 99 std::map<int, StdSize> getAttributesBufferSize(CContextClient* client );99 std::map<int, StdSize> getAttributesBufferSize(CContextClient* client, bool bufferForWriting = false); 100 100 101 101 bool isEmpty(void) const; -
XIOS/dev/XIOS_DEV_CMIP6/src/node/field.cpp
r1327 r1330 911 911 } 912 912 913 std::map<int, StdSize> CField::getGridAttributesBufferSize(CContextClient* client )914 { 915 return grid->getAttributesBufferSize(client );916 } 917 918 std::map<int, StdSize> CField::getGridDataBufferSize(CContextClient* client )919 { 920 return grid->getDataBufferSize(client, getId() );913 std::map<int, StdSize> CField::getGridAttributesBufferSize(CContextClient* client, bool bufferForWriting /*= "false"*/) 914 { 915 return grid->getAttributesBufferSize(client, bufferForWriting); 916 } 917 918 std::map<int, StdSize> CField::getGridDataBufferSize(CContextClient* client, bool bufferForWriting /*= "false"*/) 919 { 920 return grid->getDataBufferSize(client, getId(), bufferForWriting); 921 921 } 922 922 -
XIOS/dev/XIOS_DEV_CMIP6/src/node/field.hpp
r1318 r1330 100 100 void resetNStepMax(); 101 101 102 std::map<int, StdSize> getGridAttributesBufferSize(CContextClient* client); 103 std::map<int, StdSize> getGridDataBufferSize(CContextClient* client); // Grid data buffer size for each connection of contextclient 102 std::map<int, StdSize> getGridAttributesBufferSize(CContextClient* client, bool bufferForWriting = false); 103 // Grid data buffer size for each connection of contextclient 104 std::map<int, StdSize> getGridDataBufferSize(CContextClient* client, bool bufferForWriting = false); 104 105 105 106 void setContextClient(CContextClient* newContextClient); -
XIOS/dev/XIOS_DEV_CMIP6/src/node/grid.cpp
r1311 r1330 31 31 , clientDistribution_(0), isIndexSent(false) , serverDistribution_(0), clientServerMap_(0) 32 32 , writtenDataSize_(0), numberWrittenIndexes_(0), totalNumberWrittenIndexes_(0), offsetWrittenIndexes_(0) 33 , connectedDataSize_(), connectedServerRank_(), isDataDistributed_(true), isCompressible_(false) 33 , connectedDataSize_(), connectedServerRank_(), connectedServerRankRead_(), connectedDataSizeRead_() 34 , isDataDistributed_(true), isCompressible_(false) 34 35 , transformations_(0), isTransformed_(false) 35 36 , axisPositionInGrid_(), hasDomainAxisBaseRef_(false) … … 51 52 , clientDistribution_(0), isIndexSent(false) , serverDistribution_(0), clientServerMap_(0) 52 53 , writtenDataSize_(0), numberWrittenIndexes_(0), totalNumberWrittenIndexes_(0), offsetWrittenIndexes_(0) 53 , connectedDataSize_(), connectedServerRank_(), isDataDistributed_(true), isCompressible_(false) 54 , connectedDataSize_(), connectedServerRank_(), connectedServerRankRead_(), connectedDataSizeRead_() 55 , isDataDistributed_(true), isCompressible_(false) 54 56 , transformations_(0), isTransformed_(false) 55 57 , axisPositionInGrid_(), hasDomainAxisBaseRef_(false) … … 102 104 * TODO: Refactor code 103 105 */ 104 std::map<int, StdSize> CGrid::getAttributesBufferSize(CContextClient* client )105 { 106 std::map<int, StdSize> attributesSizes = getMinimumBufferSizeForAttributes( );106 std::map<int, StdSize> CGrid::getAttributesBufferSize(CContextClient* client, bool bufferForWriting) 107 { 108 std::map<int, StdSize> attributesSizes = getMinimumBufferSizeForAttributes(client); 107 109 108 110 // The grid indexes require a similar size as the actual data 109 std::map<int, StdSize> dataSizes = getDataBufferSize(client );111 std::map<int, StdSize> dataSizes = getDataBufferSize(client, "", bufferForWriting); 110 112 // for (size_t i = 0; i < dataSizes.size(); ++i) 111 113 // { … … 151 153 * \param client contextClient used to determine the size of connected receivers 152 154 * \param id the id used to tag the data 155 * \param bufferForWriting flag indicating if a buffer is used to send data for writing 153 156 * \return A map associating the sender rank with its minimum buffer size. 154 157 */ 155 std::map<int, StdSize> CGrid::getDataBufferSize(CContextClient* client, const std::string& id /*= ""*/ )158 std::map<int, StdSize> CGrid::getDataBufferSize(CContextClient* client, const std::string& id /*= ""*/, bool bufferForWriting /*= "false"*/) 156 159 { 157 160 // The record index is sometimes sent along with the data but we always … … 160 163 + 2 * sizeof(size_t) 161 164 + sizeof(size_t); 162 // CContext* context = CContext::getCurrent();163 // int nbSrvPools = (context->hasServer) ? (context->hasClient ? context->clientPrimServer.size() : 0) : 1;164 // std::vector<std::map<int, StdSize> > dataSizes(nbSrvPools);165 // for (int p = 0; p < nbSrvPools; ++p)166 // {167 // std::map<int, size_t>::const_iterator itEnd = connectedDataSize_[client].end();168 // for (size_t k = 0; k < connectedServerRank_[p].size(); ++k)169 // {170 // int rank = connectedServerRank_[p][k];171 // std::map<int, size_t>::const_iterator it = connectedDataSize_[client].find(rank);172 // size_t count = (it != itEnd) ? it->second : 0;173 174 // dataSizes[p].insert(std::make_pair(rank, extraSize + CArray<double,1>::size(count)));175 // }176 177 // }178 165 179 166 std::map<int, StdSize> dataSizes; 180 167 int receiverSize = client->serverSize; 181 std::map<int, size_t>::const_iterator itEnd = connectedDataSize_[receiverSize].end(); 182 for (size_t k = 0; k < connectedServerRank_[receiverSize].size(); ++k) 168 std::map<int,size_t>& dataSizeMap = bufferForWriting ? connectedDataSize_[receiverSize]: connectedDataSizeRead_; 169 std::vector<int>& connectedServerRanks = bufferForWriting ? connectedServerRank_[receiverSize] : connectedServerRankRead_; 170 171 std::map<int, size_t>::const_iterator itEnd = dataSizeMap.end(); 172 for (size_t k = 0; k < connectedServerRanks.size(); ++k) 183 173 { 184 int rank = connectedServerRank _[receiverSize][k];185 std::map<int, size_t>::const_iterator it = connectedDataSize_[receiverSize].find(rank);174 int rank = connectedServerRanks[k]; 175 std::map<int, size_t>::const_iterator it = dataSizeMap.find(rank); 186 176 size_t count = (it != itEnd) ? it->second : 0; 187 177 … … 1551 1541 { 1552 1542 CContext* context = CContext::getCurrent(); 1543 connectedServerRankRead_ = ranks; 1553 1544 1554 1545 int nbSrvPools = (context->hasServer) ? (context->hasClient ? context->clientPrimServer.size() : 1) : 1; … … 1659 1650 CArray<size_t,1> outIndex; 1660 1651 buffer >> outIndex; 1661 outGlobalIndexFromClient.insert(std::make_pair(rank, outIndex)); 1652 outGlobalIndexFromClient.insert(std::make_pair(rank, outIndex)); 1653 connectedDataSizeRead_[rank] = outIndex.numElements(); 1662 1654 1663 1655 if (doGridHaveDataDistributed(client)) -
XIOS/dev/XIOS_DEV_CMIP6/src/node/grid.hpp
r1294 r1330 166 166 void computeDomConServer(); 167 167 std::map<int, int> getDomConServerSide(); 168 std::map<int, StdSize> getAttributesBufferSize(CContextClient* client );169 std::map<int, StdSize> getDataBufferSize(CContextClient* client, const std::string& id = "" );168 std::map<int, StdSize> getAttributesBufferSize(CContextClient* client, bool bufferForWriting = false); 169 std::map<int, StdSize> getDataBufferSize(CContextClient* client, const std::string& id = "", bool bufferForWriting = false); 170 170 std::vector<StdString> getDomainList(); 171 171 std::vector<StdString> getAxisList(); … … 326 326 int numberWrittenIndexes_, totalNumberWrittenIndexes_, offsetWrittenIndexes_; 327 327 328 /** Map storing local ranks of connected receivers. Key = size of receiver's intracomm */ 328 /** Map storing local ranks of connected receivers. Key = size of receiver's intracomm. 329 * It is calculated in computeConnectedClients(). */ 329 330 std::map<int, std::vector<int> > connectedServerRank_; 330 331 331 /** Map storing the size of data to be send. Key = size of receiver's intracomm */ 332 /** Map storing the size of data to be send. Key = size of receiver's intracomm 333 * It is calculated in computeConnectedClients(). */ 332 334 std::map<int, std::map<int,size_t> > connectedDataSize_; 335 336 /** Ranks of connected receivers in case of reading. It is calculated in recvIndex(). */ 337 std::vector<int> connectedServerRankRead_; 338 339 /** Size of data to be send in case of reading. It is calculated in recvIndex(). */ 340 std::map<int,size_t> connectedDataSizeRead_; 333 341 334 342 bool isDataDistributed_; -
XIOS/dev/XIOS_DEV_CMIP6/src/object_template.hpp
r1158 r1330 55 55 /// Traitement statique /// 56 56 static void ClearAllAttributes(void); 57 std::map<int, size_t> getMinimumBufferSizeForAttributes( );57 std::map<int, size_t> getMinimumBufferSizeForAttributes(CContextClient* client); 58 58 void sendAttributToServer(const string& id); 59 59 void sendAttributToServer(const string& id, CContextClient* client); -
XIOS/dev/XIOS_DEV_CMIP6/src/object_template_impl.hpp
r1283 r1330 181 181 182 182 template<typename T> 183 std::map<int, size_t> CObjectTemplate<T>::getMinimumBufferSizeForAttributes() 184 { 185 // Use correct context client to send message 186 CContext* context = CContext::getCurrent(); 187 // int nbSrvPools = (context->hasServer) ? context->clientPrimServer.size() : 1; 188 int nbSrvPools = (context->hasServer) ? (context->hasClient ? context->clientPrimServer.size() : 1) : 1; 189 for (int i = 0; i < nbSrvPools; ++i) 183 std::map<int, size_t> CObjectTemplate<T>::getMinimumBufferSizeForAttributes(CContextClient* client) 184 { 185 std::map<int, size_t> minimumSizes; 186 187 if (client->isServerLeader()) 190 188 { 191 CContextClient* contextClientTmp = (context->hasServer) ? context->clientPrimServer[i] : context->client; 192 193 std::map<int, size_t> minimumSizes; 194 195 if (contextClientTmp->isServerLeader()) 189 size_t minimumSize = 0; 190 CAttributeMap& attrMap = *this; 191 CAttributeMap::const_iterator it = attrMap.begin(), itE = attrMap.end(); 192 for (; it != itE; ++it) 196 193 { 197 size_t minimumSize = 0; 198 CAttributeMap& attrMap = *this; 199 CAttributeMap::const_iterator it = attrMap.begin(), itE = attrMap.end(); 200 for (; it != itE; ++it) 194 if (!it->second->isEmpty()) 201 195 { 202 if (!it->second->isEmpty()) 203 { 204 size_t size = it->second->getName().size() + sizeof(size_t) + it->second->size(); 205 if (size > minimumSize) 206 minimumSize = size; 207 } 208 } 209 210 if (minimumSize) 211 { 212 // Account for extra header info 213 minimumSize += CEventClient::headerSize + getIdServer().size() + sizeof(size_t); 214 215 const std::list<int>& ranks = contextClientTmp->getRanksServerLeader(); 216 for (std::list<int>::const_iterator itRank = ranks.begin(), itRankEnd = ranks.end(); itRank != itRankEnd; ++itRank) 217 minimumSizes.insert(std::make_pair(*itRank, minimumSize)); 196 size_t size = it->second->getName().size() + sizeof(size_t) + it->second->size(); 197 if (size > minimumSize) 198 minimumSize = size; 218 199 } 219 200 } 220 return minimumSizes; 201 202 if (minimumSize) 203 { 204 // Account for extra header info 205 minimumSize += CEventClient::headerSize + getIdServer().size() + sizeof(size_t); 206 207 const std::list<int>& ranks = client->getRanksServerLeader(); 208 for (std::list<int>::const_iterator itRank = ranks.begin(), itRankEnd = ranks.end(); itRank != itRankEnd; ++itRank) 209 minimumSizes.insert(std::make_pair(*itRank, minimumSize)); 210 } 221 211 } 222 } 212 return minimumSizes; 213 } 214 223 215 224 216 template<typename T>
Note: See TracChangeset
for help on using the changeset viewer.