Changeset 2273


Ignore:
Timestamp:
12/09/21 12:25:17 (2 years ago)
Author:
ymipsl
Message:

Fix issue in protocol : buffer was not correctly released after resizing

YM

Location:
XIOS/dev/dev_ym/XIOS_COUPLING/src
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • XIOS/dev/dev_ym/XIOS_COUPLING/src/buffer_server.hpp

    r2260 r2273  
    1717 
    1818      bool isBufferFree(size_t count) ; 
     19      bool isResizing(void) { return resizingBuffer_ ;} 
    1920      void* getBuffer(size_t count) ; 
    2021      void freeBuffer(size_t count) ; 
  • XIOS/dev/dev_ym/XIOS_COUPLING/src/context_server.cpp

    r2262 r2273  
    207207        MPI_Get_count(&status,MPI_CHAR,&count); 
    208208        map<int,CServerBuffer*>::iterator it = buffers.find(rank); 
    209         if (it->second->isBufferFree(count)) 
     209        if ( (it->second->isBufferFree(count) && !it->second->isResizing()) // accept new request if buffer is free 
     210          || (it->second->isResizing() && it->second->isBufferEmpty()) )    // or if resizing wait for buffer is empty 
    210211        { 
    211212          char * addr; 
     
    304305        buffers[rank]->notifyBufferResizing() ; 
    305306        buffers[rank]->updateCurrentWindows() ; 
     307        buffers[rank]->freeBuffer(count) ; 
    306308        info(100)<<"Receive NotifyChangeBufferSize from client rank "<<rank<<endl ; 
    307309      }  
     
    311313        vector<MPI_Aint> winAdress(2) ; 
    312314        newBuffer>>newSize>>winAdress[0]>>winAdress[1] ; 
    313         buffers.erase(rank) ; 
    314         buffers.insert(pair<int,CServerBuffer*>(rank,new CServerBuffer(windows_[rank], winAdress, 0, newSize))); 
     315        buffers[rank]->freeBuffer(count) ; 
     316        delete buffers[rank] ; 
     317        buffers[rank] = new CServerBuffer(windows_[rank], winAdress, 0, newSize) ; 
    315318        info(100)<<"Receive ChangeBufferSize from client rank "<<rank<<"  newSize : "<<newSize<<" Address : "<<winAdress[0]<<" & "<<winAdress[1]<<endl ; 
    316319      } 
     
    403406    map<int,CServerBuffer*>::iterator it; 
    404407    for(it=buffers.begin();it!=buffers.end();++it) delete it->second; 
     408    buffers.clear() ; 
    405409  } 
    406410 
     
    452456      CTimer::get("receiving requests").suspend(); 
    453457      context->finalize(); 
    454       freeWindows() ; 
    455  
     458       
    456459      std::map<int, StdSize>::const_iterator itbMap = mapBufferSize_.begin(), 
    457460                           iteMap = mapBufferSize_.end(), itMap; 
Note: See TracChangeset for help on using the changeset viewer.