You are viewing a plain text version of this content. The canonical link for it is here.
Posted to java-dev@axis.apache.org by cd...@apache.org on 2005/09/15 09:08:18 UTC
svn commit: r289170 - in /webservices/axis/trunk/c/src/engine:
AppScopeHandlerPool.cpp DeserializerPool.cpp HandlerLoader.cpp
HandlerPool.cpp RequestScopeHandlerPool.cpp SerializerPool.cpp
SessionScopeHandlerPool.cpp SharedObject.h
Author: cdinapala
Date: Thu Sep 15 00:08:02 2005
New Revision: 289170
URL: http://svn.apache.org/viewcvs?rev=289170&view=rev
Log:
Applied the patch given in issue AXISCPP-345.
Reworked the SharedObject framework to use the Scoped Locking pattern.
Modified:
webservices/axis/trunk/c/src/engine/AppScopeHandlerPool.cpp
webservices/axis/trunk/c/src/engine/DeserializerPool.cpp
webservices/axis/trunk/c/src/engine/HandlerLoader.cpp
webservices/axis/trunk/c/src/engine/HandlerPool.cpp
webservices/axis/trunk/c/src/engine/RequestScopeHandlerPool.cpp
webservices/axis/trunk/c/src/engine/SerializerPool.cpp
webservices/axis/trunk/c/src/engine/SessionScopeHandlerPool.cpp
webservices/axis/trunk/c/src/engine/SharedObject.h
Modified: webservices/axis/trunk/c/src/engine/AppScopeHandlerPool.cpp
URL: http://svn.apache.org/viewcvs/webservices/axis/trunk/c/src/engine/AppScopeHandlerPool.cpp?rev=289170&r1=289169&r2=289170&view=diff
==============================================================================
--- webservices/axis/trunk/c/src/engine/AppScopeHandlerPool.cpp (original)
+++ webservices/axis/trunk/c/src/engine/AppScopeHandlerPool.cpp Thu Sep 15 00:08:02 2005
@@ -58,7 +58,8 @@
int AppScopeHandlerPool::getInstance (BasicHandler** pHandler, int nLibId)
{
- lock ();
+ //lock ();
+ Lock l(this);
int Status;
if (m_Handlers.find (nLibId) != m_Handlers.end ())
{
@@ -68,14 +69,14 @@
* application scope object. So just return SERVER_ENGINE_HANDLERBEINGUSED
*/
{
- unlock ();
+ //unlock ();
throw AxisEngineException(SERVER_ENGINE_HANDLER_BEING_USED);
}
else
{
*pHandler = m_Handlers[nLibId].front ();
m_Handlers[nLibId].pop_front ();
- unlock ();
+ //unlock ();
return AXIS_SUCCESS;
}
}
@@ -89,16 +90,17 @@
*/
m_Handlers[nLibId].clear ();
}
- unlock ();
+ //unlock ();
return Status;
}
}
int AppScopeHandlerPool::putInstance (BasicHandler* pHandler, int nLibId)
{
- lock ();
+ //lock ();
+ Lock l(this);
m_Handlers[nLibId].push_back (pHandler);
- unlock ();
+ //unlock ();
return AXIS_SUCCESS;
}
Modified: webservices/axis/trunk/c/src/engine/DeserializerPool.cpp
URL: http://svn.apache.org/viewcvs/webservices/axis/trunk/c/src/engine/DeserializerPool.cpp?rev=289170&r1=289169&r2=289170&view=diff
==============================================================================
--- webservices/axis/trunk/c/src/engine/DeserializerPool.cpp (original)
+++ webservices/axis/trunk/c/src/engine/DeserializerPool.cpp Thu Sep 15 00:08:02 2005
@@ -66,7 +66,8 @@
int DeserializerPool::getInstance (IWrapperSoapDeSerializer** ppDZ)
{
- lock ();
+ //lock ();
+ Lock l(this);
if (!m_DZList.empty ())
{
*ppDZ = m_DZList.front ();
@@ -79,12 +80,12 @@
{
delete* ppDZ;
*ppDZ = NULL;
- unlock ();
+ //unlock ();
AXISTRACE1 ("Deserializer could not be initialized", CRITICAL);
return AXIS_FAIL;
}
}
- unlock ();
+ //unlock ();
return AXIS_SUCCESS;
}
@@ -95,9 +96,10 @@
delete pDZ;
return AXIS_FAIL;
}
- lock ();
+ //lock ();
+ Lock l(this);
m_DZList.push_back (pDZ);
- unlock ();
+ //unlock ();
return AXIS_SUCCESS;
}
Modified: webservices/axis/trunk/c/src/engine/HandlerLoader.cpp
URL: http://svn.apache.org/viewcvs/webservices/axis/trunk/c/src/engine/HandlerLoader.cpp?rev=289170&r1=289169&r2=289170&view=diff
==============================================================================
--- webservices/axis/trunk/c/src/engine/HandlerLoader.cpp (original)
+++ webservices/axis/trunk/c/src/engine/HandlerLoader.cpp Thu Sep 15 00:08:02 2005
@@ -45,7 +45,8 @@
HandlerLoader::~HandlerLoader ()
{
- lock ();
+ //lock ();
+ Lock l(this);
HandlerInformation* pHandlerInfo = NULL;
for (map < int, HandlerInformation* >::iterator it =
m_HandlerInfoList.begin (); it != m_HandlerInfoList.end (); it++)
@@ -58,24 +59,26 @@
unloadLib (pHandlerInfo);
delete pHandlerInfo;
}
- unlock ();
+ //unlock ();
+ l.unlock ();
PLATFORM_LOADLIBEXIT()
}
int HandlerLoader::deleteHandler (BasicHandler* pHandler, int nLibId)
{
- lock ();
+ //lock ();
+ Lock l(this);
if (m_HandlerInfoList.find (nLibId) != m_HandlerInfoList.end ())
{
HandlerInformation* pHandlerInfo = m_HandlerInfoList[nLibId];
pHandlerInfo->m_nObjCount--;
pHandlerInfo->m_Delete (pHandler);
- if (pHandlerInfo->m_nObjCount == 0); //time to unload the DLL
- unlock ();
+ //if (pHandlerInfo->m_nObjCount == 0); //time to unload the DLL
+ // unlock ();
}
else
{
- unlock ();
+ //unlock ();
throw AxisEngineException(SERVER_ENGINE_HANDLER_NOT_LOADED);
}
return AXIS_SUCCESS;
@@ -116,7 +119,8 @@
int HandlerLoader::createHandler (BasicHandler** pHandler, int nLibId)
{
- lock ();
+ //lock ();
+ Lock l(this);
*pHandler = NULL;
HandlerInformation* pHandlerInfo = NULL;
if (m_HandlerInfoList.find (nLibId) == m_HandlerInfoList.end ())
@@ -126,7 +130,7 @@
if (pHandlerInfo->m_sLib.empty ())
{
delete pHandlerInfo;
- unlock ();
+ //unlock ();
AXISTRACE1("SERVER_CONFIG_LIBRARY_PATH_EMPTY", CRITICAL);
throw AxisConfigException(SERVER_CONFIG_LIBRARY_PATH_EMPTY);
}
@@ -144,7 +148,7 @@
{
unloadLib (pHandlerInfo);
delete pHandlerInfo;
- unlock ();
+ //unlock ();
AXISTRACE1 ("Library loading failed", CRITICAL);
throw AxisEngineException(SERVER_ENGINE_LIBRARY_LOADING_FAILED);
}
@@ -155,7 +159,7 @@
}
else
{
- unlock ();
+ //unlock ();
AXISTRACE1 ("Library loading failed", CRITICAL);
throw AxisEngineException(SERVER_ENGINE_LIBRARY_LOADING_FAILED);
}
@@ -178,7 +182,7 @@
{
pBH->_functions->fini (pBH->_object);
pHandlerInfo->m_Delete (pBH);
- unlock ();
+ //unlock ();
AXISTRACE1("SERVER_ENGINE_HANDLER_INIT_FAILED", CRITICAL);
throw AxisEngineException(SERVER_ENGINE_HANDLER_INIT_FAILED);
}
@@ -200,7 +204,7 @@
{
((HandlerBase*) pBH->_object)->fini ();
pHandlerInfo->m_Delete (pBH);
- unlock ();
+ //unlock ();
AXISTRACE1("SERVER_ENGINE_HANDLER_INIT_FAILED", CRITICAL);
throw AxisEngineException(SERVER_ENGINE_HANDLER_INIT_FAILED);
}
@@ -208,7 +212,7 @@
}
else
{
- unlock ();
+ //unlock ();
AXISTRACE1("SERVER_ENGINE_HANDLER_CREATION_FAILED", CRITICAL);
throw AxisEngineException(SERVER_ENGINE_HANDLER_CREATION_FAILED);
}
Modified: webservices/axis/trunk/c/src/engine/HandlerPool.cpp
URL: http://svn.apache.org/viewcvs/webservices/axis/trunk/c/src/engine/HandlerPool.cpp?rev=289170&r1=289169&r2=289170&view=diff
==============================================================================
--- webservices/axis/trunk/c/src/engine/HandlerPool.cpp (original)
+++ webservices/axis/trunk/c/src/engine/HandlerPool.cpp Thu Sep 15 00:08:02 2005
@@ -203,7 +203,8 @@
int HandlerPool::getHandlerChain (string &sSessionId, HandlerChain** ppChain,
const WSDDHandlerList* pHandlerList)
{
- lock ();
+ //lock ();
+ Lock l(this);
*ppChain = NULL;
HandlerChain* pChain = NULL;
// check m_ChainStore to get a HandlerChain
@@ -285,13 +286,13 @@
}
pChain->fini ();
m_ChainStore.push_back (pChain);
- unlock ();
+ //unlock ();
return Status;
}
else
{
*ppChain = pChain;
- unlock ();
+ //unlock ();
return Status;
}
}
@@ -310,9 +311,10 @@
}
}
pChain->fini ();
- lock ();
+ //lock ();
+ Lock l(this);
m_ChainStore.push_back (pChain);
- unlock ();
+ //unlock ();
}
int HandlerPool::getWebService (BasicHandler** ppHandler, string &sSessionId,
Modified: webservices/axis/trunk/c/src/engine/RequestScopeHandlerPool.cpp
URL: http://svn.apache.org/viewcvs/webservices/axis/trunk/c/src/engine/RequestScopeHandlerPool.cpp?rev=289170&r1=289169&r2=289170&view=diff
==============================================================================
--- webservices/axis/trunk/c/src/engine/RequestScopeHandlerPool.cpp (original)
+++ webservices/axis/trunk/c/src/engine/RequestScopeHandlerPool.cpp Thu Sep 15 00:08:02 2005
@@ -54,7 +54,8 @@
int RequestScopeHandlerPool::getInstance (BasicHandler** pHandler, int nLibId)
{
- lock ();
+ //lock ();
+ Lock l(this);
int Status;
if (m_Handlers.find (nLibId) != m_Handlers.end ())
{
@@ -68,14 +69,14 @@
*/
m_Handlers[nLibId].clear ();
}
- unlock ();
+ //unlock ();
return Status;
}
else
{
*pHandler = m_Handlers[nLibId].front ();
m_Handlers[nLibId].pop_front ();
- unlock ();
+ //unlock ();
return AXIS_SUCCESS;
}
}
@@ -89,14 +90,15 @@
*/
m_Handlers[nLibId].clear ();
}
- unlock ();
+ //unlock ();
return Status;
}
}
int RequestScopeHandlerPool::putInstance (BasicHandler* pHandler, int nLibId, bool bWebService)
{
- lock ();
+ //lock ();
+ Lock l(this);
if (0 != pHandler->_functions)
{
@@ -109,7 +111,7 @@
}
m_Handlers[nLibId].push_back (pHandler);
- unlock ();
+ //unlock ();
return AXIS_SUCCESS;
}
Modified: webservices/axis/trunk/c/src/engine/SerializerPool.cpp
URL: http://svn.apache.org/viewcvs/webservices/axis/trunk/c/src/engine/SerializerPool.cpp?rev=289170&r1=289169&r2=289170&view=diff
==============================================================================
--- webservices/axis/trunk/c/src/engine/SerializerPool.cpp (original)
+++ webservices/axis/trunk/c/src/engine/SerializerPool.cpp Thu Sep 15 00:08:02 2005
@@ -42,7 +42,9 @@
// Pooling should be implemented
int SerializerPool::getInstance (IWrapperSoapSerializer** ppSZ)
{
- lock ();
+ //lock ();
+ Lock l(this);
+
if (!m_SZList.empty ())
{
*ppSZ = m_SZList.front ();
@@ -61,19 +63,21 @@
{
delete *ppSZ;
*ppSZ = NULL;
- unlock ();
+ //unlock ();
AXISTRACE1 ("Serializer pool could not be initialized", CRITICAL);
return AXIS_FAIL;
}
- unlock ();
+ //unlock ();
return AXIS_SUCCESS;
}
int SerializerPool::putInstance (IWrapperSoapSerializer* pSZ)
{
- lock ();
+ //lock ();
+ Lock l(this);
+
m_SZList.push_back (pSZ);
- unlock ();
+ //unlock ();
return AXIS_SUCCESS;
}
Modified: webservices/axis/trunk/c/src/engine/SessionScopeHandlerPool.cpp
URL: http://svn.apache.org/viewcvs/webservices/axis/trunk/c/src/engine/SessionScopeHandlerPool.cpp?rev=289170&r1=289169&r2=289170&view=diff
==============================================================================
--- webservices/axis/trunk/c/src/engine/SessionScopeHandlerPool.cpp (original)
+++ webservices/axis/trunk/c/src/engine/SessionScopeHandlerPool.cpp Thu Sep 15 00:08:02 2005
@@ -61,7 +61,9 @@
int SessionScopeHandlerPool::getInstance (string &sSessionId,
BasicHandler** pHandler, int nLibId)
{
- lock ();
+ //lock ();
+ Lock l(this);
+
int Status;
if (m_Handlers.find (nLibId) != m_Handlers.end ())
{
@@ -74,14 +76,15 @@
// check in the store for reuse
if ((*pSesHandlers)[SESSIONLESSHANDLERS].empty ())
{
- unlock ();
+ //unlock ();
+ l.unlock ();
return g_pHandlerLoader->createHandler (pHandler, nLibId);
}
else
{
*pHandler = (*pSesHandlers)[SESSIONLESSHANDLERS].front ();
(*pSesHandlers)[SESSIONLESSHANDLERS].pop_front ();
- unlock ();
+ //unlock ();
return AXIS_SUCCESS;
}
}
@@ -89,10 +92,11 @@
{
*pHandler = HandlerList.front ();
HandlerList.pop_front ();
- unlock ();
+ //unlock ();
return AXIS_SUCCESS;
}
- unlock ();
+ //unlock ();
+ l.unlock ();
return g_pHandlerLoader->createHandler (pHandler, nLibId);
}
else // No handler list for this session id
@@ -100,14 +104,15 @@
// Check in the store for reuse
if ((*pSesHandlers)[SESSIONLESSHANDLERS].empty ())
{
- unlock ();
+ //unlock ();
+ l.unlock ();
return g_pHandlerLoader->createHandler (pHandler, nLibId);
}
else
{
*pHandler = (*pSesHandlers)[SESSIONLESSHANDLERS].front ();
(*pSesHandlers)[SESSIONLESSHANDLERS].pop_front ();
- unlock ();
+ //unlock ();
return AXIS_SUCCESS;
}
}
@@ -124,7 +129,7 @@
pNewSH->clear ();
m_Handlers[nLibId] = pNewSH;
}
- unlock ();
+ //unlock ();
return Status;
}
}
@@ -132,7 +137,8 @@
int SessionScopeHandlerPool::putInstance (string &sSessionId,
BasicHandler* pHandler, int nLibId)
{
- lock ();
+ //lock ();
+ Lock l(this);
SessionHandlers* pSesHandlers;
if (m_Handlers.find (nLibId) != m_Handlers.end ())
{
@@ -146,7 +152,7 @@
}
list <BasicHandler*>&HandlerList = ((*pSesHandlers)[sSessionId]);
HandlerList.push_back (pHandler);
- unlock ();
+ //unlock ();
return AXIS_SUCCESS;
}
Modified: webservices/axis/trunk/c/src/engine/SharedObject.h
URL: http://svn.apache.org/viewcvs/webservices/axis/trunk/c/src/engine/SharedObject.h?rev=289170&r1=289169&r2=289170&view=diff
==============================================================================
--- webservices/axis/trunk/c/src/engine/SharedObject.h (original)
+++ webservices/axis/trunk/c/src/engine/SharedObject.h Thu Sep 15 00:08:02 2005
@@ -46,10 +46,24 @@
public:
SharedObject ();
virtual ~ SharedObject ();
- protected:
int unlock ();
int lock ();
- private:
+
+ protected:
+ class Lock
+ {
+ public:
+ inline Lock();
+ inline Lock(SharedObject *obj);
+ inline ~Lock();
+ inline void unlock();
+
+ private:
+ SharedObject *m_locked;
+ };
+
+
+ private:
bool m_bLocked;
#ifdef WIN32
HANDLE mut;
@@ -57,6 +71,30 @@
pthread_mutex_t *mut;
#endif
};
+
+// Inline functions
+SharedObject::Lock::Lock() : m_locked(NULL)
+{}
+
+SharedObject::Lock::Lock(SharedObject *obj)
+{
+ obj->lock();
+ m_locked = obj;
+}
+
+SharedObject::Lock::~Lock()
+{
+ if (m_locked) m_locked->unlock();
+}
+
+void SharedObject::Lock::unlock()
+{
+ if (m_locked)
+ {
+ m_locked->unlock();
+ m_locked = NULL;
+ }
+}
AXIS_CPP_NAMESPACE_END