Ignore:
Timestamp:
06/12/23 11:52:10 (13 months ago)
Author:
ymipsl
Message:

New way to manage locks in window manager. Windows is locked with MPI_Win_lock_all at creation (shared mode), and lock is manage by software way in the class (using MPI_swap_and_compare and MPI_Fetch_op). We get in this case a better control of lock, with controled latency between each attemp of lock.

YM

File:
1 edited

Legend:

Unmodified
Added
Removed
  • XIOS3/trunk/src/manager/ressources_manager.cpp

    r2458 r2517  
    4949    info(40)<<"CRessourcesManager::createPool : calling createPool : "<<poolId<<"  of size"<<size<<endl ; 
    5050    info(40)<<"send notification to leader : "<<serverLeader_<<endl ; 
    51     winRessources_->lockWindow(managerGlobalLeader_,0) ; 
    52     winRessources_->updateFromWindow(managerGlobalLeader_, this, &CRessourcesManager::ressourcesDumpIn) ; 
    53     winRessources_->unlockWindow(managerGlobalLeader_,0) ;     
    54     
     51    winRessources_->updateFromExclusiveWindow(managerGlobalLeader_, this, &CRessourcesManager::ressourcesDumpIn) ; 
     52     
    5553    notifyType_=NOTIFY_CREATE_POOL ; 
    5654    notifyCreatePool_=make_tuple(poolId, size) ; 
     
    6159  void CRessourcesManager::finalize(void) 
    6260  { 
    63     winRessources_->lockWindow(managerGlobalLeader_,0) ; 
    64     winRessources_->updateFromWindow(managerGlobalLeader_, this, &CRessourcesManager::ressourcesDumpIn) ; 
    65     winRessources_->unlockWindow(managerGlobalLeader_,0) ;     
     61    winRessources_->updateFromExclusiveWindow(managerGlobalLeader_, this, &CRessourcesManager::ressourcesDumpIn) ; 
    6662    
    6763    if (serverLeader_!=-1) 
     
    7773    winNotify_->lockWindowExclusive(rank) ; 
    7874    winNotify_->pushToLockedWindow(rank, this, &CRessourcesManager::notificationsDumpOut) ; 
    79     winNotify_->unlockWindow(rank) ; 
     75    winNotify_->unlockWindowExclusive(rank) ; 
    8076  } 
    8177 
     
    139135    CTimer::get("CRessourcesManager::checkNotifications pop").suspend(); 
    140136    CTimer::get("CRessourcesManager::checkNotifications unlock").resume(); 
    141     winNotify_->unlockWindow(commRank) ; 
     137    winNotify_->unlockWindowExclusive(commRank) ; 
    142138    CTimer::get("CRessourcesManager::checkNotifications unlock").suspend(); 
    143139    if (notifyType_==NOTIFY_CREATE_POOL) createPool() ; 
     
    196192  void CRessourcesManager::registerServerLeader(int serverLeaderRank) 
    197193  { 
    198     winRessources_->lockWindow(managerGlobalLeader_,0) ; 
    199     winRessources_->updateFromWindow(managerGlobalLeader_, this, &CRessourcesManager::ressourcesDumpIn) ; 
     194    winRessources_->lockWindowExclusive(managerGlobalLeader_) ; 
     195    winRessources_->updateFromLockedWindow(managerGlobalLeader_, this, &CRessourcesManager::ressourcesDumpIn) ; 
    200196    serverLeader_ = serverLeaderRank ; 
    201     winRessources_->updateToWindow(managerGlobalLeader_, this, &CRessourcesManager::ressourcesDumpOut) ; 
    202     winRessources_->unlockWindow(managerGlobalLeader_,0) ;     
     197    winRessources_->updateToLockedWindow(managerGlobalLeader_, this, &CRessourcesManager::ressourcesDumpOut) ; 
     198    winRessources_->unlockWindowExclusive(managerGlobalLeader_) ;     
    203199  } 
    204200   
    205201  void CRessourcesManager::registerRessourcesSize(int size) 
    206202  { 
    207     winRessources_->lockWindow(managerGlobalLeader_,0) ; 
    208     winRessources_->updateFromWindow(managerGlobalLeader_, this, &CRessourcesManager::ressourcesDumpIn) ; 
     203    winRessources_->lockWindowExclusive(managerGlobalLeader_) ; 
     204    winRessources_->updateFromLockedWindow(managerGlobalLeader_, this, &CRessourcesManager::ressourcesDumpIn) ; 
    209205    ressourcesSize_ = size ; 
    210206    freeRessourcesSize_ = size ; 
    211     winRessources_->updateToWindow(managerGlobalLeader_, this, &CRessourcesManager::ressourcesDumpOut) ; 
    212     winRessources_->unlockWindow(managerGlobalLeader_,0) ;     
     207    winRessources_->updateToLockedWindow(managerGlobalLeader_, this, &CRessourcesManager::ressourcesDumpOut) ; 
     208    winRessources_->unlockWindowExclusive(managerGlobalLeader_) ;     
    213209  } 
    214210 
     
    216212  void CRessourcesManager::registerPoolClient(const string& poolId, int size, int leader) 
    217213  { 
    218     winRessources_->lockWindow(managerGlobalLeader_,0) ; 
    219     winRessources_->updateFromWindow(managerGlobalLeader_, this, &CRessourcesManager::ressourcesDumpIn) ; 
     214    winRessources_->lockWindowExclusive(managerGlobalLeader_) ; 
     215    winRessources_->updateFromLockedWindow(managerGlobalLeader_, this, &CRessourcesManager::ressourcesDumpIn) ; 
    220216    pools_[poolId] = make_tuple(size, size, leader) ; 
    221     winRessources_->updateToWindow(managerGlobalLeader_, this, &CRessourcesManager::ressourcesDumpOut) ; 
    222     winRessources_->unlockWindow(managerGlobalLeader_,0) ;     
     217    winRessources_->updateToLockedWindow(managerGlobalLeader_, this, &CRessourcesManager::ressourcesDumpOut) ; 
     218    winRessources_->unlockWindowExclusive(managerGlobalLeader_) ;     
    223219  } 
    224220 
    225221  void CRessourcesManager::registerPoolServer(const string& poolId, int size, int leader) 
    226222  { 
    227     winRessources_->lockWindow(managerGlobalLeader_,0) ; 
    228     winRessources_->updateFromWindow(managerGlobalLeader_, this, &CRessourcesManager::ressourcesDumpIn) ; 
     223    winRessources_->lockWindowExclusive(managerGlobalLeader_) ; 
     224    winRessources_->updateFromLockedWindow(managerGlobalLeader_, this, &CRessourcesManager::ressourcesDumpIn) ; 
    229225    pools_[poolId] = make_tuple(size, size, leader) ; 
    230226    freeRessourcesSize_-=size ; 
    231     winRessources_->updateToWindow(managerGlobalLeader_, this, &CRessourcesManager::ressourcesDumpOut) ; 
    232     winRessources_->unlockWindow(managerGlobalLeader_,0) ;     
     227    winRessources_->updateToLockedWindow(managerGlobalLeader_, this, &CRessourcesManager::ressourcesDumpOut) ; 
     228    winRessources_->unlockWindowExclusive(managerGlobalLeader_) ;     
    233229  } 
    234230 
    235231  bool CRessourcesManager::getPoolInfo(const string& poolId, int& size, int& freeSize, int& leader) 
    236232  { 
    237     winRessources_->lockWindow(managerGlobalLeader_,0) ; 
    238     winRessources_->updateFromWindow(managerGlobalLeader_, this, &CRessourcesManager::ressourcesDumpIn) ; 
    239     winRessources_->unlockWindow(managerGlobalLeader_,0) ; 
     233    winRessources_->updateFromSharedWindow(managerGlobalLeader_, this, &CRessourcesManager::ressourcesDumpIn) ; 
    240234 
    241235    auto it=pools_.find(poolId) ; 
     
    254248    bool ret ; 
    255249 
    256     winRessources_->lockWindow(managerGlobalLeader_,0) ; 
    257     winRessources_->updateFromWindow(managerGlobalLeader_, this, &CRessourcesManager::ressourcesDumpIn) ; 
     250    winRessources_->lockWindowExclusive(managerGlobalLeader_) ; 
     251    winRessources_->updateFromLockedWindow(managerGlobalLeader_, this, &CRessourcesManager::ressourcesDumpIn) ; 
    258252    
    259253 
     
    266260      ret=true ; 
    267261    } 
    268     winRessources_->updateToWindow(managerGlobalLeader_, this, &CRessourcesManager::ressourcesDumpOut) ; 
    269     winRessources_->unlockWindow(managerGlobalLeader_,0) ;  
     262    winRessources_->updateToLockedWindow(managerGlobalLeader_, this, &CRessourcesManager::ressourcesDumpOut) ; 
     263    winRessources_->unlockWindowExclusive(managerGlobalLeader_) ;  
    270264 
    271265    return ret ;    
     
    274268  int CRessourcesManager::getRessourcesSize(void) 
    275269  { 
    276     winRessources_->lockWindow(managerGlobalLeader_,0) ; 
    277     winRessources_->updateFromWindow(managerGlobalLeader_, this, &CRessourcesManager::ressourcesDumpIn) ; 
    278     winRessources_->unlockWindow(managerGlobalLeader_,0) ; 
    279  
     270    winRessources_->updateFromSharedWindow(managerGlobalLeader_, this, &CRessourcesManager::ressourcesDumpIn) ; 
     271     
    280272    return ressourcesSize_ ; 
    281273  } 
     
    283275  int CRessourcesManager::getFreeRessourcesSize(void) 
    284276  { 
    285     winRessources_->lockWindow(managerGlobalLeader_,0) ; 
    286     winRessources_->updateFromWindow(managerGlobalLeader_, this, &CRessourcesManager::ressourcesDumpIn) ; 
    287     winRessources_->unlockWindow(managerGlobalLeader_,0) ; 
     277    winRessources_->updateFromSharedWindow(managerGlobalLeader_, this, &CRessourcesManager::ressourcesDumpIn) ; 
    288278 
    289279    return freeRessourcesSize_ ; 
Note: See TracChangeset for help on using the changeset viewer.