When you run with -X:MTA, is the object now being finalized on a thread other than thread #2?<br><br><div class="gmail_quote">On Thu, Nov 6, 2008 at 7:01 AM, William Reade <span dir="ltr">&lt;<a href="mailto:william@resolversystems.com">william@resolversystems.com</a>&gt;</span> wrote:<br>
<blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">Thanks Dino -- it seems that if I use ipy with -X:MTA, I can no longer reproduce the problem. However, this bothers me a bit: I&#39;m not competent to follow all the consequences here, but this situation seems to imply that Ironclad won&#39;t be usable safely from any STA thread. Is this an intended restriction or a bug?<br>

<br>
Incidentally, tracking down the call stacks proved to be hard work: the timing changed enough that I only got a single failure over dozens of runs, and it turned out I&#39;d got the logging wrong, so I didn&#39;t find out anything useful :(.<div>
<div></div><div class="Wj3C7c"><br>
<br>
Dino Viehland wrote:<br>
<blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
I would suggest getting a snap shot of the call stacks when this is happening if that&#39;s possible. &nbsp;I can&#39;t pin anything down but I wonder if you could have an STA object or something that otherwise requires message pumping. &nbsp;That message pumping could happen while you&#39;re doing a Monitor.Enter call. &nbsp;If that was happening maybe there is some subtle CLR bug or a surprise feature? &nbsp;It is surprising that Monitor.Enter can go re-entrant but it can...<br>

<br>
So it&#39;d be interesting to get thread snapshots and see if<br>
<br>
 &nbsp;<br>
<blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; EnsureGIL (443) 2<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; EnsureGIL (443) 1 &nbsp; &nbsp; &nbsp;&lt;- omg, wtf, bbq, etc.<br>
 &nbsp; &nbsp;<br>
</blockquote>
<br>
Could be happening because Thread 1 experiences contention, blocks and pumps messages, causing the finalizer thread (2) to run, the lock is acquired and ... ?<br>
<br>
Only other thing I could think of is does it repro on other machines? &nbsp;Maybe it&#39;s a hardware bug as unlikely as that seems?<br>
<br>
-----Original Message-----<br>
From: <a href="mailto:users-bounces@lists.ironpython.com" target="_blank">users-bounces@lists.ironpython.com</a> [mailto:<a href="mailto:users-bounces@lists.ironpython.com" target="_blank">users-bounces@lists.ironpython.com</a>] On Behalf Of William Reade<br>

Sent: Wednesday, November 05, 2008 10:01 AM<br>
To: Discussion of IronPython<br>
Subject: Re: [IronPython] Ironclad problem, with which someone here may be able to help<br>
<br>
The log starts in the middle (after many lock/unlocks, some from each<br>
thread); I&#39;m running on x86; and I have no additional AppDomains.<br>
<br>
I don&#39;t think it would be safe for me to entirely avoid locking during<br>
finalization, but I could probably cut it down to a quick lock, on a<br>
separate object, to enqueue pointers for cleanup and deallocation on the<br>
main thread. However, I&#39;m reluctant to do that until I&#39;m sure that the<br>
problem is specifically related to GC, otherwise it&#39;ll just come back as<br>
soon as anyone tries any serious multithreading :).<br>
<br>
Curt Hagenlocher wrote:<br>
 &nbsp;<br>
<blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
Locking during finalization is often considered to be a bad idea. &nbsp;In<br>
particular, locking without a timeout introduces the possibility that<br>
you will hang the finalization thread, preventing further objects from<br>
being finalized. &nbsp;But clearly, that&#39;s not what&#39;s happening here.<br>
<br>
Other questions that probably don&#39;t matter but might be interesting to<br>
know:<br>
<br>
Can we assume that the finalization thread isn&#39;t the first place where<br>
this lock is required? &nbsp;That your log starts somewhere in the middle?<br>
<br>
Is this under x86 or x64 or both?<br>
<br>
Are you creating any additional AppDomains in the process?<br>
<br>
<br>
On Wed, Nov 5, 2008 at 10:15 AM, William Reade<br>
&lt;<a href="mailto:william@resolversystems.com" target="_blank">william@resolversystems.com</a> &lt;mailto:<a href="mailto:william@resolversystems.com" target="_blank">william@resolversystems.com</a>&gt;&gt; wrote:<br>
<br>
 &nbsp; &nbsp;Hi Curt<br>
