<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
  <meta content="text/html;charset=windows-1252"
 http-equiv="Content-Type">
</head>
<body bgcolor="#ffffff" text="#000000">
Hi Andrew and Richard,<br>
<br>
My problem was a kind of circular wait like Andrew described. <br>
<br>
I sorted it out. Then I ran into the issue that a channel is not a
queue. Sorted that too by adding queue-like behaviour to my channel
wrapper and now my app is running faster thanks to stackless.<br>
<br>
Andrew Francis wrote:
<blockquote cite="mid:821512.87415.qm@web34203.mail.mud.yahoo.com"
 type="cite">
  <pre wrap="">Hi Paul:

  </pre>
  <blockquote type="cite">
    <pre wrap="">Message: 1
Date: Fri, 09 Jan 2009 16:50:44 +0100
From: Paul Sijben <a class="moz-txt-link-rfc2396E" href="mailto:sijben@eemvalley.com">&lt;sijben@eemvalley.com&gt;</a>
Subject: [Stackless] need help on debugging a deadlock
To: <a class="moz-txt-link-abbreviated" href="mailto:stackless@stackless.com">stackless@stackless.com</a>
Message-ID: <a class="moz-txt-link-rfc2396E" href="mailto:49677254.1040804@eemvalley.com">&lt;49677254.1040804@eemvalley.com&gt;</a>
Content-Type: text/plain; charset=UTF-8

I am creating a deadlock somewhere.

Is there a way to ensure that a tasklet does not receive
more than a
certain number of milliseconds and is then stopped with
some message on
the console so I can see which one it was?

Or are there even better ways to find out what is going on?
    </pre>
  </blockquote>
  <pre wrap=""><!---->
Gee whiz, my first deadlock programme was in December 2005!
<a class="moz-txt-link-freetext" href="http://www.stackless.com/pipermail/stackless/2005-December/000290.html">http://www.stackless.com/pipermail/stackless/2005-December/000290.html</a>

I'll assume that Stackless complains about deadlock? Or the programme is simply hanging?

I feel the best way to find out what is going on concerning deadlock, is to understand how deadlock occurs. Deadlock occurs when four conditions happen simultaneously: mutual exclusion, non-preemption, hold-and-wait, circular wait.

Stackless in non-preemption mode essentially give you the first two conditions. I'll argue hold-and-wait looks like:

ch1.receive()   # I am waiting on a resource
ch2.send()      # I am holding a resource 

Circular wait:

tasklet1():
    ch1.send()
    ch2.receive()

tasklet2():
    ch2.send()
    ch1.receive()

However, due to transitivity, this is harder to detect. A wait-for graph is needed. I believe this is the way it works. 

Tasklet channel operations are nodes. Channels are resources. If a tasklet does an operation on channel owned by a particular node, draw an directed edge to that node. When the transaction is finished, remove the edge. If there is a cycle, there is deadlock.

In the following case, a line would be drawn from tasklet1 to tasklet2. 
In turn, there is a line drawn from tasklet2 to tasklet1. Deadlock.

As for debugging. Often I find the following helpful

1. create a function, say makeChannel(). As a part of the function, store the channel in some list.

2. In my main loop, I use the construct

while (stackless.getruncount() &gt; 1):
    stackless.schedule()

(I guess stackless.run() would work too)

depending on your programme, if all the tasklets are blocked (i.e., due to deadlock), control will fall out of the loop.

3. Iterate over the list and do a __reduce__ on each channel. You will see the channel balances and the associated tasklets. This will give you insights about what is happening.

Looking back at the December 2005 posts, perhaps with decorators, we could get enough information to build a graph walker/cycle detector? In 2009, we should be much better at solving this :-|

Anyhow, if you can, post code.

Cheers,
Andrew

P.S - Shameless plug: I explain deadlock in my Pycon 2008 talk "Adventures in Stackless Python Twisted Integration".....




      

_______________________________________________
Stackless mailing list
<a class="moz-txt-link-abbreviated" href="mailto:Stackless@stackless.com">Stackless@stackless.com</a>
<a class="moz-txt-link-freetext" href="http://www.stackless.com/mailman/listinfo/stackless">http://www.stackless.com/mailman/listinfo/stackless</a>
  </pre>
</blockquote>
<br>
<pre class="moz-signature" cols="72">-- 
Paul Sijben                            tel: +31334566488
Eemvalley Technology BV               fax: +31334557523
the Netherlands                        <a class="moz-txt-link-freetext" href="http://eemvalley.com">http://eemvalley.com</a>    
-----------------------------------------------------
EemValley Technology werft python &amp; wxpython 
programmeurs: <a class="moz-txt-link-freetext" href="http://www.eemvalley.nl/jobs">http://www.eemvalley.nl/jobs</a>
</pre>
</body>
</html>