<html><head><meta http-equiv="Content-Type" content="text/html charset=us-ascii"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; ">Thanks. We are indeed keeping a reference around to the delegate to ensure it's not being collected. We use two such delegates, and the only one we see problems with is the one that's launched from these other worker threads. It's possible that there's something about these threads that is not friendly, not just the fact that mono didn't create them. <div><div apple-content-edited="true"><span class="Apple-style-span" style="border-collapse: separate; color: rgb(0, 0, 0); font-family: Helvetica; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-align: -webkit-auto; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; font-size: medium; "><span class="Apple-style-span" style="border-collapse: separate; color: rgb(0, 0, 0); font-family: Helvetica; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-align: -webkit-auto; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; font-size: medium; "><span class="Apple-style-span" style="border-collapse: separate; color: rgb(0, 0, 0); font-family: Helvetica; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; font-size: medium; "><span class="Apple-style-span" style="border-collapse: separate; color: rgb(0, 0, 0); font-family: Helvetica; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; font-size: medium; "><span class="Apple-style-span" style="border-collapse: separate; color: rgb(0, 0, 0); font-family: Helvetica; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; font-size: medium; "><span class="Apple-style-span" style="border-collapse: separate; color: rgb(0, 0, 0); font-family: Helvetica; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; font-size: medium; "><span class="Apple-style-span" style="border-collapse: separate; color: rgb(0, 0, 0); font-family: Helvetica; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; font-size: medium; "><b>
</b></span></span></span></span></span></span></span></div><br><div><div>On Jan 29, 2013, at 7:00 AM, Alan <<a href="mailto:alan.mcgovern@gmail.com">alan.mcgovern@gmail.com</a>> wrote:</div><br class="Apple-interchange-newline"><blockquote type="cite">A simple way to diagnose if you're delegates have been GC'ed is to<br>export MONO_DEBUG=keep-delegates. This instructs the GC to not collect<br>delegates and instead rewrite them so that if they're invoked after<br>they would normally have been GC'ed you get a nice diagnostic error<br>message and then the runtime aborts. This is much easier to debug than<br>a random crasher.<br><br>Alan<br><br>On 29 January 2013 07:49, Yuriy Solodkyy <<a href="mailto:y.solodkyy@gmail.com">y.solodkyy@gmail.com</a>> wrote:<br><blockquote type="cite">Do you keep a reference to your delegate while using the pointer? I suspect<br>GC just collect your delegate and function pointer becomes invalid.<br><br>-yuriy<br><br><br>On Tuesday, January 29, 2013, wrote:<br><blockquote type="cite"><br>We are not using the debugger.<br><br>We're not sure how the library in question creates its threads. We<br>don't have access to its source code and it's proprietary. Putting<br>together a full repro would be hard.<br><br>The callback is a simple function which picks up a logged string and<br>sends it to NLog by way of an Rx Subject. That's a lot of moving<br>parts, but they all work fine when the callback comes from one of our<br>threads.<br><br>Am I correct in assuming that the GetFunctionPointerForDelegate should<br>automatically register the thread it's called on with mono? I have<br>enough facts at hand to call the registration function manually if<br>need be, but it would be awkward indeed.<br><br>On Jan 28, 2013, at 6:34 PM, Alan <<a href="mailto:alan.mcgovern@gmail.com">alan.mcgovern@gmail.com</a>> wrote:<br><br><blockquote type="cite">Do you see these issues when running with the soft debugger attached?<br>If so, that was a bug which was fixed a few days ago. If you're seeing<br>the issue without the debugger, a small testcase would be great for<br>figuring this out.<br><br>Alan<br><br>On 28 January 2013 18:42, sebastian <<a href="mailto:sebastian@palladiumconsulting.com">sebastian@palladiumconsulting.com</a>><br>wrote:<br><blockquote type="cite">We run a program under mono which uses a 3rd party C++ library. Mono is<br>responsible for running the application, that is, we are not using the<br>mono_embed API, but rather just PInvoke to talk to the C++ library.<br><br>This library has some callbacks which we subscribe to using<br>Marhsal.GetFunctionPointerForDelegate. However we get exotic<br>concurrency<br>problems (seg faults, inexplicable stacktraces) when we use it. We only<br>get<br>these errors when the callback is made from a thread which was not<br>started<br>by us.<br><br>I know that when embedding mono, i.e. with C++ in the driver's seat,<br>threads<br>must be registered with mono using mono_thread_attach. However that<br>would be<br>a funny thing for us to do, since we're not launching mono ourselves<br>and<br>would have to do some exploration to find all the right pointers.<br><br>Does the code in GetFunctionPointerForDelegate emit a managed wrapper<br>that<br>takes care of this detail? Once we are called back on this foreign<br>thread,<br>there's no telling what or how much .NET code will run on it, and it<br>presumably needs to be properly registered with the garbage collector.<br>I<br>looked at the code in mono_marshal_get_managed_wrapper and didn't see<br>anything obviously related to threading, but I imagine it'd be taken<br>care of<br>at a lower level in any case.<br><br>We could easily be convinced the bugs we saw were GC or threading<br>related,<br>as they could only be explained by corruption of things that shouldn't<br>be<br>corruptible, like reflection and array bounds.<br><br>Or is there additional code or attributes we should be using to ensure<br>correct operation?<br><br>Thanks,<br>Sebastian<br><br><br>_______________________________________________<br>Mono-devel-list mailing list<br><a href="mailto:Mono-devel-list@lists.ximian.com">Mono-devel-list@lists.ximian.com</a><br>http://lists.ximian.com/mailman/listinfo/mono-devel-list<br><br></blockquote></blockquote>_______________________________________________<br>Mono-devel-list mailing list<br><a href="mailto:Mono-devel-list@lists.ximian.com">Mono-devel-list@lists.ximian.com</a><br>http://lists.ximian.com/mailman/listinfo/mono-devel-list<br></blockquote><br><br><br>--<br>Yuriy Solodkyy<br>(<a href="mailto:y.solodkyy@gmail.com">y.solodkyy@gmail.com</a>)<br></blockquote></blockquote></div><br></div></body></html>