<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns="http://www.w3.org/TR/REC-html40">

<head>
<meta http-equiv=Content-Type content="text/html; charset=iso-8859-1">
<meta name=Generator content="Microsoft Word 11 (filtered medium)">
<!--[if !mso]>
<style>
v\:* {behavior:url(#default#VML);}
o\:* {behavior:url(#default#VML);}
w\:* {behavior:url(#default#VML);}
.shape {behavior:url(#default#VML);}
</style>
<![endif]-->
<style>
<!--
.ExternalClass EC_p.MsoNormal, .ExternalClass EC_li.MsoNormal, .ExternalClass EC_div.MsoNormal
{margin-bottom:.0001pt;font-size:12.0pt;font-family:'Times New Roman';}
.ExternalClass a:link, .ExternalClass EC_span.MsoHyperlink
{color:blue;text-decoration:underline;}
.ExternalClass a:visited, .ExternalClass EC_span.MsoHyperlinkFollowed
{color:purple;text-decoration:underline;}
.ExternalClass EC_span.EpostStil17
{font-family:Arial;color:windowtext;}
.ExternalClass EC_div.Section1
{page:Section1;}

 /* Font Definitions */
 @font-face
        {font-family:Tahoma;
        panose-1:2 11 6 4 3 5 4 4 2 4;}
 /* Style Definitions */
 p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0cm;
        margin-bottom:.0001pt;
        font-size:12.0pt;
        font-family:"Times New Roman";}
a:link, span.MsoHyperlink
        {color:blue;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {color:purple;
        text-decoration:underline;}
p
        {mso-margin-top-alt:auto;
        margin-right:0cm;
        mso-margin-bottom-alt:auto;
        margin-left:0cm;
        font-size:12.0pt;
        font-family:"Times New Roman";}
span.EpostStil18
        {mso-style-type:personal-reply;
        font-family:Arial;
        color:navy;}
@page Section1
        {size:595.3pt 841.9pt;
        margin:70.85pt 70.85pt 70.85pt 70.85pt;}
div.Section1
        {page:Section1;}
 /* List Definitions */
 @list l0
        {mso-list-id:1585264404;
        mso-list-template-ids:-1985055972;}
@list l0:level1
        {mso-level-number-format:bullet;
        mso-level-text:\F0B7;
        mso-level-tab-stop:36.0pt;
        mso-level-number-position:left;
        text-indent:-18.0pt;
        mso-ansi-font-size:10.0pt;
        font-family:Symbol;}
ol
        {margin-bottom:0cm;}
ul
        {margin-bottom:0cm;}
-->
</style>

</head>

<body lang=NO-BOK link=blue vlink=purple>

<div class=Section1>

<p class=MsoNormal><font size=2 color=navy face=Arial><span lang=EN-US
style='font-size:10.0pt;font-family:Arial;color:navy'>Thanks.<o:p></o:p></span></font></p>

<p class=MsoNormal><font size=2 color=navy face=Arial><span lang=EN-US
style='font-size:10.0pt;font-family:Arial;color:navy'><o:p> </o:p></span></font></p>

<p class=MsoNormal><font size=2 color=navy face=Arial><span lang=EN-US
style='font-size:10.0pt;font-family:Arial;color:navy'>Good point on not locking
it to LSL commands only.<o:p></o:p></span></font></p>

<p class=MsoNormal><font size=2 color=navy face=Arial><span lang=EN-US
style='font-size:10.0pt;font-family:Arial;color:navy'><o:p> </o:p></span></font></p>

<p class=MsoNormal><font size=2 color=navy face=Arial><span lang=EN-US
style='font-size:10.0pt;font-family:Arial;color:navy'>I’ve started
implementing a binary protocol for communication. It is the only way to get
fast and scalable communication. Commands will be sent in packets like:<o:p></o:p></span></font></p>

<p class=MsoNormal><font size=2 color=navy face=Arial><span lang=EN-US
style='font-size:10.0pt;font-family:Arial;color:navy'>(Total packet length,)
parameter count, command length, command name (string), param1 type, param1
length, param1 data, param2 type, param2 length, param2 data, etc.<o:p></o:p></span></font></p>

<p class=MsoNormal><font size=2 color=navy face=Arial><span lang=EN-US
style='font-size:10.0pt;font-family:Arial;color:navy'>This is what any
RPC/Remoting has to go through anyway.<o:p></o:p></span></font></p>

<p class=MsoNormal><font size=2 color=navy face=Arial><span lang=EN-US
style='font-size:10.0pt;font-family:Arial;color:navy'>(should be noted that I
have previous experience with tcp communication and binary protocols, so the
implementation itself will be clean and will work)<o:p></o:p></span></font></p>

<p class=MsoNormal><font size=2 color=navy face=Arial><span lang=EN-US
style='font-size:10.0pt;font-family:Arial;color:navy'><o:p> </o:p></span></font></p>

<p class=MsoNormal><font size=2 color=navy face=Arial><span lang=EN-US
style='font-size:10.0pt;font-family:Arial;color:navy'>But now I’m
concerned about the data types in parameters… doing it this way I have to
“hardcode” every data type (send/recv) and cast it from byte stream
to the actual data type upon receive.<o:p></o:p></span></font></p>

<p class=MsoNormal><font size=2 color=navy face=Arial><span lang=EN-US
style='font-size:10.0pt;font-family:Arial;color:navy'>The only things I can
think of except normal int/long/double/string/etc is vectors/rotation.<o:p></o:p></span></font></p>

<p class=MsoNormal><font size=2 color=navy face=Arial><span lang=EN-US
style='font-size:10.0pt;font-family:Arial;color:navy'><o:p> </o:p></span></font></p>

<p class=MsoNormal><font size=2 color=navy face=Arial><span lang=EN-US
style='font-size:10.0pt;font-family:Arial;color:navy'><o:p> </o:p></span></font></p>

<p class=MsoNormal><b><font size=2 color=navy face=Arial><span lang=EN-US
style='font-size:10.0pt;font-family:Arial;color:navy;font-weight:bold'>But
feedback on this would be great.<o:p></o:p></span></font></b></p>

<p class=MsoNormal><font size=2 color=navy face=Arial><span lang=EN-US
style='font-size:10.0pt;font-family:Arial;color:navy'>If someone wants to share
their thoughts on serialization too, go ahead.<o:p></o:p></span></font></p>

<p class=MsoNormal><font size=2 color=navy face=Arial><span lang=EN-US
style='font-size:10.0pt;font-family:Arial;color:navy'><o:p> </o:p></span></font></p>

<p class=MsoNormal><font size=2 color=navy face=Arial><span lang=EN-US
style='font-size:10.0pt;font-family:Arial;color:navy'>Using a binary protocol
will allow for efficient continuous command stream in both directions through a
single TCP channel. At receiving endpoint the function with params will be
checked against an interface, if found it will be cached for future execution
(using a dictionary). Protocol will have a version negotiation at startup, so
we can in the future improve communication by having remote party learn an ID
of function and use that instead. Special packets can be used for function
calls that don’t contain strings, got no params, etc. (room for
improvement is always good)<o:p></o:p></span></font></p>

<p class=MsoNormal><font size=2 color=navy face=Arial><span lang=EN-US
style='font-size:10.0pt;font-family:Arial;color:navy'><o:p> </o:p></span></font></p>

<p class=MsoNormal><font size=2 color=navy face=Arial><span lang=EN-US
style='font-size:10.0pt;font-family:Arial;color:navy'>Also the feedback
required, I think a script should be completely paused until it receives
feedback .. because the reason why its not receiving it quickly enough is most
likely communications delay or lack of CPU/resources on either ends –
meaning something should wait. This will be a job for the microthreader.<o:p></o:p></span></font></p>

<p class=MsoNormal><font size=2 color=navy face=Arial><span lang=EN-US
style='font-size:10.0pt;font-family:Arial;color:navy'><o:p> </o:p></span></font></p>

<p class=MsoNormal><font size=2 color=navy face=Arial><span lang=EN-US
style='font-size:10.0pt;font-family:Arial;color:navy'>For commands that require
feedback we will use an ID in the packet. Server will respond with this ID in a
packet. This way there is no blocking operation (in code) while waiting for
reply (although script must be blocked).<o:p></o:p></span></font></p>

<p class=MsoNormal><font size=2 color=navy face=Arial><span lang=EN-US
style='font-size:10.0pt;font-family:Arial;color:navy'><o:p> </o:p></span></font></p>

<p class=MsoNormal><font size=2 color=navy face=Arial><span style='font-size:
10.0pt;font-family:Arial;color:navy'><o:p> </o:p></span></font></p>

<div>

<p class=MsoNormal><font size=2 color=navy face=Arial><span style='font-size:
10.0pt;font-family:Arial;color:navy'>Sincerely,</span></font><font color=navy><span
style='color:navy'><o:p></o:p></span></font></p>

<p class=MsoNormal><font size=2 color=navy face=Arial><span style='font-size:
10.0pt;font-family:Arial;color:navy'> Tedd</span></font><o:p></o:p></p>

</div>

<div>

<div class=MsoNormal align=center style='text-align:center'><font size=3
face="Times New Roman"><span style='font-size:12.0pt'>

<hr size=2 width="100%" align=center tabindex=-1>

</span></font></div>

<p class=MsoNormal><b><font size=2 face=Tahoma><span style='font-size:10.0pt;
font-family:Tahoma;font-weight:bold'>Fra:</span></font></b><font size=2
face=Tahoma><span style='font-size:10.0pt;font-family:Tahoma'> opensim-dev-bounces@lists.berlios.de
[mailto:opensim-dev-bounces@lists.berlios.de] <b><span style='font-weight:bold'>På
vegne av</span></b> Stefan Andersson<br>
<b><span style='font-weight:bold'>Sendt:</span></b> 12. oktober 2007 15:50<br>
<b><span style='font-weight:bold'>Til:</span></b> opensim-dev@lists.berlios.de<br>
<b><span style='font-weight:bold'>Emne:</span></b> Re: [Opensim-dev]
ScriptServer communication</span></font><o:p></o:p></p>

</div>

<p class=MsoNormal><font size=3 face="Times New Roman"><span style='font-size:
12.0pt'><o:p> </o:p></span></font></p>

<p class=MsoNormal style='margin-bottom:12.0pt'><font size=2 face=Tahoma><span
style='font-size:10.0pt;font-family:Tahoma'>Tedd,<br>
 <br>
first of all I'd recommend you to build your approach so this isn't tied hard
to LSL; much could be gained by inserting a provider interface in there
somewhere.<br>
 <br>
The 'expect immediate reply' is easier and harder than what one would think;
but the easiest approach would be just to halt script execution until the reply
comes back.<br>
 <br>
I'd suggest you do this by dividing your script executions into 'pieces of
work' in such a way that the thread can easily yield if it encounters an synch
operation (consider, for example, to do those using the asynch pattern) and let
the current thread just go on with the next piece of work.<br>
 <br>
Also, I'd say that if you want to code proof, you'd halt the incoming requests
until the next update sweep, as otherwise you'll have inconsistent data between
sweeps (and between sequential reads)<br>
 <br>
Or, you could hook into the UpdateMovement / Simulate / Update chain to Perform
Writes / Halt / Perform Reads. (having two request queues)<br>
 <br>
Also, you need to decide whether one script host serves many regions, or the
opposite; allowing a many-to-many relation would in all probability create a
lot of small updates and queries, but choosing a 1-to-many relation would give
you an option to queue and send chunks of updates. On a side note, you'd really
want some statistics on what events are the most common; world updates or
script updates.<br>
 <br>
I still feel you will get a lot more bang for your buck by leaving the LSL
event/object model and tailor something new.<br>
 <br>
It's a dead cool initiative though.<br>
 <br>
All the best,<br>
/Stefan<br>
<br>
<o:p></o:p></span></font></p>

<div class=MsoNormal align=center style='text-align:center'><font size=2
face=Tahoma><span style='font-size:10.0pt;font-family:Tahoma'>

<hr size=2 width="100%" align=center id="EC_stopSpelling">

</span></font></div>

<p class=MsoNormal style='margin-bottom:12.0pt'><font size=2 face=Tahoma><span
style='font-size:10.0pt;font-family:Tahoma'>Date: Sat, 6 Oct 2007 02:08:59
+0200<br>
From: tedd@konge.net<br>
To: opensim-dev@lists.berlios.de<br>
Subject: [Opensim-dev] ScriptServer communication<o:p></o:p></span></font></p>

<div>

<p class=MsoNormal><font size=2 face=Arial><span style='font-size:10.0pt;
font-family:Arial'>[23:15:56] <Tedd> ok... so I got this neato plan on
getting stand alone ScriptEngine working, and making good progress...</span></font><font
size=2 face=Tahoma><span style='font-size:10.0pt;font-family:Tahoma'><o:p></o:p></span></font></p>

<p class=MsoNormal><font size=2 face=Arial><span style='font-size:10.0pt;
font-family:Arial'>[23:15:56] <Tedd> BUT - I need some feedback</span></font><font
size=2 face=Tahoma><span style='font-size:10.0pt;font-family:Tahoma'><o:p></o:p></span></font></p>

<p class=MsoNormal><font size=2 face=Arial><span style='font-size:10.0pt;
font-family:Arial'>[23:15:56] <Tedd> Communication between stand alone
ScriptEngine and the Region... How to handle... here are a few keywords:</span></font><font
size=2 face=Tahoma><span style='font-size:10.0pt;font-family:Tahoma'><o:p></o:p></span></font></p>

<p class=MsoNormal><font size=2 face=Arial><span style='font-size:10.0pt;
font-family:Arial'>[23:15:56] <Tedd> * Event from region to ScriptEngine
(to script) for create new script and for the 16 events like touch_start.</span></font><font
size=2 face=Tahoma><span style='font-size:10.0pt;font-family:Tahoma'><o:p></o:p></span></font></p>

<p class=MsoNormal><font size=2 face=Arial><span style='font-size:10.0pt;
font-family:Arial'>[23:15:56] <Tedd> * LSL command to manipulate
something in-world from script to region</span></font><font size=2 face=Tahoma><span
style='font-size:10.0pt;font-family:Tahoma'><o:p></o:p></span></font></p>

<p class=MsoNormal><font size=2 face=Arial><span style='font-size:10.0pt;
font-family:Arial'>[23:15:56] <Tedd> * LSL command to query something
in-world and have it returned as an LSL event</span></font><font size=2
face=Tahoma><span style='font-size:10.0pt;font-family:Tahoma'><o:p></o:p></span></font></p>

<p class=MsoNormal><font size=2 face=Arial><span style='font-size:10.0pt;
font-family:Arial'>[23:15:56] <Tedd> nevermind local LSL commands like
timers or http get, those will be handled in scriptengine internally</span></font><font
size=2 face=Tahoma><span style='font-size:10.0pt;font-family:Tahoma'><o:p></o:p></span></font></p>

<p class=MsoNormal><font size=2 face=Arial><span style='font-size:10.0pt;
font-family:Arial'>[23:15:56] <Tedd> * Now the problem: LSL Commands that
query/set parameters in-world and expect imediate reply</span></font><font
size=2 face=Tahoma><span style='font-size:10.0pt;font-family:Tahoma'><o:p></o:p></span></font></p>

<p class=MsoNormal><font size=2 face=Arial><span style='font-size:10.0pt;
font-family:Arial'>[23:15:56] <Tedd> And of course:</span></font><font
size=2 face=Tahoma><span style='font-size:10.0pt;font-family:Tahoma'><o:p></o:p></span></font></p>

<p class=MsoNormal><font size=2 face=Arial><span style='font-size:10.0pt;
font-family:Arial'>[23:15:56] <Tedd> * Latency</span></font><font size=2
face=Tahoma><span style='font-size:10.0pt;font-family:Tahoma'><o:p></o:p></span></font></p>

<p class=MsoNormal><font size=2 face=Arial><span style='font-size:10.0pt;
font-family:Arial'>[23:15:56] <Tedd> * Being able to put many commands
(from one specific scriptengine to one specific region) into one request</span></font><font
size=2 face=Tahoma><span style='font-size:10.0pt;font-family:Tahoma'><o:p></o:p></span></font></p>

<p class=MsoNormal><font size=2 face=Arial><span style='font-size:10.0pt;
font-family:Arial'> </span></font><font size=2 face=Tahoma><span
style='font-size:10.0pt;font-family:Tahoma'><o:p></o:p></span></font></p>

<p class=MsoNormal><font size=2 face=Arial><span style='font-size:10.0pt;
font-family:Arial'>I have been doing some thinking and had a good discussion
with Tleiades.</span></font><font size=2 face=Tahoma><span style='font-size:
10.0pt;font-family:Tahoma'><o:p></o:p></span></font></p>

<p class=MsoNormal><font size=2 face=Arial><span style='font-size:10.0pt;
font-family:Arial'>Would like more inputs?</span></font><font size=2
face=Tahoma><span style='font-size:10.0pt;font-family:Tahoma'><o:p></o:p></span></font></p>

<p class=MsoNormal><font size=2 face=Arial><span style='font-size:10.0pt;
font-family:Arial'> </span></font><font size=2 face=Tahoma><span
style='font-size:10.0pt;font-family:Tahoma'><o:p></o:p></span></font></p>

<ul type=disc>
 <li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;
     mso-list:l0 level1 lfo1'><font size=2 face=Arial><span style='font-size:
     10.0pt;font-family:Arial'>EVENTS: Region -> Script</span></font><font
     size=2 face=Tahoma><span style='font-size:10.0pt;font-family:Tahoma'><o:p></o:p></span></font></li>
 <li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;
     mso-list:l0 level1 lfo1'><font size=2 face=Arial><span style='font-size:
     10.0pt;font-family:Arial'>FUNCTION CALL (no feedback): Script -> Region</span></font><font
     size=2 face=Tahoma><span style='font-size:10.0pt;font-family:Tahoma'><o:p></o:p></span></font></li>
 <li class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;
     mso-list:l0 level1 lfo1'><font size=2 face=Arial><span style='font-size:
     10.0pt;font-family:Arial'>FUNCTION CALL (feedback): Script -> Region</span></font><font
     size=2 face=Tahoma><span style='font-size:10.0pt;font-family:Tahoma'><o:p></o:p></span></font></li>
</ul>

<p class=MsoNormal><font size=2 face=Arial><span style='font-size:10.0pt;
font-family:Arial'> </span></font><font size=2 face=Tahoma><span
style='font-size:10.0pt;font-family:Tahoma'><o:p></o:p></span></font></p>

<p class=MsoNormal><font size=2 face=Arial><span style='font-size:10.0pt;
font-family:Arial'>With 10.000 scripts running, would probably be nice with
lazy write on network and sending an array of function calls/events at the
time.</span></font><font size=2 face=Tahoma><span style='font-size:10.0pt;
font-family:Tahoma'><o:p></o:p></span></font></p>

<p class=MsoNormal><font size=2 face=Arial><span style='font-size:10.0pt;
font-family:Arial'> </span></font><font size=2 face=Tahoma><span
style='font-size:10.0pt;font-family:Tahoma'><o:p></o:p></span></font></p>

<p class=MsoNormal><font size=2 face=Arial><span style='font-size:10.0pt;
font-family:Arial'>I’m thinking of going for a .Net Remoting with simple
function calling (one by one) as a first implementation.</span></font><font
size=2 face=Tahoma><span style='font-size:10.0pt;font-family:Tahoma'><o:p></o:p></span></font></p>

<p class=MsoNormal><font size=2 face=Arial><span style='font-size:10.0pt;
font-family:Arial'> </span></font><font size=2 face=Tahoma><span
style='font-size:10.0pt;font-family:Tahoma'><o:p></o:p></span></font></p>

<p class=MsoNormal><font size=2 face=Arial><span style='font-size:10.0pt;
font-family:Arial'>Sincerely,</span></font><font size=2 face=Tahoma><span
style='font-size:10.0pt;font-family:Tahoma'><o:p></o:p></span></font></p>

<p class=MsoNormal><font size=2 face=Arial><span style='font-size:10.0pt;
font-family:Arial'> Tedd</span></font><font size=2 face=Tahoma><span
style='font-size:10.0pt;font-family:Tahoma'><o:p></o:p></span></font></p>

<p class=MsoNormal><font size=3 face="Times New Roman"><span style='font-size:
12.0pt'> </span></font><font size=2 face=Tahoma><span style='font-size:
10.0pt;font-family:Tahoma'><o:p></o:p></span></font></p>

</div>

</div>

</body>

</html>