Skip to content

Commit

Permalink
[XrdCl] add reference counter to FileStatusHandler, fixes #289
Browse files Browse the repository at this point in the history
  • Loading branch information
simonmichal committed Sep 25, 2015
1 parent 9f47abf commit b2ee725
Show file tree
Hide file tree
Showing 3 changed files with 51 additions and 17 deletions.
2 changes: 1 addition & 1 deletion src/XrdCl/XrdClFile.cc
Expand Up @@ -58,7 +58,7 @@ namespace XrdCl
// at this point we just give up the hope.
//--------------------------------------------------------------------------
if ( DefaultEnv::GetLog() && IsOpen() ) {XRootDStatus status = Close();}
delete pStateHandler;
pStateHandler->Destroy();
delete pPlugIn;
}

Expand Down
32 changes: 20 additions & 12 deletions src/XrdCl/XrdClFileStateHandler.cc
Expand Up @@ -61,6 +61,11 @@ namespace
{
}

virtual ~OpenHandler()
{
pStateHandler->Destroy();
}

//------------------------------------------------------------------------
// Handle the response
//------------------------------------------------------------------------
Expand Down Expand Up @@ -121,6 +126,7 @@ namespace
//------------------------------------------------------------------------
virtual ~CloseHandler()
{
pStateHandler->Destroy();
delete pMessage;
}

Expand Down Expand Up @@ -175,6 +181,7 @@ namespace
//------------------------------------------------------------------------
virtual ~StatefulHandler()
{
pStateHandler->Destroy();
delete pMessage;
delete pSendParams.chunkList;
}
Expand Down Expand Up @@ -243,7 +250,8 @@ namespace XrdCl
pDoRecoverRead( true ),
pDoRecoverWrite( true ),
pFollowRedirects( true ),
pDoneInitOpen( false )
pDoneInitOpen( false ),
pReferenceCounter(1)
{
pFileHandle = new uint8_t[4];
ResetMonitoringVars();
Expand Down Expand Up @@ -367,7 +375,7 @@ namespace XrdCl
msg->Append( path.c_str(), path.length(), 24 );

XRootDTransport::SetDescription( msg );
OpenHandler *openHandler = new OpenHandler( this, handler );
OpenHandler *openHandler = new OpenHandler( Self(), handler );
MessageSendParams params; params.timeout = timeout;
params.followRedirects = pFollowRedirects;
MessageUtils::ProcessSendParams( params );
Expand Down Expand Up @@ -424,7 +432,7 @@ namespace XrdCl

XRootDTransport::SetDescription( msg );
msg->SetSessionId( pSessionId );
CloseHandler *closeHandler = new CloseHandler( this, handler, msg );
CloseHandler *closeHandler = new CloseHandler( Self(), handler, msg );
MessageSendParams params;
params.timeout = timeout;
params.followRedirects = false;
Expand Down Expand Up @@ -498,7 +506,7 @@ namespace XrdCl
MessageUtils::ProcessSendParams( params );

XRootDTransport::SetDescription( msg );
StatefulHandler *stHandler = new StatefulHandler( this, handler, msg, params );
StatefulHandler *stHandler = new StatefulHandler( Self(), handler, msg, params );
return SendOrQueue( *pDataServer, msg, stHandler, params );
}

Expand Down Expand Up @@ -541,7 +549,7 @@ namespace XrdCl
params.chunkList = list;
MessageUtils::ProcessSendParams( params );

StatefulHandler *stHandler = new StatefulHandler( this, handler, msg, params );
StatefulHandler *stHandler = new StatefulHandler( Self(), handler, msg, params );
return SendOrQueue( *pDataServer, msg, stHandler, params );
}

Expand Down Expand Up @@ -585,7 +593,7 @@ namespace XrdCl
MessageUtils::ProcessSendParams( params );

XRootDTransport::SetDescription( msg );
StatefulHandler *stHandler = new StatefulHandler( this, handler, msg, params );
StatefulHandler *stHandler = new StatefulHandler( Self(), handler, msg, params );
return SendOrQueue( *pDataServer, msg, stHandler, params );
}

Expand Down Expand Up @@ -619,7 +627,7 @@ namespace XrdCl
MessageUtils::ProcessSendParams( params );

