Commit 09a53f7b authored by 's avatar

Added refcount delta reporting to manage_debug in the Control_Panel.

parent 17e9f372
...@@ -83,7 +83,7 @@ ...@@ -83,7 +83,7 @@
# #
############################################################################## ##############################################################################
__doc__="""System management components""" __doc__="""System management components"""
__version__='$Revision: 1.49 $'[11:-2] __version__='$Revision: 1.50 $'[11:-2]
import sys,os,time,string,Globals, Acquisition, os import sys,os,time,string,Globals, Acquisition, os
...@@ -91,6 +91,7 @@ from Globals import HTMLFile ...@@ -91,6 +91,7 @@ from Globals import HTMLFile
from OFS.ObjectManager import ObjectManager from OFS.ObjectManager import ObjectManager
from OFS.Folder import Folder from OFS.Folder import Folder
from CacheManager import CacheManager from CacheManager import CacheManager
from DateTime.DateTime import DateTime
from OFS import SimpleItem from OFS import SimpleItem
from App.Dialogs import MessageDialog from App.Dialogs import MessageDialog
from Product import ProductFolder from Product import ProductFolder
...@@ -240,23 +241,62 @@ class ApplicationManager(Folder,CacheManager): ...@@ -240,23 +241,62 @@ class ApplicationManager(Folder,CacheManager):
manage_debug=HTMLFile('debug', globals()) manage_debug=HTMLFile('debug', globals())
def get_refcounts(self, n=100, t=(type(Fake), type(Acquisition.Implicit))): # refcount snapshot info
# get class refcount info _v_rcs=None
_v_rst=None
def refcount(self, n=None, t=(type(Fake), type(Acquisition.Implicit))):
# return class reference info
dict={} dict={}
for m in sys.modules.values(): for m in sys.modules.values():
for sym in dir(m): for sym in dir(m):
ob=getattr(m, sym) ob=getattr(m, sym)
if type(ob) in t: if type(ob) in t:
dict[ob]=sys.getrefcount(ob) dict[ob]=sys.getrefcount(ob)
pairs = map(lambda x: (x[1], '%s' % x[0].__name__), dict.items()) pairs=[]
append=pairs.append
for ob, v in dict.items():
if hasattr(ob, '__module__'):
name='%s.%s' % (ob.__module__, ob.__name__)
else: name='%s' % ob.__name__
append((v, name))
pairs.sort() pairs.sort()
pairs.reverse() pairs.reverse()
if n is not None:
pairs=pairs[:n] pairs=pairs[:n]
return pairs return pairs
def refdict(self):
rc=self.refcount()
dict={}
for v, n in rc:
dict[n]=v
return dict
def rcsnapshot(self):
self._v_rcs=self.refdict()
self._v_rst=DateTime()
def rcdate(self):
return self._v_rst
def rcdeltas(self):
if self._v_rcs is None:
self.rcsnapshot()
nc=self.refdict()
rc=self._v_rcs
rd=[]
for n, c in nc.items():
prev=rc[n]
if c > prev:
rd.append( (c - prev, (c, prev, n)) )
rd.sort()
rd.reverse()
return map(lambda n: {'name': n[1][2],
'delta': n[0],
'pc': n[1][1],
'rc': n[1][0]}, rd)
......
<html> <html>
<head> <head>
<title>Debug Information</title> <title>Debug Information</title>
<style type="text/css">
<!--
.header {
font-weight: bold;
font-size: 10pt;
}
.cell {
font-size: 10pt;
}
-->
</style>
</head> </head>
<body bgcolor="#FFFFFF" link="#000099" vlink="#555555"> <body bgcolor="#FFFFFF" link="#000099" vlink="#555555">
<!--#var manage_tabs--> <!--#var manage_tabs-->
<!--#if update_snapshot-->
<!--#call rcsnapshot-->
<!--#endif-->
<h3>Debug Information</h3> <h3>Debug Information</h3>
<form> <form>
<p> <p>
...@@ -14,14 +31,54 @@ ...@@ -14,14 +31,54 @@
<li>System Platform: <!--#var sys_platform--> <li>System Platform: <!--#var sys_platform-->
<li>Process ID: <!--#var process_id--> <li>Process ID: <!--#var process_id-->
<li>Running for: <!--#var process_time--> <li>Running for: <!--#var process_time-->
<li>Refcounts: <select name="foo"><!--#in <li>Top Refcounts: <select name="foo"><!--#in
get_refcounts--><option><!--#var "refcount(100)"--><option><!--#var
sequence-item-->: <!--#var sequence-key--></option><!--#/in sequence-item-->: <!--#var sequence-key--></option><!--#/in
--></select> --></select><br><br>
<table border="1">
<!--#in rcdeltas mapping-->
<!--#if sequence-start-->
<tr>
<th class="header" align="left" valign="top">
Class
</th>
<th class="header" align="left" valign="top">
<!--#var rcdate fmt="fCommon"-->
</th>
<th class="header" align="left" valign="top">
<!--#var ZopeTime fmt="fCommon"-->
</th>
<th class="header" align="left" valign="top">
Delta
</th>
</tr>
<!--#/if-->
<tr>
<td class="cell" align="left" valign="top">
<!--#var name-->
</td>
<td class="cell" align="left" valign="top">
<!--#var pc-->
</td>
<td class="cell" align="left" valign="top">
<!--#var rc-->
</td>
<td class="cell" align="left" valign="top">
+<!--#var delta-->
</td>
</tr>
<!--#/in-->
</table>
<a href="<!--#var URL-->?update_snapshot=1">Update Snapshot</a> |
<a href="<!--#var URL-->">Refresh</a>
</ul> </ul>
</p> </p>
</form> </form>
</body> </body>
</html> </html>
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment