Ignore:
Timestamp:
10/18/19 14:55:57 (5 years ago)
Author:
ymipsl
Message:

Implement one sided communication in client/server protocol to avoid dead-lock when some buffer are full.

YM

File:
1 edited

Legend:

Unmodified
Added
Removed
  • XIOS/dev/dev_ym/XIOS_ONE_SIDED/src/node/context.cpp

    r1639 r1757  
    429429    { 
    430430      client->checkBuffers(); 
    431       bool hasTmpBufferedEvent = client->hasTemporarilyBufferedEvent(); 
    432       if (hasTmpBufferedEvent) 
    433         hasTmpBufferedEvent = !client->sendTemporarilyBufferedEvent(); 
    434       // Don't process events if there is a temporarily buffered event 
    435       return server->eventLoop(!hasTmpBufferedEvent || !enableEventsProcessing); 
     431      return server->eventLoop(true); 
    436432    } 
    437433    else if (CServer::serverLevel == 1) 
    438434    { 
    439       if (!finalized) 
    440         client->checkBuffers(); 
     435      if (!finalized) client->checkBuffers(); 
    441436      bool serverFinished = true; 
    442       if (!finalized) 
    443         serverFinished = server->eventLoop(enableEventsProcessing); 
     437      if (!finalized) serverFinished = server->eventLoop(enableEventsProcessing); 
    444438      bool serverPrimFinished = true; 
    445439      for (int i = 0; i < clientPrimServer.size(); ++i) 
    446440      { 
    447         if (!finalized) 
    448           clientPrimServer[i]->checkBuffers(); 
    449         if (!finalized) 
    450           serverPrimFinished *= serverPrimServer[i]->eventLoop(enableEventsProcessing); 
     441        if (!finalized) clientPrimServer[i]->checkBuffers(); 
     442        if (!finalized) serverPrimFinished *= serverPrimServer[i]->eventLoop(enableEventsProcessing); 
    451443      } 
    452444      return ( serverFinished && serverPrimFinished); 
     
    484476         ++countChildCtx_; 
    485477 
     478         info(100)<<"DEBUG: context "<<getId()<<" Send client finalize"<<endl ; 
    486479         client->finalize(); 
    487          while (client->havePendingRequests()) 
    488             client->checkBuffers(); 
    489  
     480         info(100)<<"DEBUG: context "<<getId()<<" Client finalize sent"<<endl ; 
     481         while (client->havePendingRequests()) client->checkBuffers(); 
     482          
     483         info(100)<<"DEBUG: context "<<getId()<<" no pending request ok"<<endl ; 
    490484         while (!server->hasFinished()) 
    491485           server->eventLoop(); 
     486        info(100)<<"DEBUG: context "<<getId()<<" server has finished"<<endl ; 
     487         
     488        bool notifiedFinalized=false ; 
     489        do 
     490        { 
     491          notifiedFinalized=client->isNotifiedFinalized() ; 
     492        } while (!notifiedFinalized) ; 
     493        client->releaseBuffers(); 
    492494 
    493495         if (hasServer) // Mode attache 
     
    499501 
    500502         //! Deallocate client buffers 
    501          client->releaseBuffers(); 
    502  
     503//         client->releaseBuffers(); 
     504        info(100)<<"DEBUG: context "<<getId()<<" release client ok"<<endl ; 
    503505         //! Free internally allocated communicators 
    504506         for (std::list<MPI_Comm>::iterator it = comms.begin(); it != comms.end(); ++it) 
     
    515517       if (countChildCtx_ == 0) 
    516518         for (int i = 0; i < clientPrimServer.size(); ++i) 
     519         { 
    517520           clientPrimServer[i]->finalize(); 
     521           bool bufferReleased; 
     522           do 
     523           { 
     524             clientPrimServer[i]->checkBuffers(); 
     525             bufferReleased = !clientPrimServer[i]->havePendingRequests(); 
     526           } while (!bufferReleased); 
     527            
     528           bool notifiedFinalized=false ; 
     529           do 
     530           { 
     531//             clientPrimServer[i]->checkBuffers(); 
     532             notifiedFinalized=clientPrimServer[i]->isNotifiedFinalized() ; 
     533           } while (!notifiedFinalized) ; 
     534           clientPrimServer[i]->releaseBuffers(); 
     535         } 
     536            
    518537 
    519538       // (Last) context finalized message received 
     
    521540       { 
    522541         // Blocking send of context finalize message to its client (e.g. primary server or model) 
    523          info(100)<<"DEBUG: context "<<getId()<<" Send client finalize<<"<<endl ; 
     542         info(100)<<"DEBUG: context "<<getId()<<" Send client finalize"<<endl ; 
    524543         client->finalize(); 
     544         info(100)<<"DEBUG: context "<<getId()<<" Client finalize sent"<<endl ; 
    525545         bool bufferReleased; 
    526546         do 
     
    529549           bufferReleased = !client->havePendingRequests(); 
    530550         } while (!bufferReleased); 
     551          
     552         bool notifiedFinalized=false ; 
     553         do 
     554         { 
     555  //         client->checkBuffers(); 
     556           notifiedFinalized=client->isNotifiedFinalized() ; 
     557         } while (!notifiedFinalized) ; 
     558         client->releaseBuffers(); 
     559          
    531560         finalized = true; 
    532  
     561         info(100)<<"DEBUG: context "<<getId()<<" bufferRelease OK"<<endl ; 
     562          
    533563         closeAllFile(); // Just move to here to make sure that server-level 1 can close files 
    534564         if (hasServer && !hasClient) 
     
    539569 
    540570         //! Deallocate client buffers 
    541          client->releaseBuffers(); 
     571//         client->releaseBuffers(); 
     572         info(100)<<"DEBUG: context "<<getId()<<" client release"<<endl ; 
     573 
     574/*          
    542575         for (int i = 0; i < clientPrimServer.size(); ++i) 
    543576           clientPrimServer[i]->releaseBuffers(); 
    544  
     577*/ 
    545578         //! Free internally allocated communicators 
    546579         for (std::list<MPI_Comm>::iterator it = comms.begin(); it != comms.end(); ++it) 
Note: See TracChangeset for help on using the changeset viewer.