Monday, November 08, 2010 at 12:04 AM.

system.verbs.builtins.mainResponder.utilities.getThreadStats

on getThreadStats (flIncludeHeader=true) {
	<<This script generates a human-readable report from the output of thread.getStats.
		<<10/25/01; 4:34:32 PM by PBS
		<<Changes:
			<<10/31/01; 11:27:37 AM by PBS
				<<flIncludeHeader, a new optional parameter, specifies whether or not to include general info about this copy of Radio. Set it to false when you're concatenating multiple reports into one.
	
	local (text, indentlevel = 0);
	local (fldebug = false); //set this to false when not debugging
	on add (s) {
		text = text + string.filledString ('\t', indentlevel) + s + "\n"};
	<<on isAgentsThread (id)
		<<local (adr)
		<<for adr in @system.compiler.threads
			<<if adr^ == id
				<<if nameOf (adr^) == "agents"
					<<return (true)
		<<return (false)
	on getName (id, adrName) {
		local (adr);
		for adr in @system.compiler.threads {
			if adr^ == id {
				adrName^ = nameOf (adr^);
				return (true)}};
		return (false)};
	bundle { //header
		add ("Frontier thread stats for " + user.prefs.name + " run at " + clock.now () + ".");
		add ("");
		if flIncludeHeader {
			add ("About This Installation:");
			indentlevel++;
			add ("Radio version: " + Frontier.version ());
			local (os = "Windows");
			if system.environment.isMac {
				if system.environment.isCarbon {
					os = "Mac OS X"}
				else {
					os = "Mac OS"}};
			add ("Operating System: " + os);
			local (osVersion = system.environment.osVersionString);
			if system.environment.isCarbon {
				osVersion = string.replace (osVersion, "16", "10")};
			add ("OS Version: " + osVersion);
			add ("IP address: " + tcp.dns.getMyDottedId ());
			add ("Email: " + user.prefs.mailAddress);
			add ("");
			indentlevel--}};
	local (t);
	new (tableType, @t);
	thread.getStats (@t);
	local (adr);
	for adr in @t {
		local (stats = adr^.threadStats);
		local (idThread = number (string.nthField (stats, ',', 1)));
		add ("id: " + idThread);
		indentlevel++;
		<<if isAgentsThread (idThread)
			<<add ("Agents thread")
		local (name);
		if getName (idThread, @name) {
			add ("Name: " + name)};
		bundle { //more info about the thread
			on doField (ix, label, flBoolean=false, flDate=false) {
				local (val = number (string.nthField (stats, ',', ix)));
				if flBoolean {
					val = boolean (val)};
				if flDate {
					val = date (val)};
				add (label + ": " + val)};
			doField (2, "Time Started (ticks)");
			doField (3, "Time To Wake (ticks)");
			<<doField (6, "Time to Wake", flDate:true)
			doField (4, "Time Last Got Control (ticks)");
			doField (5, "Time Slice (ticks)");
			<<doField (7, "Obsolete Boolean", true)
			doField (8, "Scheduled for execution", true);
			doField (9, "One shot", true);
			doField (10, "In control of processor", true);
			doField (11, "Called thread verb", true)};
		bundle { //do traceback
			if defined (adr^.traceback) {
				add ("");
				add ("Traceback:");
				indentlevel++;
				local (oneCall);
				for oneCall in adr^.traceback {
					add (oneCall [3]);
					indentLevel++;
					add ("Line: " + oneCall [1]);
					add ("Character: " + oneCall [2]);
					indentlevel--};
				add ("");
				indentLevel--}};
		indentlevel--;
		add ("")};
	
	if fldebug {
		wp.newTextObject (text, @temp.threadStatsText);
		edit (@temp.threadStatsText)};
	
	return (text)}



This listing is for code that runs in the OPML Editor environment. I created these listings because I wanted the search engines to index it, so that when I want to look up something in my codebase I don't have to use the much slower search functionality in my object database. Dave Winer.