<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:m="http://schemas.microsoft.com/office/2004/12/omml" 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 12 (filtered medium)">
<style>
<!--
 /* Font Definitions */
 @font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
 /* Style Definitions */
 p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0cm;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Calibri","sans-serif";}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:purple;
        text-decoration:underline;}
span.EmailStyle17
        {mso-style-type:personal-compose;
        font-family:"Calibri","sans-serif";
        color:windowtext;}
.MsoChpDefault
        {mso-style-type:export-only;}
@page Section1
        {size:612.0pt 792.0pt;
        margin:70.85pt 70.85pt 70.85pt 70.85pt;}
div.Section1
        {page:Section1;}
-->
</style>
<!--[if gte mso 9]><xml>
 <o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
 <o:shapelayout v:ext="edit">
  <o:idmap v:ext="edit" data="1" />
 </o:shapelayout></xml><![endif]-->
</head>

<body lang=IS link=blue vlink=purple>

<div class=Section1>

<p class=MsoNormal>Hello there.<o:p></o:p></p>

<p class=MsoNormal>Attached is a patch to the trunk stackless version,
implementing tasklet &#8222;priority&#8220;.<o:p></o:p></p>

<p class=MsoNormal>The motivation for this is to enhance the throughput of stackless-based
IO solutions, and the performance of channel-based locks.<o:p></o:p></p>

<p class=MsoNormal><o:p>&nbsp;</o:p></p>

<p class=MsoNormal>There are two priority levels:  &#8218;prority&#8216; and &#8218;normal.&#8216;<o:p></o:p></p>

<p class=MsoNormal>The idea is that a &#8222;priority&#8220; tasklet will get
priority over regular tasklets in the runnable queue.  A tasklet can have the &#8218;priority&#8216;
flag set, in which case it is always high priority, or else, have its boost()
function called, in which case it will get high priority only once, on it s
next insertion into the runnable queue (or immediately, if it is already
runnable).  Once it is run, or removed from the queue, it falls back to normal.<o:p></o:p></p>

<p class=MsoNormal><o:p>&nbsp;</o:p></p>

<p class=MsoNormal>The use case for this is to give additional priority for &#8222;interrupt&#8220;
tasklets, such as those that receive IO events, without having to switch
immediately to them.  Such a tasklet would get a boost() call, before being
insert()-ed (e.g. by calling channel.queue.boost() before calling
channel.send(None) for a channel with channel.balance=0).  Thus the calling
tasklet continues, but the awoken tasklet will get put ahead all &#8222;normal&#8220;
tasklets in the queue.  It will be put after any other high priority tasklets
already there, however.<o:p></o:p></p>

<p class=MsoNormal><o:p>&nbsp;</o:p></p>

<p class=MsoNormal>This is also useful for locks, in order to implement
high-throughput locks (avoid lock-convoys) without the &#8222;switch
immediately&#8220; semantics that a channel with priority == -1 haves.  The
front most tasklet waiting for the lock can then have its priority boosted
before being awoken, to be given the chance to grab the lock.<o:p></o:p></p>

<p class=MsoNormal><o:p>&nbsp;</o:p></p>

<p class=MsoNormal><o:p>&nbsp;</o:p></p>

<p class=MsoNormal>The patch is fairly simple.  I added a number of high-level
functions to manipulate the runnable queue.  We actually have two queues, one
which hangs off state-&gt;ts.current as before, and another at
state-&gt;ts.priority.  That one is consulted whenever a new tasklet is moved
up in state-&gt;ts.current to become the next active tasklet.<o:p></o:p></p>

<p class=MsoNormal><o:p>&nbsp;</o:p></p>

<p class=MsoNormal>I used the oppertunity to visit those places in the code
where state-&gt;ts.current was being manipulated, often with low-level
constructs, and to try to understand, and straighten out the purpose of the
code there, using proper functions instead of macros for list evaluation.<o:p></o:p></p>

<p class=MsoNormal><o:p>&nbsp;</o:p></p>

<p class=MsoNormal>I&#8216;ve added a rudimentary test into the unittests for
this.<o:p></o:p></p>

<p class=MsoNormal><o:p>&nbsp;</o:p></p>

<p class=MsoNormal>If no one objects too strongly to this I&#8216;m hoping to
get this accepted into the trunk.<o:p></o:p></p>

<p class=MsoNormal><o:p>&nbsp;</o:p></p>

<p class=MsoNormal>Cheers,<o:p></o:p></p>

<p class=MsoNormal><o:p>&nbsp;</o:p></p>

<p class=MsoNormal>Kristján<span lang=EN-US><o:p></o:p></span></p>

</div>

</body>

</html>