int Client::write(const std::string & varname, int32_t iteration, const void* data) { /* check that the variable is know in the configuration */ Variable* variable = metadataManager->getVariable(varname); if(variable == NULL) { return -1; } Layout* layout = variable->getLayout(); if(layout->isUnlimited()) { ERROR("Trying to write a variable" << " with an unlimited layout (use chunk_write instead)"); return -3; } std::vector<int> si(layout->getDimensions()),ei(layout->getDimensions()); for(unsigned int i=0; i < layout->getDimensions(); i++) { ei[i] = layout->getExtentAlongDimension(i)-1; si[i] = 0; } ShmChunk* chunk = NULL; try { chunk = new ShmChunk(segment,layout->getType(), layout->getDimensions(),si,ei); chunk->setSource(env->getID()); chunk->setIteration(iteration); } catch (...) { ERROR("While writing \"" << varname << "\", allocation failed"); return -2; } // copy data size_t size = chunk->getDataMemoryLength(); memcpy(chunk->data(),data,size); // create message Message message; message.source = env->getID(); message.iteration = iteration; message.object = variable->getID(); message.type = MSG_VAR; message.handle = chunk->getHandle(); // send message msgQueue->send(&message,sizeof(Message),0); DBG("Variable \"" << varname << "\" has been written"); delete chunk; return size; }
int Server::chunk_write(chunk_h chunkh, const std::string & varname, int32_t iteration, const void* data) { /* check that the variable is know in the configuration */ Variable* variable = metadataManager->getVariable(varname); if(variable == NULL) { ERROR("Variable \""<< varname << "\" not defined in configuration"); return -1; } ChunkHandle* chunkHandle = (ChunkHandle*)chunkh; /* check if the chunk matches the layout boundaries */ Layout* layout = variable->getLayout(); if(not chunkHandle->within(layout)) { ERROR("Chunk boundaries do not match variable's layout"); return -3; } ShmChunk* chunk = NULL; try { Types::basic_type_e t = layout->getType(); unsigned int d = chunkHandle->getDimensions(); std::vector<int> si(d); std::vector<int> ei(d); for(unsigned int i=0;i<d; i++) { si[i] = chunkHandle->getStartIndex(i); ei[i] = chunkHandle->getEndIndex(i); } chunk = new ShmChunk(segment,t,d,si,ei); chunk->setSource(env->getID()); chunk->setIteration(iteration); } catch (...) { ERROR("While writing \"" << varname << "\", allocation failed"); return -2; } // copy data size_t size = chunk->getDataMemoryLength(); memcpy(chunk->data(),data,size); variable->attachChunk(chunk); DBG("Variable \"" << varname << "\" has been written"); return size; }
void* Client::alloc(const std::string & varname, int32_t iteration) { /* check that the variable is known in the configuration */ Variable* variable = metadataManager->getVariable(varname); if(variable == NULL) { ERROR("Variable \""<< varname << "\" not defined in configuration"); return NULL; } /* the variable is known, get its layout */ Layout* layout = variable->getLayout(); if(layout->isUnlimited()) { ERROR("Trying to allocate memory for an unlimited layout"); return NULL; } /* prepare variable to initialize a chunk */ std::vector<int> si(layout->getDimensions()),ei(layout->getDimensions()); for(unsigned int i=0; i < layout->getDimensions(); i++) { ei[i] = layout->getExtentAlongDimension(i)-1; si[i] = 0; } /* try initializing the chunk in shared memory */ try { ShmChunk* chunk = new ShmChunk(segment,layout->getType(), layout->getDimensions(),si,ei); chunk->setSource(env->getID()); chunk->setIteration(iteration); variable->attachChunk(chunk); /* chunk initialized, returns the data! */ return chunk->data(); } catch (...) { ERROR("While allocating \"" << varname << "\", allocation failed"); } /* on failure, returns NULL */ return NULL; }
int Server::write(const std::string & varname, int32_t iteration, const void* data) { /* check that the variable is known in the configuration */ Variable* variable = metadataManager->getVariable(varname); if(variable == NULL) { ERROR("Variable \""<< varname << "\" not defined in configuration"); return -1; } Layout* layout = variable->getLayout(); std::vector<int> si(layout->getDimensions()),ei(layout->getDimensions()); for(unsigned int i=0; i < layout->getDimensions(); i++) { ei[i] = layout->getExtentAlongDimension(i)-1; si[i] = 0; } ShmChunk* chunk = NULL; try { chunk = new ShmChunk(segment,layout->getType(), layout->getDimensions(),si,ei); chunk->setSource(env->getID()); chunk->setIteration(iteration); } catch (...) { ERROR("While writing \"" << varname << "\", allocation failed"); return -2; } // copy data size_t size = chunk->getDataMemoryLength(); memcpy(chunk->data(),data,size); variable->attachChunk(chunk); // send message DBG("Variable \"" << varname << "\" has been written"); return size; }