[Zope3-checkins] CVS: Zope3/lib/python/Zope/App/OFS/Services/ServiceManager - ServiceManager.py:1.8.6.2

Jim Fulton jim@zope.com
Fri, 18 Oct 2002 10:22:30 -0400


Update of /cvs-repository/Zope3/lib/python/Zope/App/OFS/Services/ServiceManager
In directory cvs.zope.org:/tmp/cvs-serv1609/lib/python/Zope/App/OFS/Services/ServiceManager

Modified Files:
      Tag: Zope3-Bangalore-TTW-Branch
	ServiceManager.py 
Log Message:
Fixed a bug that occurred when adding TTW adapter services.
The service manager getService method ends up needin adapters to do
it's job. When getting the adapter service, thye get service code
called code that tried to get adapters and ended up needing to get the
adapter service, which caused an infinate recursion.

Added a fix that prevents a service manager from handling getService
requests while already servicing a getService request.


=== Zope3/lib/python/Zope/App/OFS/Services/ServiceManager/ServiceManager.py 1.8.6.1 => 1.8.6.2 ===
--- Zope3/lib/python/Zope/App/OFS/Services/ServiceManager/ServiceManager.py:1.8.6.1	Thu Oct 17 13:02:44 2002
+++ Zope3/lib/python/Zope/App/OFS/Services/ServiceManager/ServiceManager.py	Fri Oct 18 10:22:29 2002
@@ -99,14 +99,26 @@
 
     def getService(self, name):
         "See Zope.ComponentArchitecture.IServiceService.IServiceService"
-        
-        service = self.__bindings.get(name)
 
-        if service:
-            service = service[0] # Get the active service directive
-            if service is not None: # not disabled
-                service = service.getService(self) # get the service
-                return service
+        # This is rather tricky. Normally, getting a service requires
+        # the use of other services, like the adapter service.  We
+        # need to be careful not to get into an infinate recursion by
+        # getting out getService to be called while looking up
+        # services, so we'll
+
+        if not getattr(self, '_v_calling', 0):
+            
+            self._v_calling = 1
+            try:
+                service = self.__bindings.get(name)
+
+                if service:
+                    service = service[0] # Get the active service directive
+                    if service is not None: # not disabled
+                        service = service.getService(self) # get the service
+                        return service
+            finally:
+                self._v_calling = 0
 
         return getNextService(self, name)