<br><br><div class="gmail_quote">On Fri, May 29, 2009 at 5:14 PM, Ulrich Weigand <span dir="ltr">&lt;<a href="mailto:uweigand@de.ibm.com">uweigand@de.ibm.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;">
Hello,<br>
<br>
diff -urNp mono-2.4-orig/mono/metadata/metadata.c mono-2.4/mono/metadata/metadata.c<br>
--- mono-2.4-orig/mono/metadata/metadata.c      2009-02-14 00:33:05.000000000 +0100<br>
+++ mono-2.4/mono/metadata/metadata.c   2009-05-28 20:12:38.000000000 +0200<br>
@@ -2196,7 +2197,8 @@ inflated_method_in_image (gpointer key,<br>
        // <a href="https://bugzilla.novell.com/show_bug.cgi?id=458168" target="_blank">https://bugzilla.novell.com/show_bug.cgi?id=458168</a><br>
        return method-&gt;declaring-&gt;klass-&gt;image == image ||<br>
                (method-&gt;context.class_inst &amp;&amp; ginst_in_image (method-&gt;context.class_inst, image)) ||<br>
-               (method-&gt;context.method_inst &amp;&amp; ginst_in_image (method-&gt;context.method_inst, image)) || signature_in_image (mono_method_signature ((MonoMethod*)method), image);<br>
+               (method-&gt;context.method_inst &amp;&amp; ginst_in_image (method-&gt;context.method_inst, image)) ||<br>
+               (((MonoMethod*)method)-&gt;signature &amp;&amp; signature_in_image (((MonoMethod*)method)-&gt;signature, image));<br>
 }<br>
<br>
 static gboolean<br>
<br>
</blockquote><div><br>This has been fixed in trunk and 2.4<br><br> </div><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;"><br>
The second problem is related to wrapper classes allocated by the<br>
routines in marshal.c.  I&#39;ve been seeing various instances of crashes<br>
caused by those routines returning apparently clobbered method structures.<br>
<br>
It turns out this was caused by stale entried in the caches maintained<br>
by the marshal.c routines.  For example, the<br>
MonoMethod *mono_marshal_get_static_rgctx_invoke (MonoMethod *method)<br>
routine will store the MonoMethod structure describing the wrapper for<br>
&quot;method&quot; into a cache allocated on the mempool associated with the<br>
image related to the method&#39;s class.  For &quot;normal&quot; methods, the method<br>
structure itself was already allocated on that same mempool, so the<br>
wrapper has identical lifetime as the method it wraps.<br>
<br>
However, there is one case where things are more complex: &quot;inflated&quot;<br>
generic methods.  These are *not* allocated on a mempool, but on the<br>
heap, and will be freed at a certain point in time.  However, nothing<br>
ensures that any previously allocated wrapper for such a method is<br>
also freed at this time.<br>
<br>
For the most part, this does not matter much, as the wrapper cache is<br>
indexed using the address of the MonoMethod structure as key.  If the<br>
method no longer exists, it isn&#39;t looked up, so it doesn&#39;t matter that<br>
a stale value is still in the hash table.<br>
<br>
However, it *can* happen that a later allocation of a fresh MonoMethod<br>
just happens to reside at the same address as a method that was deleted<br>
previously.  Now, when looking up a wrapper for the new method, the<br>
stale entry for the old method may indeed be found.  This causes various<br>
problems; in particular, while the cached wrapper method itself is still<br>
live, some of the structures it points to (type, signature) may themselves<br>
have been deleted in the meantime, so random memory may be accessed.<br>
<br>
A similar problem seems to occur for dynamic methods, and for those it<br>
seems special care is taken to remove wrappers for such methods from the<br>
cache when the method is deleted (mono_marshal_free_dynamic_wrappers).<br>
<br>
It looks like a similar approach ought to be taken for inflated methods.<br>
The following patch implements this.  Again, I&#39;m not complete sure this<br>
is the right approach, but it fixes the symptoms for me.<br>
</blockquote><div><br>Your change isn&#39;t required because you only remove from image hash tables,<br>which are released together with the inflated method.<br><br>Can you try OpenSim using mono from the tip of the 2.4 branch?<br>
<br><br></div></div>