<br>
 &nbsp; &nbsp;I am indeed; that&#39;s how I know thread 2 is the GC thread. Is<br>
 &nbsp; &nbsp;locking during GC forbidden?<br>
<br>
 &nbsp; &nbsp;William<br>
<br>
 &nbsp; &nbsp;Curt Hagenlocher wrote:<br>
<br>
 &nbsp; &nbsp; &nbsp; &nbsp;...or, for that matter, any __del__ methods from within Python<br>
 &nbsp; &nbsp; &nbsp; &nbsp;-- which ultimately are handled by finalization.<br>
<br>
 &nbsp; &nbsp; &nbsp; &nbsp;On Wed, Nov 5, 2008 at 9:37 AM, Curt Hagenlocher<br>
 &nbsp; &nbsp; &nbsp; &nbsp;&lt;<a href="mailto:curt@hagenlocher.org" target="_blank">curt@hagenlocher.org</a> &lt;mailto:<a href="mailto:curt@hagenlocher.org" target="_blank">curt@hagenlocher.org</a>&gt;<br>
 &nbsp; &nbsp; &nbsp; &nbsp;&lt;mailto:<a href="mailto:curt@hagenlocher.org" target="_blank">curt@hagenlocher.org</a> &lt;mailto:<a href="mailto:curt@hagenlocher.org" target="_blank">curt@hagenlocher.org</a>&gt;&gt;&gt;<br>
 &nbsp; &nbsp; &nbsp; &nbsp;wrote:<br>
<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; So, the obvious question for me is whether or not you&#39;re<br>
 &nbsp; &nbsp; &nbsp; &nbsp;using any<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; finalizers.<br>
<br>
<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; On Wed, Nov 5, 2008 at 5:57 AM, William Reade<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;<a href="mailto:william@resolversystems.com" target="_blank">william@resolversystems.com</a><br>
 &nbsp; &nbsp; &nbsp; &nbsp;&lt;mailto:<a href="mailto:william@resolversystems.com" target="_blank">william@resolversystems.com</a>&gt;<br>
 &nbsp; &nbsp; &nbsp; &nbsp;&lt;mailto:<a href="mailto:william@resolversystems.com" target="_blank">william@resolversystems.com</a><br>
 &nbsp; &nbsp; &nbsp; &nbsp;&lt;mailto:<a href="mailto:william@resolversystems.com" target="_blank">william@resolversystems.com</a>&gt;&gt;&gt;<br>
<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; wrote:<br>
<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Hi all<br>
<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; While running the numpy tests, I&#39;ve come across a situation<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; which, to the best of my knowledge, is simply<br>
 &nbsp; &nbsp; &nbsp; &nbsp;impossible. I&#39;m<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; hoping that one of the local .NET gurus will be able to<br>
 &nbsp; &nbsp; &nbsp; &nbsp;tell<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; me what I&#39;m missing, or point me somewhere I can get<br>
 &nbsp; &nbsp; &nbsp; &nbsp;more insight.<br>