XRootDTransport::SetDescription( msg );
StatefulHandler *stHandler = new StatefulHandler( this, handler, msg, params );
StatefulHandler *stHandler = new StatefulHandler( Self(), handler, msg, params );
return SendOrQueue( *pDataServer, msg, stHandler, params );
}

Expand Down Expand Up @@ -655,7 +663,7 @@ namespace XrdCl
MessageUtils::ProcessSendParams( params );

XRootDTransport::SetDescription( msg );
StatefulHandler *stHandler = new StatefulHandler( this, handler, msg, params );
StatefulHandler *stHandler = new StatefulHandler( Self(), handler, msg, params );
return SendOrQueue( *pDataServer, msg, stHandler, params );
}

Expand Down Expand Up @@ -728,7 +736,7 @@ namespace XrdCl
MessageUtils::ProcessSendParams( params );

XRootDTransport::SetDescription( msg );
StatefulHandler *stHandler = new StatefulHandler( this, handler, msg, params );
StatefulHandler *stHandler = new StatefulHandler( Self(), handler, msg, params );
return SendOrQueue( *pDataServer, msg, stHandler, params );
}

Expand Down Expand Up @@ -767,7 +775,7 @@ namespace XrdCl
MessageUtils::ProcessSendParams( params );

XRootDTransport::SetDescription( msg );
StatefulHandler *stHandler = new StatefulHandler( this, handler, msg, params );
StatefulHandler *stHandler = new StatefulHandler( Self(), handler, msg, params );
return SendOrQueue( *pDataServer, msg, stHandler, params );
}

Expand Down Expand Up @@ -802,7 +810,7 @@ namespace XrdCl
MessageUtils::ProcessSendParams( params );

XRootDTransport::SetDescription( msg );
StatefulHandler *stHandler = new StatefulHandler( this, handler, msg, params );
StatefulHandler *stHandler = new StatefulHandler( Self(), handler, msg, params );
return SendOrQueue( *pDataServer, msg, stHandler, params );
}

Expand Down Expand Up @@ -1461,7 +1469,7 @@ namespace XrdCl
req->dlen = path.length();
msg->Append( path.c_str(), path.length(), 24 );

OpenHandler *openHandler = new OpenHandler( this, 0 );
OpenHandler *openHandler = new OpenHandler( Self(), 0 );
MessageSendParams params; params.timeout = timeout;
MessageUtils::ProcessSendParams( params );
XRootDTransport::SetDescription( msg );
Expand Down
34 changes: 30 additions & 4 deletions src/XrdCl/XrdClFileStateHandler.hh
Expand Up @@ -62,9 +62,25 @@ namespace XrdCl
FileStateHandler();

//------------------------------------------------------------------------
//! Destructor
//------------------------------------------------------------------------
~FileStateHandler();
//! Destructor is private - use 'Destroy' in order to delete the object
//------------------------------------------------------------------------
void Destroy()
{
XrdSysMutexHelper scopedLock( pMutex );
--pReferenceCounter;
if( pReferenceCounter == 0)
delete this;
}

//------------------------------------------------------------------------
//! Increment reference counter
//------------------------------------------------------------------------
FileStateHandler* Self()
{
XrdSysMutexHelper scopedLock( pMutex );
++pReferenceCounter;
return this;
}

//------------------------------------------------------------------------
//! Open the file pointed to by the given URL
Expand Down Expand Up @@ -305,6 +321,11 @@ namespace XrdCl
void AfterForkChild();

private:
//------------------------------------------------------------------------
//! Destructor
//------------------------------------------------------------------------
~FileStateHandler();

//------------------------------------------------------------------------
// Helper for queuing messages
//------------------------------------------------------------------------
Expand Down Expand Up @@ -403,7 +424,7 @@ namespace XrdCl
//------------------------------------------------------------------------
void MonitorClose( const XRootDStatus *status );

mutable XrdSysMutex pMutex;
mutable XrdSysRecMutex pMutex;
FileStatus pFileState;
XRootDStatus pStatus;
StatInfo *pStatInfo;
Expand Down Expand Up @@ -434,6 +455,11 @@ namespace XrdCl
uint64_t pVCount;
uint64_t pWCount;
XRootDStatus pCloseReason;

//------------------------------------------------------------------------
// Reference counter
//------------------------------------------------------------------------
size_t pReferenceCounter;
};
}

Expand Down

0 comments on commit b2ee725

Please sign in to comment.