commit-gnue
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[gnue] r7057 - in trunk/gnue-common/src: datasources datasources/drivers


From: johannes
Subject: [gnue] r7057 - in trunk/gnue-common/src: datasources datasources/drivers/Base datasources/drivers/DBSIG2 logic/adapters
Date: Wed, 23 Feb 2005 10:53:59 -0600 (CST)

Author: johannes
Date: 2005-02-23 10:53:58 -0600 (Wed, 23 Feb 2005)
New Revision: 7057

Modified:
   trunk/gnue-common/src/datasources/GConditions.py
   trunk/gnue-common/src/datasources/GConnections.py
   trunk/gnue-common/src/datasources/GDataSource.py
   trunk/gnue-common/src/datasources/drivers/Base/Connection.py
   trunk/gnue-common/src/datasources/drivers/Base/ResultSet.py
   trunk/gnue-common/src/datasources/drivers/DBSIG2/Connection.py
   trunk/gnue-common/src/logic/adapters/Base.py
   trunk/gnue-common/src/logic/adapters/python.py
Log:
Some fixes to help the garbage collector doing a better job


Modified: trunk/gnue-common/src/datasources/GConditions.py
===================================================================
--- trunk/gnue-common/src/datasources/GConditions.py    2005-02-22 20:08:37 UTC 
(rev 7056)
+++ trunk/gnue-common/src/datasources/GConditions.py    2005-02-23 16:53:58 UTC 
(rev 7057)
@@ -197,6 +197,21 @@
         element.buildFromList (subitem)
 
 
+  # ---------------------------------------------------------------------------
+  # Break up all top-down references
+  # ---------------------------------------------------------------------------
+
+  def breakReferences (self):
+    """
+    This function resolves the reference to the parent instance avoiding
+    reference cycles.
+    """
+
+    self._parent = None
+    for item in self._children:
+      item.breakReferences ()
+
+
 # =============================================================================
 # Top level classes 
 # =============================================================================

Modified: trunk/gnue-common/src/datasources/GConnections.py
===================================================================
--- trunk/gnue-common/src/datasources/GConnections.py   2005-02-22 20:08:37 UTC 
(rev 7056)
+++ trunk/gnue-common/src/datasources/GConnections.py   2005-02-23 16:53:58 UTC 
(rev 7057)
@@ -510,4 +510,5 @@
       if self._authenticatedUsers.has_key (connection):
         del self._authenticatedUsers [connection]
 
-    self._openConnections = {}
+    for k in self._openConnections.keys ():
+      del self._openConnections [k]

Modified: trunk/gnue-common/src/datasources/GDataSource.py
===================================================================
--- trunk/gnue-common/src/datasources/GDataSource.py    2005-02-22 20:08:37 UTC 
(rev 7056)
+++ trunk/gnue-common/src/datasources/GDataSource.py    2005-02-23 16:53:58 UTC 
(rev 7057)
@@ -533,7 +533,35 @@
     return 1
 
 
+  def close (self):
 
+    # If we have a dataObject available, make sure it's reference to the
+    # datasource will be cleared, so garbage collection can do it's job
+    if self._dataObject is not None:
+      self._dataObject._dataSource = None
+
+    self._dataObject = None
+
+    # Make sure we leave no unreachable reference !
+    if self._topObject._datasourceDictionary.has_key (self.name):
+      del self._topObject._datasourceDictionary
+
+    self._fieldReferences = None
+    self._unboundFieldReferences = None
+    self._defaultValues = None
+    self._ignoreDispatchEvent = None
+
+    self._inits = None
+    self._currentResultSet = None
+    self._resultSetListeners = None
+    self._toplevelParent = None 
+    self._topObject = None
+    self.sorting = None
+
+    self._triggerFunctions = None
+    self._triggerProperties = None
+
+
 ######
 #
 #

Modified: trunk/gnue-common/src/datasources/drivers/Base/Connection.py
===================================================================
--- trunk/gnue-common/src/datasources/drivers/Base/Connection.py        
2005-02-22 20:08:37 UTC (rev 7056)
+++ trunk/gnue-common/src/datasources/drivers/Base/Connection.py        
2005-02-23 16:53:58 UTC (rev 7057)
@@ -62,9 +62,16 @@
     pass
 
   # Close the connection to the database backend
-  def close(self):
-    pass
+  def close (self):
 
+    # Make sure to release the reference to the connection manager as well as
+    # the introspector's instance (if available). This makes garbage collection
+    # behave nice :)
+    self.manager = None
+    if hasattr (self, 'introspector'):
+      self.introspector = None
+
+
   def connect(self, connectData):
     pass
 

