Skip to content

Commit

Permalink
[XrdCl] Avoid race condition in out-queue.
Browse files Browse the repository at this point in the history
  • Loading branch information
simonmichal committed Jan 28, 2019
1 parent 13adaec commit acda120
Show file tree
Hide file tree
Showing 3 changed files with 20 additions and 2 deletions.
4 changes: 2 additions & 2 deletions src/XrdCl/XrdClInQueue.cc
Expand Up @@ -199,7 +199,7 @@ namespace XrdCl
action = it->second.first->OnStreamEvent( event, streamNum, status );

if( action & IncomingMsgHandler::RemoveHandler )
pHandlers.erase( it++ );
it = pHandlers.erase( it );
else
++it;
}
Expand All @@ -221,7 +221,7 @@ namespace XrdCl
{
it->second.first->OnStreamEvent( IncomingMsgHandler::Timeout, 0,
Status( stError, errOperationExpired ) );
pHandlers.erase( it++ );
it = pHandlers.erase( it );
}
else
++it;
Expand Down
14 changes: 14 additions & 0 deletions src/XrdCl/XrdClOutQueue.cc
Expand Up @@ -29,6 +29,7 @@ namespace XrdCl
time_t expires,
bool stateful )
{
XrdSysMutexHelper lck( pMutex );
pMessages.push_back( MsgHelper( msg, handler, expires, stateful ) );
}

Expand All @@ -40,6 +41,7 @@ namespace XrdCl
time_t expires,
bool stateful )
{
XrdSysMutexHelper lck( pMutex );
pMessages.push_front( MsgHelper( msg, handler, expires, stateful ) );
}

Expand All @@ -50,6 +52,8 @@ namespace XrdCl
time_t &expires,
bool &stateful )
{
XrdSysMutexHelper lck( pMutex );

if( pMessages.empty() )
return 0;

Expand All @@ -66,6 +70,7 @@ namespace XrdCl
//----------------------------------------------------------------------------
void OutQueue::PopFront()
{
XrdSysMutexHelper lck( pMutex );
pMessages.pop_front();
}

Expand All @@ -74,6 +79,7 @@ namespace XrdCl
//----------------------------------------------------------------------------
void OutQueue::Report( Status status )
{
XrdSysMutexHelper lck( pMutex );
MessageList::iterator it;
for( it = pMessages.begin(); it != pMessages.end(); ++it )
it->handler->OnStatusReady( it->msg, status );
Expand All @@ -84,6 +90,8 @@ namespace XrdCl
//------------------------------------------------------------------------
uint64_t OutQueue::GetSizeStateless() const
{
XrdSysMutexHelper lck( pMutex );

uint64_t size = 0;
MessageList::const_iterator it;
for( it = pMessages.begin(); it != pMessages.end(); ++it )
Expand All @@ -98,6 +106,8 @@ namespace XrdCl
//----------------------------------------------------------------------------
void OutQueue::GrabExpired( OutQueue &queue, time_t exp )
{
XrdSysMutexHelper lck( pMutex );

MessageList::iterator it;
for( it = queue.pMessages.begin(); it != queue.pMessages.end(); )
{
Expand All @@ -117,6 +127,8 @@ namespace XrdCl
//----------------------------------------------------------------------------
void OutQueue::GrabStateful( OutQueue &queue )
{
XrdSysMutexHelper lck( pMutex );

MessageList::iterator it;
for( it = queue.pMessages.begin(); it != queue.pMessages.end(); )
{
Expand All @@ -135,6 +147,8 @@ namespace XrdCl
//----------------------------------------------------------------------------
void OutQueue::GrabItems( OutQueue &queue )
{
XrdSysMutexHelper lck( pMutex );

MessageList::iterator it;
for( it = queue.pMessages.begin(); it != queue.pMessages.end(); ++it )
pMessages.push_back( *it );
Expand Down
4 changes: 4 additions & 0 deletions src/XrdCl/XrdClOutQueue.hh
Expand Up @@ -23,6 +23,8 @@
#include <utility>
#include "XrdCl/XrdClStatus.hh"

#include "XrdSys/XrdSysPthread.hh"

namespace XrdCl
{
class Message;
Expand Down Expand Up @@ -147,6 +149,8 @@ namespace XrdCl

typedef std::list<MsgHelper> MessageList;
MessageList pMessages;
mutable XrdSysMutex pMutex;

};
}

Expand Down

0 comments on commit acda120

Please sign in to comment.