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