Modified: trunk/gnue-common/src/datasources/drivers/Base/ResultSet.py
===================================================================
--- trunk/gnue-common/src/datasources/drivers/Base/ResultSet.py 2005-02-22 
20:08:37 UTC (rev 7056)
+++ trunk/gnue-common/src/datasources/drivers/Base/ResultSet.py 2005-02-23 
16:53:58 UTC (rev 7057)
@@ -288,13 +288,16 @@
 
   def close (self):
     """
-    This function should be closed, if a result set is no longer needed. It
+    This function should be called, if a result set is no longer needed. It
     breaks up reference cycles so garbage collection can do it's job.
     """
 
     for item in self._cachedRecords:
       item._parent = None
 
+    if self._dataObject._dataSource:
+      self._dataObject._dataSource.close ()
+
     self._dataObject    = None
     self._cachedRecords = []
     self.__listeners    = []

Modified: trunk/gnue-common/src/datasources/drivers/DBSIG2/Connection.py
===================================================================
--- trunk/gnue-common/src/datasources/drivers/DBSIG2/Connection.py      
2005-02-22 20:08:37 UTC (rev 7056)
+++ trunk/gnue-common/src/datasources/drivers/DBSIG2/Connection.py      
2005-02-23 16:53:58 UTC (rev 7057)
@@ -100,6 +100,8 @@
     """
     Close the DBSIG2 Connection.
     """
+    BaseConnection.close (self)
+
     if hasattr (self, 'native') and self.native is not None:
       self.native.close ()
     

Modified: trunk/gnue-common/src/logic/adapters/Base.py
===================================================================
--- trunk/gnue-common/src/logic/adapters/Base.py        2005-02-22 20:08:37 UTC 
(rev 7056)
+++ trunk/gnue-common/src/logic/adapters/Base.py        2005-02-23 16:53:58 UTC 
(rev 7057)
@@ -124,6 +124,21 @@
     """
     raise ImplementationError, (self.__class__, 'buildFunction ()')
 
+
+  # ---------------------------------------------------------------------------
+  # Release an execution context
+  # ---------------------------------------------------------------------------
+
+  def release (self):
+    """
+    Release an execution context: remove references in the namespace and the
+    like.
+    """
+
+    pass
+
+
+
 # =============================================================================
 # Base class of a virtual function
 # =============================================================================

Modified: trunk/gnue-common/src/logic/adapters/python.py
===================================================================
--- trunk/gnue-common/src/logic/adapters/python.py      2005-02-22 20:08:37 UTC 
(rev 7056)
+++ trunk/gnue-common/src/logic/adapters/python.py      2005-02-23 16:53:58 UTC 
(rev 7057)
@@ -118,7 +118,24 @@
   def buildFunction (self, name, code, parameters = {}):
     return PythonFunction (self, name, code, parameters)
 
+  
+  # ---------------------------------------------------------------------------
+  # Release the namespace of an execution context
+  # ---------------------------------------------------------------------------
 
+  def release (self):
+    """
+    This function releases all references held by the namespace of an execution
+    context.
+    """
+
+    for key in self._globalNS.keys ():
+      del self._globalNS [key]
+
+    for key in self._localNS.keys ():
+      del self._localNS [key]
+
+
 # =============================================================================
 # This class implements a virtual function using python
 # =============================================================================
@@ -196,22 +213,31 @@
     context's local namespace, adds all parameters to this namespace and
     executes the code.
     """
+
     try:
       localNS = copy.copy (self._context._localNS)
       localNS.update (params)
       localNS ['__namespace'] = localNS
       localNS ['abort'] = self.requestAbort
 
-      # make sure we only use safe identifiers in our namespace
-      self.__makeSafeNamespace (localNS)
+      try:
 
-      exec self._compiled in self._context._globalNS, localNS
+        # make sure we only use safe identifiers in our namespace
+        self.__makeSafeNamespace (localNS)
 
-      if localNS.has_key ('__result'):
-        return localNS ['__result']
-      else:
-        return None
+        exec self._compiled in self._context._globalNS, localNS
 
+        if localNS.has_key ('__result'):
+          return localNS ['__result']
+        else:
+          return None
+
+      finally:
+        # It's very importaint to release all references from the cloned
+        # namespace here, otherwise garbage collection won't work very well !
+        for k in localNS.keys ():
+          del localNS [k]
+
     except language.AbortRequest:
       # Pass through AbortRequests unchanged
       raise





reply via email to

[Prev in Thread] Current Thread [Next in Thread]