aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--OpenSim/Region/ScriptEngine/XEngine/XEngine.cs146
1 files changed, 101 insertions, 45 deletions
diff --git a/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs b/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs
index eeb125e..01021c9 100644
--- a/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs
+++ b/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs
@@ -63,6 +63,14 @@ namespace OpenSim.Region.ScriptEngine.XEngine
63 { 63 {
64 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); 64 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
65 65
66 /// <summary>
67 /// Control the printing of certain debug messages.
68 /// </summary>
69 /// <remarks>
70 /// If DebugLevel >= 1, then we log every time that a script is started.
71 /// </remarks>
72// public int DebugLevel { get; set; }
73
66 private SmartThreadPool m_ThreadPool; 74 private SmartThreadPool m_ThreadPool;
67 private int m_MaxScriptQueue; 75 private int m_MaxScriptQueue;
68 private Scene m_Scene; 76 private Scene m_Scene;
@@ -284,9 +292,8 @@ namespace OpenSim.Region.ScriptEngine.XEngine
284 AppDomain.CurrentDomain.AssemblyResolve += 292 AppDomain.CurrentDomain.AssemblyResolve +=
285 OnAssemblyResolve; 293 OnAssemblyResolve;
286 294
287 m_log.InfoFormat("[XEngine] Initializing scripts in region {0}",
288 scene.RegionInfo.RegionName);
289 m_Scene = scene; 295 m_Scene = scene;
296 m_log.InfoFormat("[XEngine]: Initializing scripts in region {0}", m_Scene.RegionInfo.RegionName);
290 297
291 m_MinThreads = m_ScriptConfig.GetInt("MinThreads", 2); 298 m_MinThreads = m_ScriptConfig.GetInt("MinThreads", 2);
292 m_MaxThreads = m_ScriptConfig.GetInt("MaxThreads", 100); 299 m_MaxThreads = m_ScriptConfig.GetInt("MaxThreads", 100);
@@ -389,9 +396,42 @@ namespace OpenSim.Region.ScriptEngine.XEngine
389 "Starts all stopped scripts." 396 "Starts all stopped scripts."
390 + "If a <script-item-uuid> is given then only that script will be started. Otherwise, all suitable scripts are started.", 397 + "If a <script-item-uuid> is given then only that script will be started. Otherwise, all suitable scripts are started.",
391 (module, cmdparams) => HandleScriptsAction(cmdparams, HandleStartScript)); 398 (module, cmdparams) => HandleScriptsAction(cmdparams, HandleStartScript));
399
400// MainConsole.Instance.Commands.AddCommand(
401// "Debug", false, "debug xengine", "debug xengine [<level>]",
402// "Turn on detailed xengine debugging.",
403// "If level <= 0, then no extra logging is done.\n"
404// + "If level >= 1, then we log every time that a script is started.",
405// HandleDebugLevelCommand);
392 } 406 }
393 407
394 /// <summary> 408 /// <summary>
409 /// Change debug level
410 /// </summary>
411 /// <param name="module"></param>
412 /// <param name="args"></param>
413// private void HandleDebugLevelCommand(string module, string[] args)
414// {
415// if (args.Length == 3)
416// {
417// int newDebug;
418// if (int.TryParse(args[2], out newDebug))
419// {
420// DebugLevel = newDebug;
421// MainConsole.Instance.OutputFormat("Debug level set to {0}", newDebug);
422// }
423// }
424// else if (args.Length == 2)
425// {
426// MainConsole.Instance.OutputFormat("Current debug level is {0}", DebugLevel);
427// }
428// else
429// {
430// MainConsole.Instance.Output("Usage: debug xengine 0..1");
431// }
432// }
433
434 /// <summary>
395 /// Parse the raw item id into a script instance from the command params if it's present. 435 /// Parse the raw item id into a script instance from the command params if it's present.
396 /// </summary> 436 /// </summary>
397 /// <param name="cmdparams"></param> 437 /// <param name="cmdparams"></param>
@@ -892,8 +932,23 @@ namespace OpenSim.Region.ScriptEngine.XEngine
892 } 932 }
893 933
894 object[] o; 934 object[] o;
935
936 int scriptsStarted = 0;
937
895 while (m_CompileQueue.Dequeue(out o)) 938 while (m_CompileQueue.Dequeue(out o))
896 DoOnRezScript(o); 939 {
940 if (DoOnRezScript(o))
941 {
942 scriptsStarted++;
943
944// if (scriptsStarted % 50 == 0)
945// m_log.DebugFormat(
946// "[XEngine]: Started {0} scripts in {1}", scriptsStarted, m_Scene.RegionInfo.RegionName);
947 }
948 }
949
950// m_log.DebugFormat(
951// "[XEngine]: Completed starting {0} scripts on {1}", scriptsStarted, m_Scene.RegionInfo.RegionName);
897 952
898 // NOTE: Despite having a lockless queue, this lock is required 953 // NOTE: Despite having a lockless queue, this lock is required
899 // to make sure there is never no compile thread while there 954 // to make sure there is never no compile thread while there
@@ -1749,14 +1804,15 @@ namespace OpenSim.Region.ScriptEngine.XEngine
1749 FileMode.Open, FileAccess.Read)) 1804 FileMode.Open, FileAccess.Read))
1750 { 1805 {
1751 tfs.Read(tdata, 0, tdata.Length); 1806 tfs.Read(tdata, 0, tdata.Length);
1752 tfs.Close();
1753 } 1807 }
1754 1808
1755 assem = new System.Text.ASCIIEncoding().GetString(tdata); 1809 assem = new System.Text.ASCIIEncoding().GetString(tdata);
1756 } 1810 }
1757 catch (Exception e) 1811 catch (Exception e)
1758 { 1812 {
1759 m_log.DebugFormat("[XEngine]: Unable to open script textfile {0}, reason: {1}", assemName+".text", e.Message); 1813 m_log.ErrorFormat(
1814 "[XEngine]: Unable to open script textfile {0}{1}, reason: {2}",
1815 assemName, ".text", e.Message);
1760 } 1816 }
1761 } 1817 }
1762 } 1818 }
@@ -1773,16 +1829,15 @@ namespace OpenSim.Region.ScriptEngine.XEngine
1773 using (FileStream fs = File.Open(assemName, FileMode.Open, FileAccess.Read)) 1829 using (FileStream fs = File.Open(assemName, FileMode.Open, FileAccess.Read))
1774 { 1830 {
1775 fs.Read(data, 0, data.Length); 1831 fs.Read(data, 0, data.Length);
1776 fs.Close();
1777 } 1832 }
1778 1833
1779 assem = System.Convert.ToBase64String(data); 1834 assem = System.Convert.ToBase64String(data);
1780 } 1835 }
1781 catch (Exception e) 1836 catch (Exception e)
1782 { 1837 {
1783 m_log.DebugFormat("[XEngine]: Unable to open script assembly {0}, reason: {1}", assemName, e.Message); 1838 m_log.ErrorFormat(
1839 "[XEngine]: Unable to open script assembly {0}, reason: {1}", assemName, e.Message);
1784 } 1840 }
1785
1786 } 1841 }
1787 } 1842 }
1788 1843
@@ -1795,9 +1850,7 @@ namespace OpenSim.Region.ScriptEngine.XEngine
1795 using (StreamReader msr = new StreamReader(mfs)) 1850 using (StreamReader msr = new StreamReader(mfs))
1796 { 1851 {
1797 map = msr.ReadToEnd(); 1852 map = msr.ReadToEnd();
1798 msr.Close();
1799 } 1853 }
1800 mfs.Close();
1801 } 1854 }
1802 } 1855 }
1803 1856
@@ -1833,6 +1886,8 @@ namespace OpenSim.Region.ScriptEngine.XEngine
1833 1886
1834 public bool SetXMLState(UUID itemID, string xml) 1887 public bool SetXMLState(UUID itemID, string xml)
1835 { 1888 {
1889// m_log.DebugFormat("[XEngine]: Writing state for script item with ID {0}", itemID);
1890
1836 if (xml == String.Empty) 1891 if (xml == String.Empty)
1837 return false; 1892 return false;
1838 1893
@@ -1893,14 +1948,15 @@ namespace OpenSim.Region.ScriptEngine.XEngine
1893 { 1948 {
1894 using (FileStream fs = File.Create(path)) 1949 using (FileStream fs = File.Create(path))
1895 { 1950 {
1951// m_log.DebugFormat("[XEngine]: Writing assembly file {0}", path);
1952
1896 fs.Write(filedata, 0, filedata.Length); 1953 fs.Write(filedata, 0, filedata.Length);
1897 fs.Close();
1898 } 1954 }
1899 } 1955 }
1900 catch (IOException ex) 1956 catch (IOException ex)
1901 { 1957 {
1902 // if there already exists a file at that location, it may be locked. 1958 // if there already exists a file at that location, it may be locked.
1903 m_log.ErrorFormat("[XEngine]: File {0} already exists! {1}", path, ex.Message); 1959 m_log.ErrorFormat("[XEngine]: Error whilst writing assembly file {0}, {1}", path, ex.Message);
1904 } 1960 }
1905 1961
1906 string textpath = path + ".text"; 1962 string textpath = path + ".text";
@@ -1910,16 +1966,43 @@ namespace OpenSim.Region.ScriptEngine.XEngine
1910 { 1966 {
1911 using (StreamWriter sw = new StreamWriter(fs)) 1967 using (StreamWriter sw = new StreamWriter(fs))
1912 { 1968 {
1969// m_log.DebugFormat("[XEngine]: Writing .text file {0}", textpath);
1970
1913 sw.Write(base64); 1971 sw.Write(base64);
1914 sw.Close();
1915 } 1972 }
1916 fs.Close();
1917 } 1973 }
1918 } 1974 }
1919 catch (IOException ex) 1975 catch (IOException ex)
1920 { 1976 {
1921 // if there already exists a file at that location, it may be locked. 1977 // if there already exists a file at that location, it may be locked.
1922 m_log.ErrorFormat("[XEngine]: File {0} already exists! {1}", textpath, ex.Message); 1978 m_log.ErrorFormat("[XEngine]: Error whilst writing .text file {0}, {1}", textpath, ex.Message);
1979 }
1980 }
1981
1982 XmlNodeList mapL = rootE.GetElementsByTagName("LineMap");
1983 if (mapL.Count > 0)
1984 {
1985 XmlElement mapE = (XmlElement)mapL[0];
1986
1987 string mappath = Path.Combine(m_ScriptEnginesPath, World.RegionInfo.RegionID.ToString());
1988 mappath = Path.Combine(mappath, mapE.GetAttribute("Filename"));
1989
1990 try
1991 {
1992 using (FileStream mfs = File.Create(mappath))
1993 {
1994 using (StreamWriter msw = new StreamWriter(mfs))
1995 {
1996 // m_log.DebugFormat("[XEngine]: Writing linemap file {0}", mappath);
1997
1998 msw.Write(mapE.InnerText);
1999 }
2000 }
2001 }
2002 catch (IOException ex)
2003 {
2004 // if there already exists a file at that location, it may be locked.
2005 m_log.ErrorFormat("[XEngine]: Linemap file {0} already exists! {1}", mappath, ex.Message);
1923 } 2006 }
1924 } 2007 }
1925 } 2008 }
@@ -1933,43 +2016,16 @@ namespace OpenSim.Region.ScriptEngine.XEngine
1933 { 2016 {
1934 using (StreamWriter ssw = new StreamWriter(sfs)) 2017 using (StreamWriter ssw = new StreamWriter(sfs))
1935 { 2018 {
2019// m_log.DebugFormat("[XEngine]: Writing state file {0}", statepath);
2020
1936 ssw.Write(stateE.OuterXml); 2021 ssw.Write(stateE.OuterXml);
1937 ssw.Close();
1938 } 2022 }
1939 sfs.Close();
1940 } 2023 }
1941 } 2024 }
1942 catch (IOException ex) 2025 catch (IOException ex)
1943 { 2026 {
1944 // if there already exists a file at that location, it may be locked. 2027 // if there already exists a file at that location, it may be locked.
1945 m_log.ErrorFormat("[XEngine]: File {0} already exists! {1}", statepath, ex.Message); 2028 m_log.ErrorFormat("[XEngine]: Error whilst writing state file {0}, {1}", statepath, ex.Message);
1946 }
1947
1948 XmlNodeList mapL = rootE.GetElementsByTagName("LineMap");
1949 if (mapL.Count > 0)
1950 {
1951 XmlElement mapE = (XmlElement)mapL[0];
1952
1953 string mappath = Path.Combine(m_ScriptEnginesPath, World.RegionInfo.RegionID.ToString());
1954 mappath = Path.Combine(mappath, mapE.GetAttribute("Filename"));
1955
1956 try
1957 {
1958 using (FileStream mfs = File.Create(mappath))
1959 {
1960 using (StreamWriter msw = new StreamWriter(mfs))
1961 {
1962 msw.Write(mapE.InnerText);
1963 msw.Close();
1964 }
1965 mfs.Close();
1966 }
1967 }
1968 catch (IOException ex)
1969 {
1970 // if there already exists a file at that location, it may be locked.
1971 m_log.ErrorFormat("[XEngine]: File {0} already exists! {1}", mappath, ex.Message);
1972 }
1973 } 2029 }
1974 2030
1975 return true; 2031 return true;