<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; The 4 methods involved are as follows:<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; -----------------------<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; public int GetThreadId()<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return Thread.CurrentThread.ManagedThreadId;<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }<br>
<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; public void WriteFlush(string info)<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Console.WriteLine(info);<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Console.Out.Flush();<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }<br>
<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; public void EnsureGIL()<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Monitor.Enter(this.dispatcherLock);<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; this.WriteFlush(String.Format(<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &quot;EnsureGIL ({1}) {0}&quot;, this.GetThreadId(),<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Builtin.id(this.dispatcherLock)));<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }<br>
<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; public void ReleaseGIL()<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; this.WriteFlush(String.Format(<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &quot;ReleaseGIL ({1}) {0}\n&quot;, this.GetThreadId(),<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Builtin.id(this.dispatcherLock)));<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Monitor.Exit(this.dispatcherLock);<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; -----------------------<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ...and they can, and do, occasionally produce output as<br>
 &nbsp; &nbsp; &nbsp; &nbsp;follows:<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; -----------------------<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; EnsureGIL (443) 2<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; EnsureGIL (443) 1 &nbsp; &nbsp; &nbsp;&lt;- omg, wtf, bbq, etc.<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ReleaseGIL (443) 2<br>
<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; EnsureGIL (443) 2<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ReleaseGIL (443) 1<br>
<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ReleaseGIL (443) 2<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; -----------------------<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; When this happens, the process continues happily for a<br>
 &nbsp; &nbsp; &nbsp; &nbsp;short<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; time and then falls over in a later call to ReleaseGIL<br>
 &nbsp; &nbsp; &nbsp; &nbsp;(after<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; successfully calling it several times). The error is &quot;<br>
 &nbsp; &nbsp; &nbsp; &nbsp;Object<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; synchronization method was called from an<br>
 &nbsp; &nbsp; &nbsp; &nbsp;unsynchronized block<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; of code&quot;, which I understand to mean &quot;you can&#39;t release<br>
 &nbsp; &nbsp; &nbsp; &nbsp;this<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; lock because you don&#39;t hold it&quot;.<br>
<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; It doesn&#39;t happen very often, but I can usually<br>
 &nbsp; &nbsp; &nbsp; &nbsp;reproduce it<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; by running<br>
 &nbsp; &nbsp; &nbsp; &nbsp;test_multiarray.TestFromToFile.test_malformed a few<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; hundred times. It may be relevant to note that thread 2<br>
 &nbsp; &nbsp; &nbsp; &nbsp;is the<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; GC thread, and thread 1 is the main thread. I have<br>
 &nbsp; &nbsp; &nbsp; &nbsp;considered<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; the following possibilities:<br>
<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; (1) That I&#39;m locking on the wrong object. I believe<br>
 &nbsp; &nbsp; &nbsp; &nbsp;that isn&#39;t<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; the case, because it&#39;s constructed only once, as a &quot;new<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Object()&quot; (ie, a reference type), and is only subsequently<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; used for locking; and, because it keeps the same ipy id<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; throughout.<br>
<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; (2) That Monitor.Enter occasionally allows two different<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; threads to acquire the same lock. I consider this extremely<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; unlikely, because... well, how many multithreaded .NET apps<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; already exist? If Monitor really were broken, I think we&#39;d<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; probably know about it by now.<br>
<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; (3) That calling Flush() on a SyncTextWriter (the type of<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Console.Out) doesn&#39;t actually do anything, and the<br>
 &nbsp; &nbsp; &nbsp; &nbsp;output is<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; somehow wrongly ordered (although I can&#39;t imagine how this<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; could actually be: if the locking is really working,<br>
 &nbsp; &nbsp; &nbsp; &nbsp;then my<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; console writes are strictly sequential). I don&#39;t have<br>
 &nbsp; &nbsp; &nbsp; &nbsp;access<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; to the code, so I have no idea how it&#39;s implemented,<br>
 &nbsp; &nbsp; &nbsp; &nbsp;but even<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if this is the case it doesn&#39;t help much with the<br>
 &nbsp; &nbsp; &nbsp; &nbsp;fundamental<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; problem (the synchronisation error which follows).<br>
