<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Tedds blog &#187; OpenSim</title>
	<atom:link href="http://blog.tedd.no/index.php/category/opensim/feed" rel="self" type="application/rss+xml" />
	<link>http://blog.tedd.no</link>
	<description></description>
	<lastBuildDate>Thu, 19 Apr 2012 10:28:59 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<item>
		<title>Fibres / Microthreading / User space threading</title>
		<link>http://blog.tedd.no/2010/03/20/fibres-microthreading-user-space-threading/</link>
		<comments>http://blog.tedd.no/2010/03/20/fibres-microthreading-user-space-threading/#comments</comments>
		<pubDate>Sat, 20 Mar 2010 08:25:35 +0000</pubDate>
		<dc:creator>tedd</dc:creator>
				<category><![CDATA[Coding]]></category>
		<category><![CDATA[OpenSim]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Fibers]]></category>
		<category><![CDATA[Microthreading]]></category>
		<category><![CDATA[MSIL]]></category>

		<guid isPermaLink="false">http://teddhansen.wordpress.com/2010/03/20/fibres-microthreading-user-space-threading/</guid>
		<description><![CDATA[… yes… even with the cool new advances within multiprocessing we still need more… What we need and what we have OpenSim needs to be able to: Compile user scripts, supporting a in a wide variety of languages. Implemented Run them in a secure sandbox as we don’t trust the users or other servers where [...]]]></description>
			<content:encoded><![CDATA[<p>… yes… even with the cool new advances within multiprocessing we still need more… <img src='http://blog.tedd.no/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<h1>What we need and what we have</h1>
<p>OpenSim needs to be able to:</p>
<ol>
<li>Compile user scripts, supporting a in a wide variety of languages.<br />
Implemented</li>
<li>Run them in a secure sandbox as we don’t trust the users or other servers where scripts/binaries may come from.<br />
Implemented</li>
<li>Schedule thousands of scripts fairly, potentially could all of them run tight while(true)-loops.<br />
<em>Partially implemented</em></li>
<li>Be able to save a running program to disk for later to load and resume it.<br />
<em>Partially implemented</em></li>
<li>Be able to move a script to a new region (server) while it is running.<br />
<em>Partially implemented</em></li>
</ol>
<p>#3: Since modern computers today don’t have any problem running thousands of scripts we can already run a massive amount of scripts on a single OpenSim server. Currently a running script occupies a whole thread and needs to voluntarily release execution.</p>
<p>#4: Scripts are killed at shutdown and fully restarted at startup. We are not saving any state (afaik).</p>
<p>#5: Scripts can’t be moved successfully between servers while they are running (afaik).</p>
<h1>Fiber support</h1>
<p>As you may have guessed from the title the solution is to add support for fibers. While threads are controlled and enforced by the operating system kernel, fibers are more like a voluntary threading happening inside the application (in user space).</p>
<p>Most operative systems have some kind of library for fibers, and it used to be a popular way of multitasking. MS-SQL server for example used it for quite some time.</p>
<h1>OS fiber implementation</h1>
<p>I have done some reading and tests of NT fibers… (Win32 API: ConvertThreadToFiber, CreateFiber, SwitchToFiber, DeleteFiber, GetLastError) Although it is easy to implement and could be made to work I’ve read a few places that it doesn’t work well with .Net. This could probably be made to work as the scripts are performing private executions and will not crash into each other. Though the .Net thread locking/mutex system is useless as it only blocks when attempting to lock something other threads has locked. It does however still require us to modify the script before compile or script assembly before load as we need to voluntarily  release control to next fiber. It does however keep track of execution and parameter stacks for us.</p>
<p>The problem with this implementation is that it only solves #3, it doesn’t solve #4 and #5. It also has to be implemented specifically for each OS. My tests were on Win32 API.</p>
<h1>Custom fiber implementation</h1>
<p>From what I can see custom fiber implementation is probably the way to go.</p>
<h3>How it works</h3>
<ol>
<li>User uploads script (source) to OpenSim region.</li>
<li>Script is compiled to an .Net assembly (*.dll) and saved to disk.</li>
<li>The .Net assembly is opened up and processed (at bytecode/binary level) by injecting fiber code into it. A new .Net assembly is generated and saved, we now have two .Net assemblies (one with and one without fiber support.)</li>
<li>The .Net assembly with fiber code is loaded into a secure AppDomain and executed as normally.</li>
<li>Whenever the server needs to pause the script it sets a global variable like “__ISPAUSING” to true on it. The script will then within a short time pause and release the thread.</li>
<li>Server keeps accounting of what scripts has used much CPU and schedules accordingly to give fair scheduling, for example by calculating a simple 10 second usage score.</li>
<li>The running script can when its paused be serialized, saved to disk (during shutdown) and later reloaded (during startup).</li>
<li>Server can at any time resume script by executing “__RESUME()” method on it.</li>
<li>If script crosses region border it will often be sent to a different server. It is here necessary with three trust levels.
<ol>
<li>If the neighboring server trusts the server then it can send the already fiberized script assembly. Typically servers with same owner will do this.</li>
<li>If there is no trust then there are two possibilities:
<ol>
<li>Server sends script source code to neighbor server which compiles the script itself. (safe)</li>
<li>Server sends the original .Net assembly (without fiber implementation) to neighbor and neighbor implements fibers. (unsafe)<br />
Because there are no good (afaik) bytecode verifiers for Mono and because of unknown factors (is bytecode verifier really checking everything?) it could potentially be a security risk to execute third party assemblies. The reason is simply that the bytecode could be invalid and used to gain access to the server (even though .Net can’t buffer overflow easily it doesn’t mean that the bytecode can’t).</li>
</ol>
</li>
</ol>
</li>
</ol>
<h3>Implementing it</h3>
<p>I have been working on this on and off for a month or so now and made great progress. I am using Mono.Cecil to open up the .Net assembly (*.dll), go through everything machine code by machine code and add code at the right places.</p>
<p>The idea is to inject code at the start of each method and before some/all jumps (GOTO-statements.) This code consists of two steps, pausing and resuming script execution. We want to check for pause often time-wise, but not too often CPU-wise. This means that we want to check if script is pausing at all points in the code so that the user can’t make a script that spends 200ms of CPU-time without obeying the pause-signal. But we don’t want to keep checking after every instruction as it will use too much CPU.</p>
<p>I think a reasonable tradeoff is to place the pause-check code at the beginning of every method, just after the method call and before most of the JUMP-instructions (GOTO in assembler.) Every check consists of 10 instructions of which 3 are “Nop” (No operation). It is basically a simple “if (__ISPAUSING) { do_pause(); }” where __ISPAUSING will be False most of the time. We only need to add it around custom local methods (private/internal/public methods inside the script), thus avoiding the overhead of checking 3 times on a simple “string r = s.Replace(“est”, “EST”).ToLower() + intA”. All loops (while, do, for, foreach, etc) are converted to JUMP instructions when compiled, so by adding pause-check around some JUMPS we will get pause-check inside all loops. (Though not all jumps are loops.)</p>
<p>The check will be placed at the top of each method:</p>
<ol>
<li>If __ISPAUSING is set: Return immediately.</li>
<li>If __ISRESUMING is set:
<ol>
<li>Jump to location where we were paused last.</li>
<li>Resume execution.</li>
<li>If last pause was not started locally then next jump will be a custom local method. So we feed it with dummy-variables.<br />
To make implementation easier we could replace all Value method parameters with “object” (do boxing/unboxing) and cast them back at start of method.</li>
</ol>
</li>
<li>For each<br />
void myMethod() {<br />
if (__ISRESUMING) {</li>
<p>// Get my current stack<br />
_currentStack = ScriptStack.Pop();<br />
  switch (<br />
  goto LABEL_PAUSELOC15;<br />
}</p>
<p>if (__ISPAUSED) {<br />
  // TODO: Save argument stack<br />
  // TODO: Save local variables (that only exist within the method scope)<br />
  // TODO: Push argument stack, local variables and pointer to current pos to execution stack<br />
  return;<br />
}<br />
}</p>
<li>etc… More to come.. I’m tired!</li>
</ol>
<p> </p>
<p>I still have at least one problem to overcome…</p>
<ol>
<li>I need to keep track of the argument stack so that it can be saved and restored into serializable private fields when pausing. Currently it almost works, but I loose track on overloaded methods (method with multiple parameters), for example on “call instance string [mscorlib]System.Int32::ToString()”. The obvious solution here is to compare method signatures with the data on the parameter stack. It seems a bit expensive, but I guess it can be cached fairly well.</li>
<li>Probably more, just too tired to think right now <img src='http://blog.tedd.no/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </li>
</ol>
<h1>Proof of concept hardcoded fibers, version 1</h1>
<h2>Output</h2>
<p>myMethod() start: Stack size: 0, SkipMethod: &lt;null&gt;, __ISPAUSING: False, __ISPAUSING_INPROGRESS: False, __ISRESUMING: False<br />
myMethod() start: Stack size: 0, SkipMethod: &lt;null&gt;, __ISPAUSING: False, __ISPAUSING_INPROGRESS: False, __ISRESUMING: False<br />
myMethod() start: Stack size: 0, SkipMethod: &lt;null&gt;, __ISPAUSING: False, __ISPAUSING_INPROGRESS: False, __ISRESUMING: False<br />
myMethod() start: Stack size: 0, SkipMethod: &lt;null&gt;, __ISPAUSING: False, __ISPAUSING_INPROGRESS: False, __ISRESUMING: False<br />
myMethod() start: Stack size: 0, SkipMethod: &lt;null&gt;, __ISPAUSING: False, __ISPAUSING_INPROGRESS: False, __ISRESUMING: False<br />
myMethod() start: Stack size: 0, SkipMethod: &lt;null&gt;, __ISPAUSING: True, __ISPAUSING_INPROGRESS: False, __ISRESUMING: False<br />
myMethod() pausing: Stack size: 1, SkipMethod: True, __ISPAUSING: True, __ISPAUSING_INPROGRESS: True, __ISRESUMING: True<br />
myMethod() pausing: Stack size: 2, SkipMethod: False, __ISPAUSING: True, __ISPAUSING_INPROGRESS: True, __ISRESUMING: True<br />
myMethod() pausing: Stack size: 3, SkipMethod: False, __ISPAUSING: True, __ISPAUSING_INPROGRESS: True, __ISRESUMING: True<br />
myMethod() pausing: Stack size: 4, SkipMethod: False, __ISPAUSING: True, __ISPAUSING_INPROGRESS: True, __ISRESUMING: True<br />
myMethod() pausing: Stack size: 5, SkipMethod: False, __ISPAUSING: True, __ISPAUSING_INPROGRESS: True, __ISRESUMING: True<br />
myMethod() pausing: Stack size: 6, SkipMethod: False, __ISPAUSING: True, __ISPAUSING_INPROGRESS: True, __ISRESUMING: True</p>
<p>ExecuteHardcodedTestThread_Resume</p>
<p>myMethod() resume: Stack size: 5, SkipMethod: False, __ISPAUSING: False, __ISPAUSING_INPROGRESS: False, __ISRESUMING: True<br />
myMethod() resume: Stack size: 4, SkipMethod: False, __ISPAUSING: False, __ISPAUSING_INPROGRESS: False, __ISRESUMING: True<br />
myMethod() resume: Stack size: 3, SkipMethod: False, __ISPAUSING: False, __ISPAUSING_INPROGRESS: False, __ISRESUMING: True<br />
myMethod() resume: Stack size: 2, SkipMethod: False, __ISPAUSING: False, __ISPAUSING_INPROGRESS: False, __ISRESUMING: True<br />
myMethod() resume: Stack size: 1, SkipMethod: False, __ISPAUSING: False, __ISPAUSING_INPROGRESS: False, __ISRESUMING: True<br />
myMethod() resume: Stack size: 0, SkipMethod: True, __ISPAUSING: False, __ISPAUSING_INPROGRESS: False, __ISRESUMING: False<br />
myMethod() returning naturally: Stack size: 0, SkipMethod: True, __ISPAUSING: False, __ISPAUSING_INPROGRESS: False, __ISRESUMING: False<br />
myMethod() start: Stack size: 0, SkipMethod: &lt;null&gt;, __ISPAUSING: False, __ISPAUSING_INPROGRESS: False, __ISRESUMING: False<br />
myMethod() start: Stack size: 0, SkipMethod: &lt;null&gt;, __ISPAUSING: False, __ISPAUSING_INPROGRESS: False, __ISRESUMING: False<br />
myMethod() start: Stack size: 0, SkipMethod: &lt;null&gt;, __ISPAUSING: False, __ISPAUSING_INPROGRESS: False, __ISRESUMING: False<br />
myMethod() start: Stack size: 0, SkipMethod: &lt;null&gt;, __ISPAUSING: True, __ISPAUSING_INPROGRESS: False, __ISRESUMING: False<br />
myMethod() pausing: Stack size: 1, SkipMethod: True, __ISPAUSING: True, __ISPAUSING_INPROGRESS: True, __ISRESUMING: True<br />
myMethod() pausing: Stack size: 2, SkipMethod: False, __ISPAUSING: True, __ISPAUSING_INPROGRESS: True, __ISRESUMING: True<br />
myMethod() pausing: Stack size: 3, SkipMethod: False, __ISPAUSING: True, __ISPAUSING_INPROGRESS: True, __ISRESUMING: True<br />
myMethod() pausing: Stack size: 4, SkipMethod: False, __ISPAUSING: True, __ISPAUSING_INPROGRESS: True, __ISRESUMING: True<br />
myMethod() pausing: Stack size: 5, SkipMethod: False, __ISPAUSING: True, __ISPAUSING_INPROGRESS: True, __ISRESUMING: True<br />
myMethod() pausing: Stack size: 6, SkipMethod: False, __ISPAUSING: True, __ISPAUSING_INPROGRESS: True, __ISRESUMING: True<br />
myMethod() pausing: Stack size: 7, SkipMethod: False, __ISPAUSING: True, __ISPAUSING_INPROGRESS: True, __ISRESUMING: True<br />
myMethod() pausing: Stack size: 8, SkipMethod: False, __ISPAUSING: True, __ISPAUSING_INPROGRESS: True, __ISRESUMING: True<br />
myMethod() pausing: Stack size: 9, SkipMethod: False, __ISPAUSING: True, __ISPAUSING_INPROGRESS: True, __ISRESUMING: True</p>
<p>myMethod() resume: Stack size: 8, SkipMethod: False, __ISPAUSING: False, __ISPAUSING_INPROGRESS: False, __ISRESUMING: True<br />
myMethod() resume: Stack size: 7, SkipMethod: False, __ISPAUSING: False, __ISPAUSING_INPROGRESS: False, __ISRESUMING: True<br />
myMethod() resume: Stack size: 6, SkipMethod: False, __ISPAUSING: False, __ISPAUSING_INPROGRESS: False, __ISRESUMING: True<br />
myMethod() resume: Stack size: 5, SkipMethod: False, __ISPAUSING: False, __ISPAUSING_INPROGRESS: False, __ISRESUMING: True<br />
myMethod() resume: Stack size: 4, SkipMethod: False, __ISPAUSING: False, __ISPAUSING_INPROGRESS: False, __ISRESUMING: True<br />
myMethod() resume: Stack size: 3, SkipMethod: False, __ISPAUSING: False, __ISPAUSING_INPROGRESS: False, __ISRESUMING: True<br />
myMethod() resume: Stack size: 2, SkipMethod: False, __ISPAUSING: False, __ISPAUSING_INPROGRESS: False, __ISRESUMING: True<br />
myMethod() resume: Stack size: 1, SkipMethod: False, __ISPAUSING: False, __ISPAUSING_INPROGRESS: False, __ISRESUMING: True<br />
myMethod() resume: Stack size: 0, SkipMethod: True, __ISPAUSING: False, __ISPAUSING_INPROGRESS: False, __ISRESUMING: False<br />
myMethod() returning naturally: Stack size: 0, SkipMethod: True, __ISPAUSING: False, __ISPAUSING_INPROGRESS: False, __ISRESUMING: False<br />
myMethod() start: Stack size: 0, SkipMethod: &lt;null&gt;, __ISPAUSING: False, __ISPAUSING_INPROGRESS: False, __ISRESUMING: False<br />
myMethod() start: Stack size: 0, SkipMethod: &lt;null&gt;, __ISPAUSING: False, __ISPAUSING_INPROGRESS: False, __ISRESUMING: False<br />
myMethod() start: Stack size: 0, SkipMethod: &lt;null&gt;, __ISPAUSING: False, __ISPAUSING_INPROGRESS: False, __ISRESUMING: False</p>
<h2>Code</h2>
<p>[sourcecode type="c#"]<br />
using System;<br />
using System.Collections.Generic;<br />
using System.Diagnostics;<br />
using System.Threading;</p>
<p>namespace Tedd.Fibres.TestModule<br />
{<br />
    public class HardcodedTest<br />
    {<br />
        private bool __ISPAUSING;<br />
        private bool __ISPAUSING_INPROGRESS;<br />
        private bool __ISRESUMING<br />
        {<br />
            get<br />
            {<br />
                return __ScriptStack.Count &amp;gt; 0;<br />
            }<br />
        }<br />
        private ScriptStack __ScriptStack = new ScriptStack();<br />
        private class ScriptStack<br />
        {<br />
            private Stack&amp;lt;ScriptStackItem&amp;gt; _Stack = new Stack&amp;lt;ScriptStackItem&amp;gt;();<br />
            public ScriptStackItem Pop()<br />
            {<br />
                return _Stack.Pop();<br />
            }<br />
            public void Push(ScriptStackItem scriptStackItem)<br />
            {<br />
                _Stack.Push(scriptStackItem);<br />
            }</p>
<p>            public int Count<br />
            {<br />
                get<br />
                {<br />
                    return _Stack.Count;<br />
                }<br />
            }<br />
        }<br />
        private class LocalVarObject_17<br />
        {<br />
            internal int VARIABLE1;<br />
            internal string VARIABLE2;<br />
            internal object VARIABLE3;<br />
        }<br />
        private int LOCALVARIABLE1;<br />
        private string LOCALVARIABLE2;<br />
        private object LOCALVARIABLE3;<br />
        private class ScriptStackItem<br />
        {<br />
            public Int16 LastPos;<br />
            public object[] ArgumentStack;<br />
            public object LocalVars;<br />
            public bool SkipMethod;<br />
        }<br />
        private string GetStatus(ScriptStackItem scriptStackItem)<br />
        {<br />
            string sm = &quot;&amp;lt;null&amp;gt;&quot;;<br />
            if (scriptStackItem != null)<br />
                sm = scriptStackItem.SkipMethod.ToString();</p>
<p>            return &quot;Stack size: &quot; + __ScriptStack.Count<br />
                   + &quot;, SkipMethod: &quot; + sm<br />
                   + &quot;, __ISPAUSING: &quot; + __ISPAUSING<br />
                   + &quot;, __ISPAUSING_INPROGRESS: &quot; + __ISPAUSING_INPROGRESS<br />
                   + &quot;, __ISRESUMING: &quot; + __ISRESUMING;</p>
<p>        }</p>
<p>        /// &amp;lt;summary&amp;gt;<br />
        /// Is script currently paused in the middle of execution?<br />
        /// &amp;lt;/summary&amp;gt;<br />
        public bool __CANRESUME<br />
        {<br />
            get<br />
            {<br />
                return ResumeMethod != 0;<br />
            }<br />
        }<br />
        // ResumeMethod has a numeric value to bind it to the root method where execution is paused from right now. 0 = Not paused.<br />
        private UInt16 ResumeMethod = 0;</p>
<p>        public void __PAUSE()<br />
        {<br />
            __ISPAUSING = true;<br />
        }</p>
<p>        public void __RESUME()<br />
        {<br />
            // Reset some variables<br />
            __ISPAUSING_INPROGRESS = false;<br />
            __ISPAUSING = false;</p>
<p>            // Resume to correct method<br />
            switch (ResumeMethod)<br />
            {<br />
                case 0:<br />
                    // Nothing to resume<br />
                    break;<br />
                case 1:<br />
                    myMethod();<br />
                    break;<br />
                case 2:<br />
                    mySecondMethod(0, null);<br />
                    break;<br />
            }</p>
<p>            // We are not pausing? Then next time we shouldn&#8217;t have any method to resume on<br />
            if (!__ISPAUSING)<br />
                ResumeMethod = 0;</p>
<p>            return;<br />
        }</p>
<p>        public void myMethod()<br />
        {<br />
            // Hardcoded set<br />
            if (ResumeMethod == 0)<br />
                ResumeMethod = 1;</p>
<p>            // We need a local scoped bool to keep track stack<br />
            bool lastMethodWasInStack = false;      // Was last method executed by stack restore?<br />
            ScriptStackItem currentStack = null;    // Our local stack object</p>
<p>            // Anything on the stack?<br />
            if (__ScriptStack.Count &amp;gt; 0)<br />
            {<br />
                // Yes we have a stack: Get stack item for local stack/locals/pos/etc<br />
                currentStack = __ScriptStack.Pop();</p>
<p>                // We got an item so we are resuming to somewhere<br />
                if (currentStack != null)<br />
                {<br />
                    Debug.WriteLine(&quot;myMethod() resume: &quot; + GetStatus(currentStack));<br />
                    //<br />
                    // JUMP TO LAST PAUSE-POSITION<br />
                    //<br />
                    // First set next jump to 0 (nothing)<br />
                    Int16 lastPos = currentStack.LastPos;<br />
                    currentStack.LastPos = 0;<br />
                    switch (lastPos)<br />
                    {<br />
                        case 0:<br />
                            // No jump? Something wrong?<br />
                            throw new ApplicationException(&quot;We are restoring stack, but it contains no last position to jump to.This needs to be debugged&#8230; <img src='http://blog.tedd.no/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> &quot;);<br />
                            break;<br />
                        case 1:<br />
                            goto LABEL_PAUSE_LOC_1;<br />
                            //case 2:<br />
                            //    goto LABEL_PAUSE_LOC_2;<br />
                            //case 3:<br />
                            //    goto LABEL_PAUSE_LOC_3;<br />
                    }<br />
                }<br />
            }<br />
            else<br />
            {<br />
                // We are done with resume<br />
                //__ISRESUMING = false;<br />
                Debug.WriteLine(&quot;myMethod() start: &quot; + GetStatus(currentStack));</p>
<p>                // Are we entering pause?<br />
                if (__ISPAUSING)<br />
                    goto LABEL_PAUSE_PROCESS_1;</p>
<p>            }</p>
<p>            //////////////////////////////////////<br />
            // ORIGINAL USER SCRIPT STARTS HERE //<br />
            // bla bla bla                      //<br />
            // script script script             //<br />
            /////////////////////////////////////////////////////////////////////////////////////////////////////////////<br />
            // User has a local method called &quot;MySecondMethod(int, string)&quot;. We add our stack restore/pause around it. //<br />
            /////////////////////////////////////////////////////////////////////////////////////////////////////////////</p>
<p>            string ret = null;</p>
<p>            Debug.WriteLine(&quot;myMethod() execution: Natural&quot;);</p>
<p>            // Our first restore position &#8212; this is where we jump if we are restoring to this point<br />
            LABEL_PAUSE_LOC_1:</p>
<p>            // Are we restoring from pause? If currentStack is null then we came here naturally.<br />
            if (currentStack != null)<br />
            {<br />
                // We have currentStack, so we are restoring&#8230;</p>
<p>                // This keeps track of if custom method is executed by us as part of a stack restore or not<br />
                lastMethodWasInStack = false;</p>
<p>                // Is there more on stack? If so we move one more down the stack by executing the custom method<br />
                // SkipMethod = we are not executing method in this restore<br />
                if (__ScriptStack.Count &amp;gt; 0 &amp;amp;&amp;amp; !currentStack.SkipMethod)<br />
                {<br />
                    // Yes, we should continue into this method. No need to restore our stack/locals just yet.<br />
                    // Just fake our way into this method, we will restore local variables once we get there anyway.<br />
                    Debug.WriteLine(&quot;myMethod() enter child: Resume&quot;);<br />
                    ret = mySecondMethod(0, null);<br />
                    // We have executed the custom method<br />
                    lastMethodWasInStack = false;<br />
                }</p>
<p>                // If we are not going into pause mode then custom methd has finished by itself and we need to restore stack/locals to continue execution here<br />
                if (!__ISPAUSING)<br />
                {<br />
                    //<br />
                    // START RESTORE OF STACK/LOCALS<br />
                    //</p>
<p>                    // Restore local variables (that only exist within the method scope)<br />
                    if (currentStack.LocalVars == null)<br />
                    {<br />
                        LocalVarObject_17 lvo = currentStack.LocalVars as LocalVarObject_17;<br />
                        LOCALVARIABLE1 = lvo.VARIABLE1;<br />
                        LOCALVARIABLE2 = lvo.VARIABLE2;<br />
                        LOCALVARIABLE3 = lvo.VARIABLE3;<br />
                    }</p>
<p>                    // TODO: Restore argument stack<br />
                    // Can&#8217;t be described in C#. Basically we ldstr stuff from object array to argument stack.<br />
                    // { arg0, arg1, arg2 } = currentStack.ArgumentStack;</p>
<p>                    //<br />
                    // RESTORE DONE<br />
                    //<br />
                }</p>
<p>                // We want to skip the custom method because the pause happened after the method returned<br />
                if (currentStack.SkipMethod)<br />
                    lastMethodWasInStack = true;</p>
<p>                // We are done with resume<br />
                //__ISRESUMING = false;</p>
<p>            }</p>
<p>            // If we are not pausing and we did not call this method in the above stack restore code then we have come here naturally and it should be executed naturally<br />
            if (!__ISPAUSING_INPROGRESS &amp;amp;&amp;amp; !lastMethodWasInStack)<br />
            {<br />
                Debug.WriteLine(&quot;myMethod() enter child: Natural&quot;);<br />
                ret = mySecondMethod(LOCALVARIABLE1, &quot;param&quot;);<br />
            }</p>
<p>            LABEL_PAUSE_PROCESS_1:<br />
            // We just exited a local method (either naturally or by PAUSE-return): Check if we are about to pause&#8230;<br />
            if (__ISPAUSING)<br />
            {<br />
                if (currentStack == null)<br />
                    currentStack = new ScriptStackItem();</p>
<p>                // If this is where the pause starts<br />
                if (!__ISPAUSING_INPROGRESS)<br />
                {<br />
                    __ISPAUSING_INPROGRESS = true;<br />
                    // .. then we should not execute custom method when restoring next time (as it is above us in code)<br />
                    // TODO: This is set to true to fix a bug where it doesn&#8217;t execute custom method on last resume step, causing everything to exit<br />
                    // TODO: Needs fixing&#8230; things work now, but not sure how well it would work on all types of scripts<br />
                    currentStack.SkipMethod = true;<br />
                }</p>
<p>                // Set restore position<br />
                currentStack.LastPos = 1;</p>
<p>                // TODO: Save argument stack<br />
                // arg0, arg1 and arg2 are automatically generated to match current argument position<br />
                // Can&#8217;t be done in C#: currentStack.ArgumentStack = new object[] { arg0, arg1, arg2 };</p>
<p>                // Save local variables (that only exist within the method scope)<br />
                // NOTE: LocalVarObject_17 is an automatically generated object which contains a mirror set for the local fields in this scope.<br />
                if (currentStack.LocalVars == null)<br />
                    currentStack.LocalVars = new LocalVarObject_17();</p>
<p>                LocalVarObject_17 lvo = currentStack.LocalVars as LocalVarObject_17;<br />
                lvo.VARIABLE1 = LOCALVARIABLE1;<br />
                lvo.VARIABLE2 = LOCALVARIABLE2;<br />
                lvo.VARIABLE2 = LOCALVARIABLE2;</p>
<p>                // Add current state to ScriptStack<br />
                __ScriptStack.Push(currentStack);</p>
<p>                Debug.WriteLine(&quot;myMethod() pausing: &quot; + GetStatus(currentStack));<br />
                // Then return<br />
                return;<br />
            }</p>
<p>            ///////////////////////////////////////<br />
            // ORIGINAL USER SCRIPT RESUMES HERE //<br />
            // bla bla bla                       //<br />
            // script script script              //<br />
            ///////////////////////////////////////<br />
            Debug.WriteLine(&quot;myMethod() returning naturally: &quot; + GetStatus(currentStack));<br />
            return;<br />
        }</p>
<p>        public string mySecondMethod(int i, string s)<br />
        {<br />
            // Hardcoded set<br />
            if (ResumeMethod == 0)<br />
                ResumeMethod = 2;</p>
<p>            // If we are restoring then skip the delay<br />
            if (__ScriptStack.Count == 0)<br />
                Thread.Sleep(500);</p>
<p>            myMethod();</p>
<p>            return s;<br />
        }<br />
    }<br />
}<br />
[/sourcecode]</p>
<p><a class="a2a_button_facebook" href="http://www.addtoany.com/add_to/facebook?linkurl=http%3A%2F%2Fblog.tedd.no%2F2010%2F03%2F20%2Ffibres-microthreading-user-space-threading%2F&amp;linkname=Fibres%20%2F%20Microthreading%20%2F%20User%20space%20threading" title="Facebook" rel="nofollow" target="_blank"><img src="http://blog.tedd.no/wp-content/plugins/add-to-any/icons/facebook.png" width="16" height="16" alt="Facebook"/></a><a class="a2a_button_linkedin" href="http://www.addtoany.com/add_to/linkedin?linkurl=http%3A%2F%2Fblog.tedd.no%2F2010%2F03%2F20%2Ffibres-microthreading-user-space-threading%2F&amp;linkname=Fibres%20%2F%20Microthreading%20%2F%20User%20space%20threading" title="LinkedIn" rel="nofollow" target="_blank"><img src="http://blog.tedd.no/wp-content/plugins/add-to-any/icons/linkedin.png" width="16" height="16" alt="LinkedIn"/></a><a class="a2a_button_twitter" href="http://www.addtoany.com/add_to/twitter?linkurl=http%3A%2F%2Fblog.tedd.no%2F2010%2F03%2F20%2Ffibres-microthreading-user-space-threading%2F&amp;linkname=Fibres%20%2F%20Microthreading%20%2F%20User%20space%20threading" title="Twitter" rel="nofollow" target="_blank"><img src="http://blog.tedd.no/wp-content/plugins/add-to-any/icons/twitter.png" width="16" height="16" alt="Twitter"/></a><a class="a2a_button_orkut" href="http://www.addtoany.com/add_to/orkut?linkurl=http%3A%2F%2Fblog.tedd.no%2F2010%2F03%2F20%2Ffibres-microthreading-user-space-threading%2F&amp;linkname=Fibres%20%2F%20Microthreading%20%2F%20User%20space%20threading" title="Orkut" rel="nofollow" target="_blank"><img src="http://blog.tedd.no/wp-content/plugins/add-to-any/icons/orkut.png" width="16" height="16" alt="Orkut"/></a><a class="a2a_button_digg" href="http://www.addtoany.com/add_to/digg?linkurl=http%3A%2F%2Fblog.tedd.no%2F2010%2F03%2F20%2Ffibres-microthreading-user-space-threading%2F&amp;linkname=Fibres%20%2F%20Microthreading%20%2F%20User%20space%20threading" title="Digg" rel="nofollow" target="_blank"><img src="http://blog.tedd.no/wp-content/plugins/add-to-any/icons/digg.png" width="16" height="16" alt="Digg"/></a><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fblog.tedd.no%2F2010%2F03%2F20%2Ffibres-microthreading-user-space-threading%2F&amp;title=Fibres%20%2F%20Microthreading%20%2F%20User%20space%20threading" id="wpa2a_2">Share/Bookmark</a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.tedd.no/2010/03/20/fibres-microthreading-user-space-threading/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>OpenSim Gallery</title>
		<link>http://blog.tedd.no/2010/03/13/opensim-gallery/</link>
		<comments>http://blog.tedd.no/2010/03/13/opensim-gallery/#comments</comments>
		<pubDate>Fri, 12 Mar 2010 23:11:41 +0000</pubDate>
		<dc:creator>tedd</dc:creator>
				<category><![CDATA[OpenSim]]></category>
		<category><![CDATA[Gallery]]></category>
		<category><![CDATA[Karin White]]></category>

		<guid isPermaLink="false">http://teddhansen.wordpress.com/2010/03/13/opensim-gallery/</guid>
		<description><![CDATA[I have some ideas about some interesting and unique games that can be developed in OpenSim. But I think the threshold for using Second Life/OpenSim today is too high. For a pilot project I thought I’d do something simple, so I decided to do an image gallery. I asked my aunt (Karin White) which has [...]]]></description>
			<content:encoded><![CDATA[<p>I have some ideas about some interesting and unique games that can be developed in OpenSim. But I think the threshold for using Second Life/OpenSim today is too high. </p>
<p>For a pilot project I thought I’d do something simple, so I decided to do an image gallery. I asked my aunt (Karin White) which has been a painting artist for like forever if she had some pictures to lend me for the project. </p>
<p>The whole idea is to get OpenSim up and running with a web-browser plug-in or a client/viewer that is VERY easy to install and connect to the correct server. Once I have this proof-of-concept working then I will start on the next project.</p>
<p>Sadly so far all clients are difficult to handle and does not come as a web browser plug-in. 3Di has one that does work inside web browsers, but it is buggy and lacking features. My current best bet is Naali, the new client/viewer from the guys and gals at <a href="http://www.realxtend.org/">RealXtend</a>. It is still in early alpha and lacking in features, but it is making rapid progress.</p>
<p>I’ve been working on it on and off for a month or two. It’s been a busy couple of months (even more than usual), so progress is slow. But here is a sneak preview.</p>
<p><a href="http://blog.tedd.no/wp-content/uploads/2010/03/image3.png"><img style="border-bottom:0;border-left:0;display:inline;border-top:0;border-right:0;" title="image" border="0" alt="image" src="http://blog.tedd.no/wp-content/uploads/2010/03/image_thumb3.png" width="1159" height="671" /></a> </p>
<p><a href="http://blog.tedd.no/wp-content/uploads/2010/03/image4.png"><img style="border-bottom:0;border-left:0;display:inline;border-top:0;border-right:0;" title="image" border="0" alt="image" src="http://blog.tedd.no/wp-content/uploads/2010/03/image_thumb4.png" width="790" height="671" /></a> </p>
<p><a href="http://blog.tedd.no/wp-content/uploads/2010/03/image5.png"><img style="border-bottom:0;border-left:0;display:inline;border-top:0;border-right:0;" title="image" border="0" alt="image" src="http://blog.tedd.no/wp-content/uploads/2010/03/image_thumb5.png" width="790" height="671" /></a></p>
<p><a class="a2a_button_facebook" href="http://www.addtoany.com/add_to/facebook?linkurl=http%3A%2F%2Fblog.tedd.no%2F2010%2F03%2F13%2Fopensim-gallery%2F&amp;linkname=OpenSim%20Gallery" title="Facebook" rel="nofollow" target="_blank"><img src="http://blog.tedd.no/wp-content/plugins/add-to-any/icons/facebook.png" width="16" height="16" alt="Facebook"/></a><a class="a2a_button_linkedin" href="http://www.addtoany.com/add_to/linkedin?linkurl=http%3A%2F%2Fblog.tedd.no%2F2010%2F03%2F13%2Fopensim-gallery%2F&amp;linkname=OpenSim%20Gallery" title="LinkedIn" rel="nofollow" target="_blank"><img src="http://blog.tedd.no/wp-content/plugins/add-to-any/icons/linkedin.png" width="16" height="16" alt="LinkedIn"/></a><a class="a2a_button_twitter" href="http://www.addtoany.com/add_to/twitter?linkurl=http%3A%2F%2Fblog.tedd.no%2F2010%2F03%2F13%2Fopensim-gallery%2F&amp;linkname=OpenSim%20Gallery" title="Twitter" rel="nofollow" target="_blank"><img src="http://blog.tedd.no/wp-content/plugins/add-to-any/icons/twitter.png" width="16" height="16" alt="Twitter"/></a><a class="a2a_button_orkut" href="http://www.addtoany.com/add_to/orkut?linkurl=http%3A%2F%2Fblog.tedd.no%2F2010%2F03%2F13%2Fopensim-gallery%2F&amp;linkname=OpenSim%20Gallery" title="Orkut" rel="nofollow" target="_blank"><img src="http://blog.tedd.no/wp-content/plugins/add-to-any/icons/orkut.png" width="16" height="16" alt="Orkut"/></a><a class="a2a_button_digg" href="http://www.addtoany.com/add_to/digg?linkurl=http%3A%2F%2Fblog.tedd.no%2F2010%2F03%2F13%2Fopensim-gallery%2F&amp;linkname=OpenSim%20Gallery" title="Digg" rel="nofollow" target="_blank"><img src="http://blog.tedd.no/wp-content/plugins/add-to-any/icons/digg.png" width="16" height="16" alt="Digg"/></a><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fblog.tedd.no%2F2010%2F03%2F13%2Fopensim-gallery%2F&amp;title=OpenSim%20Gallery" id="wpa2a_4">Share/Bookmark</a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.tedd.no/2010/03/13/opensim-gallery/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>OpenSim in Visual Studio on Win64</title>
		<link>http://blog.tedd.no/2008/12/05/opensim-in-visual-studio-on-win64/</link>
		<comments>http://blog.tedd.no/2008/12/05/opensim-in-visual-studio-on-win64/#comments</comments>
		<pubDate>Fri, 05 Dec 2008 18:00:00 +0000</pubDate>
		<dc:creator>tedd</dc:creator>
				<category><![CDATA[OpenSim]]></category>
		<category><![CDATA[64-bit]]></category>
		<category><![CDATA[Visual Studio]]></category>

		<guid isPermaLink="false">http://teddhansen.wordpress.com/2008/12/05/opensim-in-visual-studio-on-win64</guid>
		<description><![CDATA[Note! Article applies to developers using Visual Studio on 64-bit Windows. Visual Studio is a great tool. Most developers who can use it should. Currently OpenSim has some problems with 64-bit mode. This is because we have some native .dll&#8217;s and .so&#8217;s such as: SQlite ODE OpenJpeg + more SQLite you can do without by [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Note! Article applies to developers using Visual Studio on 64-bit Windows.</strong></p>
<p>Visual Studio is a great tool. Most developers who can use it should.</p>
<p>Currently OpenSim has some problems with 64-bit mode. This is because we have some native .dll&#8217;s and .so&#8217;s such as:
<ul>
<li>SQlite</li>
<li>ODE</li>
<li>OpenJpeg</li>
<li>+ more</li>
</ul>
<p>SQLite you can do without by choosing MySQL or similar. But the rest is a bit more difficult.<br />See <a href="http://www.adamfrisby.com/blog/2008/08/running-opensim-under-a-64-bit-environment/">http://www.adamfrisby.com/blog/2008/08/running-opensim-under-a-64-bit-environment/</a> for more info.</p>
<p>To solve this problem we have a file named &#8220;OpenSim.32BitLaunch.exe&#8221; which is compiled with CPU target set to 32-bit. This in term loads OpenSim.exe as a standard module and executes it.</p>
<p>But this is only from command line. If you want all the glory of debugging that Visual Studio provides then this workaround will work:</p>
<ol>
<li>Download the OpenSim source as usual, run prebuild as usual.</li>
<li>Open OpenSim.sln in Visual Studio.</li>
<li>Right click solution and choose Add-&gt;Existing Project&#8230;</li>
<li>Browse to &#8220;OpenSim\Tools\OpenSim.32BitLaunch&#8221; and add the project &#8220;OpenSim.32BitLaunch&#8221;.</li>
<li>Right click project called &#8220;OpenSim.32BitLaunch&#8221; and choose &#8220;Set as StartUp Project&#8221;.</li>
</ol>
<p>And OpenSim will run from Visual Studio on 64-bit Windows&#8230;</p>
<p><a class="a2a_button_facebook" href="http://www.addtoany.com/add_to/facebook?linkurl=http%3A%2F%2Fblog.tedd.no%2F2008%2F12%2F05%2Fopensim-in-visual-studio-on-win64%2F&amp;linkname=OpenSim%20in%20Visual%20Studio%20on%20Win64" title="Facebook" rel="nofollow" target="_blank"><img src="http://blog.tedd.no/wp-content/plugins/add-to-any/icons/facebook.png" width="16" height="16" alt="Facebook"/></a><a class="a2a_button_linkedin" href="http://www.addtoany.com/add_to/linkedin?linkurl=http%3A%2F%2Fblog.tedd.no%2F2008%2F12%2F05%2Fopensim-in-visual-studio-on-win64%2F&amp;linkname=OpenSim%20in%20Visual%20Studio%20on%20Win64" title="LinkedIn" rel="nofollow" target="_blank"><img src="http://blog.tedd.no/wp-content/plugins/add-to-any/icons/linkedin.png" width="16" height="16" alt="LinkedIn"/></a><a class="a2a_button_twitter" href="http://www.addtoany.com/add_to/twitter?linkurl=http%3A%2F%2Fblog.tedd.no%2F2008%2F12%2F05%2Fopensim-in-visual-studio-on-win64%2F&amp;linkname=OpenSim%20in%20Visual%20Studio%20on%20Win64" title="Twitter" rel="nofollow" target="_blank"><img src="http://blog.tedd.no/wp-content/plugins/add-to-any/icons/twitter.png" width="16" height="16" alt="Twitter"/></a><a class="a2a_button_orkut" href="http://www.addtoany.com/add_to/orkut?linkurl=http%3A%2F%2Fblog.tedd.no%2F2008%2F12%2F05%2Fopensim-in-visual-studio-on-win64%2F&amp;linkname=OpenSim%20in%20Visual%20Studio%20on%20Win64" title="Orkut" rel="nofollow" target="_blank"><img src="http://blog.tedd.no/wp-content/plugins/add-to-any/icons/orkut.png" width="16" height="16" alt="Orkut"/></a><a class="a2a_button_digg" href="http://www.addtoany.com/add_to/digg?linkurl=http%3A%2F%2Fblog.tedd.no%2F2008%2F12%2F05%2Fopensim-in-visual-studio-on-win64%2F&amp;linkname=OpenSim%20in%20Visual%20Studio%20on%20Win64" title="Digg" rel="nofollow" target="_blank"><img src="http://blog.tedd.no/wp-content/plugins/add-to-any/icons/digg.png" width="16" height="16" alt="Digg"/></a><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fblog.tedd.no%2F2008%2F12%2F05%2Fopensim-in-visual-studio-on-win64%2F&amp;title=OpenSim%20in%20Visual%20Studio%20on%20Win64" id="wpa2a_6">Share/Bookmark</a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.tedd.no/2008/12/05/opensim-in-visual-studio-on-win64/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>OpenSim tackles high load</title>
		<link>http://blog.tedd.no/2008/03/04/opensim-tackles-high-load/</link>
		<comments>http://blog.tedd.no/2008/03/04/opensim-tackles-high-load/#comments</comments>
		<pubDate>Tue, 04 Mar 2008 20:02:00 +0000</pubDate>
		<dc:creator>tedd</dc:creator>
				<category><![CDATA[OpenSim]]></category>
		<category><![CDATA[3Di]]></category>

		<guid isPermaLink="false">http://teddhansen.wordpress.com/2008/03/04/opensim-tackles-high-load</guid>
		<description><![CDATA[3Di have provided us with some new fancy features being added to OpenSim over the next few days. Region splittingAllows multiple physical computers to cooperate on maintaining one region. This is good for scenarios where you would want a large amount of people in the same region (think large events). OpenSim has already proven the [...]]]></description>
			<content:encoded><![CDATA[<p>3Di have provided us with some new fancy features being added to OpenSim over the next few days.
<p><strong>Region splitting</strong><br />Allows multiple physical computers to cooperate on maintaining one region. This is good for scenarios where you would want a large amount of people in the same region (think large events). OpenSim has already proven the potential of holding well over a hundred users, and this patch increases that number many times.</p>
<p><strong>Dynamic load balancing<br /></strong>Monitors the load (often related to number of users) a region is exposed to and can realtime move the region to a computer with less load (while it&#8217;s running!). More efficient use of computer resources means we save electricity. No more empty regions occupying an idle server. So this is a green patch! <img src='http://blog.tedd.no/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p><a class="a2a_button_facebook" href="http://www.addtoany.com/add_to/facebook?linkurl=http%3A%2F%2Fblog.tedd.no%2F2008%2F03%2F04%2Fopensim-tackles-high-load%2F&amp;linkname=OpenSim%20tackles%20high%20load" title="Facebook" rel="nofollow" target="_blank"><img src="http://blog.tedd.no/wp-content/plugins/add-to-any/icons/facebook.png" width="16" height="16" alt="Facebook"/></a><a class="a2a_button_linkedin" href="http://www.addtoany.com/add_to/linkedin?linkurl=http%3A%2F%2Fblog.tedd.no%2F2008%2F03%2F04%2Fopensim-tackles-high-load%2F&amp;linkname=OpenSim%20tackles%20high%20load" title="LinkedIn" rel="nofollow" target="_blank"><img src="http://blog.tedd.no/wp-content/plugins/add-to-any/icons/linkedin.png" width="16" height="16" alt="LinkedIn"/></a><a class="a2a_button_twitter" href="http://www.addtoany.com/add_to/twitter?linkurl=http%3A%2F%2Fblog.tedd.no%2F2008%2F03%2F04%2Fopensim-tackles-high-load%2F&amp;linkname=OpenSim%20tackles%20high%20load" title="Twitter" rel="nofollow" target="_blank"><img src="http://blog.tedd.no/wp-content/plugins/add-to-any/icons/twitter.png" width="16" height="16" alt="Twitter"/></a><a class="a2a_button_orkut" href="http://www.addtoany.com/add_to/orkut?linkurl=http%3A%2F%2Fblog.tedd.no%2F2008%2F03%2F04%2Fopensim-tackles-high-load%2F&amp;linkname=OpenSim%20tackles%20high%20load" title="Orkut" rel="nofollow" target="_blank"><img src="http://blog.tedd.no/wp-content/plugins/add-to-any/icons/orkut.png" width="16" height="16" alt="Orkut"/></a><a class="a2a_button_digg" href="http://www.addtoany.com/add_to/digg?linkurl=http%3A%2F%2Fblog.tedd.no%2F2008%2F03%2F04%2Fopensim-tackles-high-load%2F&amp;linkname=OpenSim%20tackles%20high%20load" title="Digg" rel="nofollow" target="_blank"><img src="http://blog.tedd.no/wp-content/plugins/add-to-any/icons/digg.png" width="16" height="16" alt="Digg"/></a><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fblog.tedd.no%2F2008%2F03%2F04%2Fopensim-tackles-high-load%2F&amp;title=OpenSim%20tackles%20high%20load" id="wpa2a_8">Share/Bookmark</a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.tedd.no/2008/03/04/opensim-tackles-high-load/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Objectifying LSL</title>
		<link>http://blog.tedd.no/2008/02/25/objectifying-lsl/</link>
		<comments>http://blog.tedd.no/2008/02/25/objectifying-lsl/#comments</comments>
		<pubDate>Mon, 25 Feb 2008 17:34:00 +0000</pubDate>
		<dc:creator>tedd</dc:creator>
				<category><![CDATA[OpenSim]]></category>
		<category><![CDATA[OSSL]]></category>

		<guid isPermaLink="false">http://teddhansen.wordpress.com/2008/02/25/objectifying-lsl</guid>
		<description><![CDATA[A few months ago we decided to make a distinction between SL&#8217;s LSL2 and our own LSL implementation. This mainly because we were planning to add new features to the language. But also to make people understand that the compatibility may not be 100% &#8211; at least not for some time into the future. One [...]]]></description>
			<content:encoded><![CDATA[<p>A few months ago we decided to make a distinction between SL&#8217;s LSL2 and our own LSL implementation. This mainly because we were planning to add new features to the language. But also to make people understand that the compatibility may not be 100% &#8211; at least not for some time into the future. One thing is implementing all ll-commands. Another is to get them all right. So we decided to call our language OSSL (OpenSim Scripting Language.)</p>
<p>Yesterday OSSL took a new turn. In addition to LSL2&#8242;s straight forward function calls and our own similar os-calls I want to provide a modular aproach.</p>
<p>So now OSSL has a new object &#8220;Prim&#8221; that can be used in the following ways:<br />Prim.Position.x += 10;<br />Prim.Rotation.x += 45;<br />Prim.Text = &#8220;This text floats on top of a prim!&#8221;;</p>
<p>I&#8217;m planning to implement more functions. Especially looking forward to getting for example the particle-system into objectified managed code.</p>
<p>Later down the road people can use Visual Studio to write scripts for OpenSim. If they include some OSSL.dll they will get the benefits of managed code and writing scripts should be a breeze.</p>
<p>So, here is a sample script:<br />
<blockquote>//c#</p>
<p>double x = 0;<br />double y = 0;</p>
<p>public<br />void default_event_state_entry()<br />{<br />llSetTimerEvent(0.1);<br />}</p>
<p>public void default_event_timer() {<br />x += 0.2;<br />y += 0.1;</p>
<p>Prim.Position.x = System.Math.Sin(x) * 10 + 100;<br />Prim.Position.y = System.Math.Cos(y) * 10 + 100;<br />}</p></blockquote>
<p><a class="a2a_button_facebook" href="http://www.addtoany.com/add_to/facebook?linkurl=http%3A%2F%2Fblog.tedd.no%2F2008%2F02%2F25%2Fobjectifying-lsl%2F&amp;linkname=Objectifying%20LSL" title="Facebook" rel="nofollow" target="_blank"><img src="http://blog.tedd.no/wp-content/plugins/add-to-any/icons/facebook.png" width="16" height="16" alt="Facebook"/></a><a class="a2a_button_linkedin" href="http://www.addtoany.com/add_to/linkedin?linkurl=http%3A%2F%2Fblog.tedd.no%2F2008%2F02%2F25%2Fobjectifying-lsl%2F&amp;linkname=Objectifying%20LSL" title="LinkedIn" rel="nofollow" target="_blank"><img src="http://blog.tedd.no/wp-content/plugins/add-to-any/icons/linkedin.png" width="16" height="16" alt="LinkedIn"/></a><a class="a2a_button_twitter" href="http://www.addtoany.com/add_to/twitter?linkurl=http%3A%2F%2Fblog.tedd.no%2F2008%2F02%2F25%2Fobjectifying-lsl%2F&amp;linkname=Objectifying%20LSL" title="Twitter" rel="nofollow" target="_blank"><img src="http://blog.tedd.no/wp-content/plugins/add-to-any/icons/twitter.png" width="16" height="16" alt="Twitter"/></a><a class="a2a_button_orkut" href="http://www.addtoany.com/add_to/orkut?linkurl=http%3A%2F%2Fblog.tedd.no%2F2008%2F02%2F25%2Fobjectifying-lsl%2F&amp;linkname=Objectifying%20LSL" title="Orkut" rel="nofollow" target="_blank"><img src="http://blog.tedd.no/wp-content/plugins/add-to-any/icons/orkut.png" width="16" height="16" alt="Orkut"/></a><a class="a2a_button_digg" href="http://www.addtoany.com/add_to/digg?linkurl=http%3A%2F%2Fblog.tedd.no%2F2008%2F02%2F25%2Fobjectifying-lsl%2F&amp;linkname=Objectifying%20LSL" title="Digg" rel="nofollow" target="_blank"><img src="http://blog.tedd.no/wp-content/plugins/add-to-any/icons/digg.png" width="16" height="16" alt="Digg"/></a><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fblog.tedd.no%2F2008%2F02%2F25%2Fobjectifying-lsl%2F&amp;title=Objectifying%20LSL" id="wpa2a_10">Share/Bookmark</a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.tedd.no/2008/02/25/objectifying-lsl/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>New common framework</title>
		<link>http://blog.tedd.no/2008/02/11/new-common-framework/</link>
		<comments>http://blog.tedd.no/2008/02/11/new-common-framework/#comments</comments>
		<pubDate>Mon, 11 Feb 2008 12:52:00 +0000</pubDate>
		<dc:creator>tedd</dc:creator>
				<category><![CDATA[OpenSim]]></category>
		<category><![CDATA[ScriptEngine]]></category>

		<guid isPermaLink="false">http://teddhansen.wordpress.com/2008/02/11/new-common-framework</guid>
		<description><![CDATA[I have moved most of the code from OpenSim.Region.ScriptEngine.DotNetEngine to OpenSim.Region.ScriptEngine.Common. Right now we have only one ScriptEngine, and its purpose is to emulate a Second Life script engine by executing scripts put into prims. But in the future I expect different kinds of script engines such as controllers that manipulate in-world game rules or [...]]]></description>
			<content:encoded><![CDATA[<p>I have moved most of the code from OpenSim.Region.ScriptEngine.DotNetEngine to OpenSim.Region.ScriptEngine.Common.</p>
<p>Right now we have only one ScriptEngine, and its purpose is to emulate a Second Life script engine by executing scripts put into prims. But in the future I expect different kinds of script engines such as controllers that manipulate in-world game rules or objects from a .dll that has nothing to do with prim scripts.</p>
<p>Therefore I moved parts of DotNetEngine into Common so that Common is an execution framework.</p>
<p>DotNetEngine now does LSL-&gt;C# convert and compile. But does not do anything else. It simply hands the compiled .dll back to Common when its done. Then Common does the actual execution of script.</p>
<p>To quote <a href="http://opensimulator.org/wiki/OpenSim.Region.ScriptEngine.Common">http://opensimulator.org/wiki/OpenSim.Region.ScriptEngine.Common</a></p>
<p><strong>What do I get for free?</strong><br />1. Loading/unloading of scripts are queued and executed in sequence. Only one load/unload at the time.</p>
<p>2. What script belongs to what object is automatically taken care of. You just need to provide the scripts classes &#8211; nothing else.</p>
<p>3. OpenSim events are translated and given to you as LSL events. Your script functions are executed automatically, no need to hook up to events or anything.If you want to implement your own event handlers, feel free to do so. Look in &#8220;OpenSim.Region.ScriptEngine.Common.ScriptEngineBase.EventManager.cs&#8221; how its done. Your own events can run together with LSL events without any problem.</p>
<p>4. Whenever an event is executed, the execution is queued. Only one event per script is ever executed simultaneous. But multithreading is used to run multiple scripts in parallel.</p>
<p>5. Errors during script execution is automatically handled and relayed to users in-world.</p>
<p>6. You get all LSL commands in an easy to use object, no need to keep track of scene or objects to execute functions. Running an LSL command from your script engine is as easy as running it from inside any LSL-script.</p>
<p>7. Long LSL-commands that returns with an event is also handled.</p>
<p><a class="a2a_button_facebook" href="http://www.addtoany.com/add_to/facebook?linkurl=http%3A%2F%2Fblog.tedd.no%2F2008%2F02%2F11%2Fnew-common-framework%2F&amp;linkname=New%20common%20framework" title="Facebook" rel="nofollow" target="_blank"><img src="http://blog.tedd.no/wp-content/plugins/add-to-any/icons/facebook.png" width="16" height="16" alt="Facebook"/></a><a class="a2a_button_linkedin" href="http://www.addtoany.com/add_to/linkedin?linkurl=http%3A%2F%2Fblog.tedd.no%2F2008%2F02%2F11%2Fnew-common-framework%2F&amp;linkname=New%20common%20framework" title="LinkedIn" rel="nofollow" target="_blank"><img src="http://blog.tedd.no/wp-content/plugins/add-to-any/icons/linkedin.png" width="16" height="16" alt="LinkedIn"/></a><a class="a2a_button_twitter" href="http://www.addtoany.com/add_to/twitter?linkurl=http%3A%2F%2Fblog.tedd.no%2F2008%2F02%2F11%2Fnew-common-framework%2F&amp;linkname=New%20common%20framework" title="Twitter" rel="nofollow" target="_blank"><img src="http://blog.tedd.no/wp-content/plugins/add-to-any/icons/twitter.png" width="16" height="16" alt="Twitter"/></a><a class="a2a_button_orkut" href="http://www.addtoany.com/add_to/orkut?linkurl=http%3A%2F%2Fblog.tedd.no%2F2008%2F02%2F11%2Fnew-common-framework%2F&amp;linkname=New%20common%20framework" title="Orkut" rel="nofollow" target="_blank"><img src="http://blog.tedd.no/wp-content/plugins/add-to-any/icons/orkut.png" width="16" height="16" alt="Orkut"/></a><a class="a2a_button_digg" href="http://www.addtoany.com/add_to/digg?linkurl=http%3A%2F%2Fblog.tedd.no%2F2008%2F02%2F11%2Fnew-common-framework%2F&amp;linkname=New%20common%20framework" title="Digg" rel="nofollow" target="_blank"><img src="http://blog.tedd.no/wp-content/plugins/add-to-any/icons/digg.png" width="16" height="16" alt="Digg"/></a><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fblog.tedd.no%2F2008%2F02%2F11%2Fnew-common-framework%2F&amp;title=New%20common%20framework" id="wpa2a_12">Share/Bookmark</a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.tedd.no/2008/02/11/new-common-framework/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ScriptEngine with many regions per server</title>
		<link>http://blog.tedd.no/2008/02/11/scriptengine-with-many-regions-per-server/</link>
		<comments>http://blog.tedd.no/2008/02/11/scriptengine-with-many-regions-per-server/#comments</comments>
		<pubDate>Mon, 11 Feb 2008 12:51:00 +0000</pubDate>
		<dc:creator>tedd</dc:creator>
				<category><![CDATA[OpenSim]]></category>
		<category><![CDATA[ScriptEngine]]></category>

		<guid isPermaLink="false">http://teddhansen.wordpress.com/2008/02/11/scriptengine-with-many-regions-per-server</guid>
		<description><![CDATA[I have added a whole lot of detailed config options in OpenSim.ini.example that can be used to control DotNetEngine. Many of these are specific to Common, some are specific to DotNetEngine. You can now control a lot of detailed stuff that you usually wouldn&#8217;t care about. The reason why these options are there now is [...]]]></description>
			<content:encoded><![CDATA[<p>I have added a whole lot of detailed config options in OpenSim.ini.example that can be used to control DotNetEngine. Many of these are specific to Common, some are specific to DotNetEngine.</p>
<p>You can now control a lot of detailed stuff that you usually wouldn&#8217;t care about. The reason why these options are there now is because 1) Common will be sharing resources across different script engines (so we can support large amounts of script engines) and 2) who knows what you will be using OpenSim for.</p>
<p>One of the most important new features is the capability of Common to share maintenance, load/unload and execution threads accross instances (read: regions). Today a new instance of ScriptEngine is created for each region. And with 3-4 threads per ScriptEngine &#8230; I guess this is a severe limit to large scale use of OpenSim.</p>
<p><em>Note! The thread sharing is currently disabled due to some bugs that needs fixing.</em></p>
<p><a class="a2a_button_facebook" href="http://www.addtoany.com/add_to/facebook?linkurl=http%3A%2F%2Fblog.tedd.no%2F2008%2F02%2F11%2Fscriptengine-with-many-regions-per-server%2F&amp;linkname=ScriptEngine%20with%20many%20regions%20per%20server" title="Facebook" rel="nofollow" target="_blank"><img src="http://blog.tedd.no/wp-content/plugins/add-to-any/icons/facebook.png" width="16" height="16" alt="Facebook"/></a><a class="a2a_button_linkedin" href="http://www.addtoany.com/add_to/linkedin?linkurl=http%3A%2F%2Fblog.tedd.no%2F2008%2F02%2F11%2Fscriptengine-with-many-regions-per-server%2F&amp;linkname=ScriptEngine%20with%20many%20regions%20per%20server" title="LinkedIn" rel="nofollow" target="_blank"><img src="http://blog.tedd.no/wp-content/plugins/add-to-any/icons/linkedin.png" width="16" height="16" alt="LinkedIn"/></a><a class="a2a_button_twitter" href="http://www.addtoany.com/add_to/twitter?linkurl=http%3A%2F%2Fblog.tedd.no%2F2008%2F02%2F11%2Fscriptengine-with-many-regions-per-server%2F&amp;linkname=ScriptEngine%20with%20many%20regions%20per%20server" title="Twitter" rel="nofollow" target="_blank"><img src="http://blog.tedd.no/wp-content/plugins/add-to-any/icons/twitter.png" width="16" height="16" alt="Twitter"/></a><a class="a2a_button_orkut" href="http://www.addtoany.com/add_to/orkut?linkurl=http%3A%2F%2Fblog.tedd.no%2F2008%2F02%2F11%2Fscriptengine-with-many-regions-per-server%2F&amp;linkname=ScriptEngine%20with%20many%20regions%20per%20server" title="Orkut" rel="nofollow" target="_blank"><img src="http://blog.tedd.no/wp-content/plugins/add-to-any/icons/orkut.png" width="16" height="16" alt="Orkut"/></a><a class="a2a_button_digg" href="http://www.addtoany.com/add_to/digg?linkurl=http%3A%2F%2Fblog.tedd.no%2F2008%2F02%2F11%2Fscriptengine-with-many-regions-per-server%2F&amp;linkname=ScriptEngine%20with%20many%20regions%20per%20server" title="Digg" rel="nofollow" target="_blank"><img src="http://blog.tedd.no/wp-content/plugins/add-to-any/icons/digg.png" width="16" height="16" alt="Digg"/></a><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fblog.tedd.no%2F2008%2F02%2F11%2Fscriptengine-with-many-regions-per-server%2F&amp;title=ScriptEngine%20with%20many%20regions%20per%20server" id="wpa2a_14">Share/Bookmark</a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.tedd.no/2008/02/11/scriptengine-with-many-regions-per-server/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ScriptServer</title>
		<link>http://blog.tedd.no/2008/02/11/scriptserver/</link>
		<comments>http://blog.tedd.no/2008/02/11/scriptserver/#comments</comments>
		<pubDate>Mon, 11 Feb 2008 12:46:00 +0000</pubDate>
		<dc:creator>tedd</dc:creator>
				<category><![CDATA[OpenSim]]></category>
		<category><![CDATA[ScriptServer]]></category>

		<guid isPermaLink="false">http://teddhansen.wordpress.com/2008/02/11/scriptserver</guid>
		<description><![CDATA[ScriptServer is &#8220;almost done&#8221;. Meaning it is capable of doing everything except communicating from a script to OpenSim. For this I need to abstract the layer between llFunction() and the actual implementation. Which already is in part done.However ScriptServer has not been a priority lately. For those who dont know the difference: ScriptEngine is a [...]]]></description>
			<content:encoded><![CDATA[<p>ScriptServer is &#8220;almost done&#8221;. Meaning it is capable of doing everything except communicating from a script to OpenSim. For this I need to abstract the layer between llFunction() and the actual implementation. Which already is in part done.<br />However ScriptServer has not been a priority lately.</p>
<p>For those who dont know the difference: ScriptEngine is a .dll that OpenSim uses to run scripts. ScriptServer is 1) a ScriptEngine .dll, but instead of executing scripts it remotely communicated with a 2) ScriptServer that uses the same ScriptEngine .dll&#8217;s as OpenSim to execute scripts.<br />The advantage of this is that the script execution can happen on a remote machine (or same machine if you want) outside of OpenSim.exe.</p>
<p><a class="a2a_button_facebook" href="http://www.addtoany.com/add_to/facebook?linkurl=http%3A%2F%2Fblog.tedd.no%2F2008%2F02%2F11%2Fscriptserver%2F&amp;linkname=ScriptServer" title="Facebook" rel="nofollow" target="_blank"><img src="http://blog.tedd.no/wp-content/plugins/add-to-any/icons/facebook.png" width="16" height="16" alt="Facebook"/></a><a class="a2a_button_linkedin" href="http://www.addtoany.com/add_to/linkedin?linkurl=http%3A%2F%2Fblog.tedd.no%2F2008%2F02%2F11%2Fscriptserver%2F&amp;linkname=ScriptServer" title="LinkedIn" rel="nofollow" target="_blank"><img src="http://blog.tedd.no/wp-content/plugins/add-to-any/icons/linkedin.png" width="16" height="16" alt="LinkedIn"/></a><a class="a2a_button_twitter" href="http://www.addtoany.com/add_to/twitter?linkurl=http%3A%2F%2Fblog.tedd.no%2F2008%2F02%2F11%2Fscriptserver%2F&amp;linkname=ScriptServer" title="Twitter" rel="nofollow" target="_blank"><img src="http://blog.tedd.no/wp-content/plugins/add-to-any/icons/twitter.png" width="16" height="16" alt="Twitter"/></a><a class="a2a_button_orkut" href="http://www.addtoany.com/add_to/orkut?linkurl=http%3A%2F%2Fblog.tedd.no%2F2008%2F02%2F11%2Fscriptserver%2F&amp;linkname=ScriptServer" title="Orkut" rel="nofollow" target="_blank"><img src="http://blog.tedd.no/wp-content/plugins/add-to-any/icons/orkut.png" width="16" height="16" alt="Orkut"/></a><a class="a2a_button_digg" href="http://www.addtoany.com/add_to/digg?linkurl=http%3A%2F%2Fblog.tedd.no%2F2008%2F02%2F11%2Fscriptserver%2F&amp;linkname=ScriptServer" title="Digg" rel="nofollow" target="_blank"><img src="http://blog.tedd.no/wp-content/plugins/add-to-any/icons/digg.png" width="16" height="16" alt="Digg"/></a><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fblog.tedd.no%2F2008%2F02%2F11%2Fscriptserver%2F&amp;title=ScriptServer" id="wpa2a_16">Share/Bookmark</a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.tedd.no/2008/02/11/scriptserver/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Script engine implementation</title>
		<link>http://blog.tedd.no/2007/10/14/script-engine-implementation/</link>
		<comments>http://blog.tedd.no/2007/10/14/script-engine-implementation/#comments</comments>
		<pubDate>Sun, 14 Oct 2007 21:03:00 +0000</pubDate>
		<dc:creator>tedd</dc:creator>
				<category><![CDATA[OpenSim]]></category>

		<guid isPermaLink="false">http://teddhansen.wordpress.com/2007/10/14/script-engine-implementation</guid>
		<description><![CDATA[I just wrote this contribution to AWG: http://wiki.secondlife.com/wiki/Tedds_stand-alone_script_engine It explains how and why on my opinions on the future script engine implementation.]]></description>
			<content:encoded><![CDATA[<p>I just wrote this contribution to AWG: <a href="http://wiki.secondlife.com/wiki/Tedds_stand-alone_script_engine">http://wiki.secondlife.com/wiki/Tedds_stand-alone_script_engine</a></p>
<p>It explains how and why on my opinions on the future script engine implementation.</p>
<p><a class="a2a_button_facebook" href="http://www.addtoany.com/add_to/facebook?linkurl=http%3A%2F%2Fblog.tedd.no%2F2007%2F10%2F14%2Fscript-engine-implementation%2F&amp;linkname=Script%20engine%20implementation" title="Facebook" rel="nofollow" target="_blank"><img src="http://blog.tedd.no/wp-content/plugins/add-to-any/icons/facebook.png" width="16" height="16" alt="Facebook"/></a><a class="a2a_button_linkedin" href="http://www.addtoany.com/add_to/linkedin?linkurl=http%3A%2F%2Fblog.tedd.no%2F2007%2F10%2F14%2Fscript-engine-implementation%2F&amp;linkname=Script%20engine%20implementation" title="LinkedIn" rel="nofollow" target="_blank"><img src="http://blog.tedd.no/wp-content/plugins/add-to-any/icons/linkedin.png" width="16" height="16" alt="LinkedIn"/></a><a class="a2a_button_twitter" href="http://www.addtoany.com/add_to/twitter?linkurl=http%3A%2F%2Fblog.tedd.no%2F2007%2F10%2F14%2Fscript-engine-implementation%2F&amp;linkname=Script%20engine%20implementation" title="Twitter" rel="nofollow" target="_blank"><img src="http://blog.tedd.no/wp-content/plugins/add-to-any/icons/twitter.png" width="16" height="16" alt="Twitter"/></a><a class="a2a_button_orkut" href="http://www.addtoany.com/add_to/orkut?linkurl=http%3A%2F%2Fblog.tedd.no%2F2007%2F10%2F14%2Fscript-engine-implementation%2F&amp;linkname=Script%20engine%20implementation" title="Orkut" rel="nofollow" target="_blank"><img src="http://blog.tedd.no/wp-content/plugins/add-to-any/icons/orkut.png" width="16" height="16" alt="Orkut"/></a><a class="a2a_button_digg" href="http://www.addtoany.com/add_to/digg?linkurl=http%3A%2F%2Fblog.tedd.no%2F2007%2F10%2F14%2Fscript-engine-implementation%2F&amp;linkname=Script%20engine%20implementation" title="Digg" rel="nofollow" target="_blank"><img src="http://blog.tedd.no/wp-content/plugins/add-to-any/icons/digg.png" width="16" height="16" alt="Digg"/></a><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fblog.tedd.no%2F2007%2F10%2F14%2Fscript-engine-implementation%2F&amp;title=Script%20engine%20implementation" id="wpa2a_18">Share/Bookmark</a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.tedd.no/2007/10/14/script-engine-implementation/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>A peek on new architecture</title>
		<link>http://blog.tedd.no/2007/10/01/a-peek-on-new-architecture/</link>
		<comments>http://blog.tedd.no/2007/10/01/a-peek-on-new-architecture/#comments</comments>
		<pubDate>Mon, 01 Oct 2007 17:11:00 +0000</pubDate>
		<dc:creator>tedd</dc:creator>
				<category><![CDATA[OpenSim]]></category>

		<guid isPermaLink="false">http://teddhansen.wordpress.com/2007/10/01/a-peek-on-new-architecture</guid>
		<description><![CDATA[This is where my planning is at now.It was very complex, and after redrawing it a few times I neded up at this.Still not 100%, but getting there&#8230;]]></description>
			<content:encoded><![CDATA[<p><a href="http://bp2.blogger.com/_rculTBw7Cnk/RwErDoMJAuI/AAAAAAAAADE/F8myFqHIrnA/s1600-h/20071001+-+ScriptEngine+StandAlone+Layout.png"><img alt="" src="http://bp2.blogger.com/_rculTBw7Cnk/RwErDoMJAuI/AAAAAAAAADE/F8myFqHIrnA/s400/20071001+-+ScriptEngine+StandAlone+Layout.png" border="0" /></a></p>
<p>This is where my planning is at now.<br />It was very complex, and after redrawing it a few times I neded up at this.<br />Still not 100%, but getting there&#8230;</p>
<p><a class="a2a_button_facebook" href="http://www.addtoany.com/add_to/facebook?linkurl=http%3A%2F%2Fblog.tedd.no%2F2007%2F10%2F01%2Fa-peek-on-new-architecture%2F&amp;linkname=A%20peek%20on%20new%20architecture" title="Facebook" rel="nofollow" target="_blank"><img src="http://blog.tedd.no/wp-content/plugins/add-to-any/icons/facebook.png" width="16" height="16" alt="Facebook"/></a><a class="a2a_button_linkedin" href="http://www.addtoany.com/add_to/linkedin?linkurl=http%3A%2F%2Fblog.tedd.no%2F2007%2F10%2F01%2Fa-peek-on-new-architecture%2F&amp;linkname=A%20peek%20on%20new%20architecture" title="LinkedIn" rel="nofollow" target="_blank"><img src="http://blog.tedd.no/wp-content/plugins/add-to-any/icons/linkedin.png" width="16" height="16" alt="LinkedIn"/></a><a class="a2a_button_twitter" href="http://www.addtoany.com/add_to/twitter?linkurl=http%3A%2F%2Fblog.tedd.no%2F2007%2F10%2F01%2Fa-peek-on-new-architecture%2F&amp;linkname=A%20peek%20on%20new%20architecture" title="Twitter" rel="nofollow" target="_blank"><img src="http://blog.tedd.no/wp-content/plugins/add-to-any/icons/twitter.png" width="16" height="16" alt="Twitter"/></a><a class="a2a_button_orkut" href="http://www.addtoany.com/add_to/orkut?linkurl=http%3A%2F%2Fblog.tedd.no%2F2007%2F10%2F01%2Fa-peek-on-new-architecture%2F&amp;linkname=A%20peek%20on%20new%20architecture" title="Orkut" rel="nofollow" target="_blank"><img src="http://blog.tedd.no/wp-content/plugins/add-to-any/icons/orkut.png" width="16" height="16" alt="Orkut"/></a><a class="a2a_button_digg" href="http://www.addtoany.com/add_to/digg?linkurl=http%3A%2F%2Fblog.tedd.no%2F2007%2F10%2F01%2Fa-peek-on-new-architecture%2F&amp;linkname=A%20peek%20on%20new%20architecture" title="Digg" rel="nofollow" target="_blank"><img src="http://blog.tedd.no/wp-content/plugins/add-to-any/icons/digg.png" width="16" height="16" alt="Digg"/></a><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fblog.tedd.no%2F2007%2F10%2F01%2Fa-peek-on-new-architecture%2F&amp;title=A%20peek%20on%20new%20architecture" id="wpa2a_20">Share/Bookmark</a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.tedd.no/2007/10/01/a-peek-on-new-architecture/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
<!-- WP Super Cache is installed but broken. The path to wp-cache-phase1.php in wp-content/advanced-cache.php must be fixed! -->
