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; }
/* process a incoming message */ void Server::processMessage(Message* msg) { int32_t& iteration = msg->iteration; int32_t& source = msg->source; int32_t& object = msg->object; handle_t& handle = msg->handle; if(msg->type == MSG_VAR) { try { ShmChunk* chunk = new ShmChunk(segment,handle); Variable* v = metadataManager->getVariable(object); if(v != NULL) { INFO("A"); v->attachChunk(chunk); INFO("B"); } else { // the variable is unknown, discarde it ERROR("Server received a chunk " << "for an unknown variable, discarding"); chunk->remove(); delete chunk; } } catch(std::exception &e) { ERROR(e.what()); } return; } if(msg->type == MSG_SIG) { actionsManager->reactToUserSignal(object,iteration,source); return; } if(msg->type == MSG_INT) { processInternalSignal(object); } }