<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Apart from the above, I&#39;m out of ideas. Can anyone suggest<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; what I&#39;ve missed?<br>
<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; William<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; _______________________________________________<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Users mailing list<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <a href="mailto:Users@lists.ironpython.com" target="_blank">Users@lists.ironpython.com</a><br>
 &nbsp; &nbsp; &nbsp; &nbsp;&lt;mailto:<a href="mailto:Users@lists.ironpython.com" target="_blank">Users@lists.ironpython.com</a>&gt;<br>
 &nbsp; &nbsp; &nbsp; &nbsp;&lt;mailto:<a href="mailto:Users@lists.ironpython.com" target="_blank">Users@lists.ironpython.com</a><br>
 &nbsp; &nbsp; &nbsp; &nbsp;&lt;mailto:<a href="mailto:Users@lists.ironpython.com" target="_blank">Users@lists.ironpython.com</a>&gt;&gt;<br>
<br>
<br>
 &nbsp; &nbsp; &nbsp; &nbsp; <a href="http://lists.ironpython.com/listinfo.cgi/users-ironpython.com" target="_blank">http://lists.ironpython.com/listinfo.cgi/users-ironpython.com</a><br>
<br>
<br>
<br>
 &nbsp; &nbsp; &nbsp; &nbsp;------------------------------------------------------------------------<br>
<br>
<br>
<br>
 &nbsp; &nbsp; &nbsp; &nbsp;_______________________________________________<br>
 &nbsp; &nbsp; &nbsp; &nbsp;Users mailing list<br>
 &nbsp; &nbsp; &nbsp; &nbsp;<a href="mailto:Users@lists.ironpython.com" target="_blank">Users@lists.ironpython.com</a> &lt;mailto:<a href="mailto:Users@lists.ironpython.com" target="_blank">Users@lists.ironpython.com</a>&gt;<br>
 &nbsp; &nbsp; &nbsp; &nbsp;<a href="http://lists.ironpython.com/listinfo.cgi/users-ironpython.com" target="_blank">http://lists.ironpython.com/listinfo.cgi/users-ironpython.com</a><br>
<br>
<br>
<br>
 &nbsp; &nbsp;_______________________________________________<br>
 &nbsp; &nbsp;Users mailing list<br>
 &nbsp; &nbsp;<a href="mailto:Users@lists.ironpython.com" target="_blank">Users@lists.ironpython.com</a> &lt;mailto:<a href="mailto:Users@lists.ironpython.com" target="_blank">Users@lists.ironpython.com</a>&gt;<br>
 &nbsp; &nbsp;<a href="http://lists.ironpython.com/listinfo.cgi/users-ironpython.com" target="_blank">http://lists.ironpython.com/listinfo.cgi/users-ironpython.com</a><br>
<br>
<br>
------------------------------------------------------------------------<br>
<br>
_______________________________________________<br>
Users mailing list<br>
<a href="mailto:Users@lists.ironpython.com" target="_blank">Users@lists.ironpython.com</a><br>
<a href="http://lists.ironpython.com/listinfo.cgi/users-ironpython.com" target="_blank">http://lists.ironpython.com/listinfo.cgi/users-ironpython.com</a><br>
<br>
 &nbsp; &nbsp;<br>
</blockquote>
<br>
_______________________________________________<br>
Users mailing list<br>
<a href="mailto:Users@lists.ironpython.com" target="_blank">Users@lists.ironpython.com</a><br>
<a href="http://lists.ironpython.com/listinfo.cgi/users-ironpython.com" target="_blank">http://lists.ironpython.com/listinfo.cgi/users-ironpython.com</a><br>
<br>
_______________________________________________<br>
Users mailing list<br>
<a href="mailto:Users@lists.ironpython.com" target="_blank">Users@lists.ironpython.com</a><br>
<a href="http://lists.ironpython.com/listinfo.cgi/users-ironpython.com" target="_blank">http://lists.ironpython.com/listinfo.cgi/users-ironpython.com</a><br>
<br>
 &nbsp;<br>
</blockquote>
<br>
_______________________________________________<br>
Users mailing list<br>
<a href="mailto:Users@lists.ironpython.com" target="_blank">Users@lists.ironpython.com</a><br>
<a href="http://lists.ironpython.com/listinfo.cgi/users-ironpython.com" target="_blank">http://lists.ironpython.com/listinfo.cgi/users-ironpython.com</a><br>
</div></div></blockquote></div><br>