-- -- Collect memory reference info. -- https://github.com/yaukeywang/LuaMemorySnapshotDump -- -- @filename MemoryReferenceInfo.lua -- @author WangYaoqi -- @date 2016-02-03 -- The global config of the mri. local cConfig = { m_bAllMemoryRefFileAddTime = true, m_bSingleMemoryRefFileAddTime = true, m_bComparedMemoryRefFileAddTime = true } -- Get the format string of date time. local function FormatDateTimeNow() local cDateTime = os.date("*t") local strDateTime = string.format("%04d%02d%02d-%02d%02d%02d", tostring(cDateTime.year), tostring(cDateTime.month), tostring(cDateTime.day), tostring(cDateTime.hour), tostring(cDateTime.min), tostring(cDateTime.sec)) return strDateTime end -- Get the string result without overrided __tostring. local function GetOriginalToStringResult(cObject) if not cObject then return "" end local cMt = getmetatable(cObject) if not cMt then return tostring(cObject) end -- Check tostring override. local strName = "" local cToString = rawget(cMt, "__tostring") if cToString then rawset(cMt, "__tostring", nil) strName = tostring(cObject) rawset(cMt, "__tostring", cToString) else strName = tostring(cObject) end return strName end -- Create a container to collect the mem ref info results. local function CreateObjectReferenceInfoContainer() -- Create new container. local cContainer = {} -- Contain [table/function] - [reference count] info. local cObjectReferenceCount = {} setmetatable(cObjectReferenceCount, {__mode = "k"}) -- Contain [table/function] - [name] info. local cObjectAddressToName = {} setmetatable(cObjectAddressToName, {__mode = "k"}) -- Set members. cContainer.m_cObjectReferenceCount = cObjectReferenceCount cContainer.m_cObjectAddressToName = cObjectAddressToName -- For stack info. cContainer.m_nStackLevel = -1 cContainer.m_strShortSrc = "None" cContainer.m_nCurrentLine = -1 return cContainer end -- Create a container to collect the mem ref info results from a dumped file. -- strFilePath - The file path. local function CreateObjectReferenceInfoContainerFromFile(strFilePath) -- Create a empty container. local cContainer = CreateObjectReferenceInfoContainer() cContainer.m_strShortSrc = strFilePath -- Cache ref info. local cRefInfo = cContainer.m_cObjectReferenceCount local cNameInfo = cContainer.m_cObjectAddressToName -- Read each line from file. local cFile = assert(io.open(strFilePath, "rb")) for strLine in cFile:lines() do local strHeader = string.sub(strLine, 1, 2) if "--" ~= strHeader then local _, _, strAddr, strName, strRefCount= string.find(strLine, "(.+)\t(.*)\t(%d+)") if strAddr then cRefInfo[strAddr] = strRefCount cNameInfo[strAddr] = strName end end end -- Close and clear file handler. io.close(cFile) cFile = nil return cContainer end -- Create a container to collect the mem ref info results from a dumped file. -- strObjectName - The object name you need to collect info. -- cObject - The object you need to collect info. local function CreateSingleObjectReferenceInfoContainer(strObjectName, cObject) -- Create new container. local cContainer = {} -- Contain [address] - [true] info. local cObjectExistTag = {} setmetatable(cObjectExistTag, {__mode = "k"}) -- Contain [name] - [true] info. local cObjectAliasName = {} -- Contain [access] - [true] info. local cObjectAccessTag = {} setmetatable(cObjectAccessTag, {__mode = "k"}) -- Set members. cContainer.m_cObjectExistTag = cObjectExistTag cContainer.m_cObjectAliasName = cObjectAliasName cContainer.m_cObjectAccessTag = cObjectAccessTag -- For stack info. cContainer.m_nStackLevel = -1 cContainer.m_strShortSrc = "None" cContainer.m_nCurrentLine = -1 -- Init with object values. cContainer.m_strObjectName = strObjectName cContainer.m_strAddressName = (("string" == type(cObject)) and ("\"" .. tostring(cObject) .. "\"")) or GetOriginalToStringResult(cObject) cContainer.m_cObjectExistTag[cObject] = true return cContainer end --
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html><head><title>Python: package ranger.ext</title>
</head><body bgcolor="#f0f0f8">
<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="heading">
<tr bgcolor="#7799ee">
<td valign=bottom> <br>
<font color="#ffffff" face="helvetica, arial"> <br><big><big><strong><a href="ranger.html"><font color="#ffffff">ranger</font></a>.ext</strong></big></big></font></td
><td align=right valign=bottom
><font color="#ffffff" face="helvetica, arial"><a href=".">index</a><br><a href="file:/home/hut/ranger/ranger/ext/__init__.py">/home/hut/ranger/ranger/ext/__init__.py</a></font></td></tr></table>
<p><tt>This package includes extensions with broader usability</tt></p>
<p>
<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
<tr bgcolor="#aa55cc">
<td colspan=3 valign=bottom> <br>
<font color="#ffffff" face="helvetica, arial"><big><strong>Package Contents</strong></big></font></td></tr>
<tr><td bgcolor="#aa55cc"><tt> </tt></td><td> </td>
<td width="100%"><table width="100%" summary="list"><tr><td width="25%" valign=top><a href="ranger.ext.accumulator.html">accumulator</a><br>
<a href="ranger.ext.command_parser.html">command_parser</a><br>
<a href="ranger.ext.curses_interrupt_handler.html">curses_interrupt_handler</a><br>
<a href="ranger.ext.direction.html">direction</a><br>
</td><td width="25%" valign=top><a href="ranger.ext.get_executables.html">get_executables</a><br>
<a href="ranger.ext.human_readable.html">human_readable</a><br>
<a href="ranger.ext.iter_tools.html">iter_tools</a><br>
<a href="ranger.ext.keybinding_parser.html">keybinding_parser</a><br>
</td><td width="25%" valign=top><a href="ranger.ext.mount_path.html">mount_path</a><br>
<a href="ranger.ext.move.html">move</a><br>
<a href="ranger.ext.openstruct.html">openstruct</a><br>
<a href="ranger.ext.shell_escape.html">shell_escape</a><br>
</td><td width="25%" valign=top><a href="ranger.ext.shutil_generatorized.html">shutil_generatorized</a><br>
<a href="ranger.ext.signal_dispatcher.html">signal_dispatcher</a><br>
<a href="ranger.ext.tree.html">tree</a><br>
<a href="ranger.ext.waitpid_no_intr.html">waitpid_no_intr</a><br>
</td></tr></table></td></tr></table>
</body></html>