[Top][All Lists]
[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
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [gnue] r7057 - in trunk/gnue-common/src: datasources datasources/drivers/Base datasources/drivers/DBSIG2 logic/adapters,
johannes <=