<span class="Apple-style-span" style="font-size: 15px; color: rgb(31, 73, 125); "><i>I want to move ILoadNotificationPlugin from being this “catch all” thing that controls the entire assembly to something that can be used to fire up code; effectively “OnLoad” and “OnUnload”. To dynamically control loading, we’ll probably reflect on the individual plugins looking for attributes or perhaps some sort of static load function.</i></span><div>
<br></div><div><span class="Apple-style-span" style="font-size: 15px; color: rgb(31, 73, 125); "></span>I meant to do something like that probably using spring to inject method names to be invoked. Also event listening (wich is I believe a generic need) could be managed this way and benefit from some abstraction. con.pop(1) is probably the most frequently written line by every plugin developer, probably some abstraction (an event started with his thread and the fs event passed as an argument?) could make code more elegant <br>
<br><div class="gmail_quote">On Fri, Sep 11, 2009 at 00:19, Michael Giagnocavo <span dir="ltr">&lt;<a href="mailto:mgg@giagnocavo.net">mgg@giagnocavo.net</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">









<div lang="EN-US" link="blue" vlink="purple">

<div>

<p><span style="font-size:11.0pt;color:#1F497D">Well, we have absolutely no idea what the background thread is
doing. It might be critical, and the fix is trivial: put a try/catch on it.
This is the model all .NET applications have. Background threads doing bad
things should always take down the process. </span></p>

<p><span style="font-size:11.0pt;color:#1F497D"> </span></p>

<p><span style="font-size:11.0pt;color:#1F497D">However, that’s a good point about Load() failing. The
approach taken is more or less how FreeSWITCH handles things in general now. If
a module has an error, the switch just logs and goes on. I’m not really
in favour of this, and suggested at least a “required” attribute in
the modules.conf that would prevent the switch from loading if the module
fails. </span></p>

<p><span style="font-size:11.0pt;color:#1F497D"> </span></p>

<p><span style="font-size:11.0pt;color:#1F497D">The fix is probably to create an attribute you can apply to the
plugin classes that indicate what kind of failure handling you want. For the
assembly, we’d add an attribute with an enumeration like:</span></p>

<p style="margin-left:.75in"><span style="font-size:11.0pt;color:#1F497D"><span>-<span style="font:7.0pt &quot;Times New Roman&quot;">         
</span></span></span><span style="font-size:11.0pt;color:#1F497D">Default (scan, call ILoadNotificationPlugin, log errors if they
occur)</span></p>

<p style="margin-left:.75in"><span style="font-size:11.0pt;color:#1F497D"><span>-<span style="font:7.0pt &quot;Times New Roman&quot;">         
</span></span></span><span style="font-size:11.0pt;color:#1F497D">NoLoad (don’t load the assembly)</span></p>

<p style="margin-left:.75in"><span style="font-size:11.0pt;color:#1F497D"><span>-<span style="font:7.0pt &quot;Times New Roman&quot;">         
</span></span></span><span style="font-size:11.0pt;color:#1F497D">Critical (stop the switch if there’s an exception during
loading)</span></p>

<p><span style="font-size:11.0pt;color:#1F497D"> </span></p>

<p><span style="font-size:11.0pt;color:#1F497D">That’d provide the control you want for loading. We could
do something similar for App/Api plugins.</span></p>

<p><span style="font-size:11.0pt;color:#1F497D"> </span></p>

<p><span style="font-size:11.0pt;color:#1F497D">I want to move ILoadNotificationPlugin from being this “catch
all” thing that controls the entire assembly to something that can be
used to fire up code; effectively “OnLoad” and “OnUnload”.
To dynamically control loading, we’ll probably reflect on the individual
plugins looking for attributes or perhaps some sort of static load function.</span></p>

<p><span style="font-size:11.0pt;color:#1F497D"> </span></p>

<p><span style="font-size:11.0pt;color:#1F497D">How’s that sound?</span></p>

<p><span style="font-size:11.0pt;color:#1F497D"> </span></p>

<p><span style="font-size:11.0pt;color:#1F497D"> </span></p>

<div style="border:none;border-top:solid #B5C4DF 1.0pt;padding:3.0pt 0in 0in 0in">

<p><b><span style="font-size:10.0pt">From:</span></b><span style="font-size:10.0pt">
<a href="mailto:freeswitch-users-bounces@lists.freeswitch.org" target="_blank">freeswitch-users-bounces@lists.freeswitch.org</a>
[mailto:<a href="mailto:freeswitch-users-bounces@lists.freeswitch.org" target="_blank">freeswitch-users-bounces@lists.freeswitch.org</a>] <b>On Behalf Of </b>Josh
Rivers<br>
<b>Sent:</b> Thursday, September 10, 2009 12:48 PM</span></p><div><div></div><div class="h5"><br>
<b>To:</b> <a href="mailto:freeswitch-users@lists.freeswitch.org" target="_blank">freeswitch-users@lists.freeswitch.org</a><br>
<b>Subject:</b> Re: [Freeswitch-users] Subscribing to events in managed C# /
.NET</div></div><p></p>

</div><div><div></div><div class="h5">

<p> </p>

<p>I&#39;m only concerned with the difference in treatment.<br>
<br>
public class CrashFreeSWITCH : ILoadNotificationPlugin<br>
    {<br>
        public bool Load()<br>
        {<br>
            ThreadPool.QueueUserWorkItem((o)
=&gt; { throw new NotImplementedException(); });<br>
            return true;<br>
        }<br>
    }</p>

<div>

<div>

<p><span style="font-size:10.0pt;color:#500050">Crashes the entire switch, terminating all calls and disconnecting
from the PSTN.</span></p>

<p><span><span style="color:black">public class CrashFreeSWITCH : ILoadNotificationPlugin</span></span><span style="color:black"><br>
<span>    {</span><br>
<span>        public bool
Load()</span><br>
<span>        {</span><br>
<span>          
 throw new NotImplementedException();</span><br>
<span>          
 return true;</span><br>
<span>        }</span><br>
<span>    }</span></span><span style="font-size:10.0pt;color:#500050"></span></p>

</div>

<p>Logs a message to the console and doesn&#39;t load the module,
while leaving the switch operating.</p>

</div>

<div>

<p> </p>

</div>

<div>

<p>In my experience, exceptions
in multi-threaded code: a) happen, b) are hard to diagnose. Is the
best behavior for the environment to crash, providing no diagnostic
information? That&#39;s hard in development, and even harder in production. I
suppose &#39;terminate switch on fault&#39; should be an option, to allow the operating
system to restart the whole process on fault conditions, but if that is the
intended result, shouldn&#39;t any fault do the same thing? What if the billing was
happening in my second code block?</p>

</div>

<div>

<p> </p>

</div>

<div>

<p>Normally, I&#39;d trap the ThreadException and
UnhandledExceptions in my application, so that my code could choose the correct
actions to perform should the application get into an unknown state. This can
include terminating the whole application, but also logging diagnostic
information, trying to save uncommitted data, and sending notifications of the
failure.</p>

</div>

<div>

<p> </p>

</div>

<div>

<p>Is &#39;crash if it&#39;s a thread, but not if it&#39;s not&#39; good
because it&#39;s the way the module works now, or is it a better design for a
reason I&#39;m not understanding?</p>

</div>

<div>

<p> </p>

</div>

<div>

<div>

<p>On Wed, Sep 9, 2009 at 11:09 PM, Michael Giagnocavo &lt;<a href="mailto:mgg@giagnocavo.net" target="_blank">mgg@giagnocavo.net</a>&gt; wrote:</p>

<div>

<div>

<p><span style="font-size:11.0pt;color:#1F497D">Well, a segfault in voicemail
would do the same thing.</span></p>

<p><span style="font-size:11.0pt;color:#1F497D"> </span></p>

<p><span style="font-size:11.0pt;color:#1F497D">Suppose your plugin runs a
thread that does something important, like billing or so on. That thread fails
– do you really want it to go on?</span></p>

<p><span style="font-size:11.0pt;color:#1F497D"> </span></p>

<p><span style="font-size:11.0pt;color:#1F497D">Anyways, the solution is simple
enough, handle your exceptions </span><span style="font-size:11.0pt;font-family:Wingdings;color:#1F497D">J</span><span style="font-size:11.0pt;color:#1F497D">.
Every plugin can decide what it wants to do here.</span></p>

<p><span style="font-size:11.0pt;color:#1F497D"> </span></p>

<p><span style="font-size:11.0pt;color:#1F497D">-Michael</span></p>

<p><span style="font-size:11.0pt;color:#1F497D"> </span></p>

<div style="border:none;border-top:solid #B5C4DF 1.0pt;padding:3.0pt 0in 0in 0in">

<p><b><span style="font-size:10.0pt">From:</span></b><span style="font-size:10.0pt"> <a href="mailto:freeswitch-users-bounces@lists.freeswitch.org" target="_blank">freeswitch-users-bounces@lists.freeswitch.org</a> [mailto:<a href="mailto:freeswitch-users-bounces@lists.freeswitch.org" target="_blank">freeswitch-users-bounces@lists.freeswitch.org</a>]
<b>On Behalf Of </b>Josh Rivers<br>
<b>Sent:</b> Wednesday, September 09, 2009 10:41 PM</span></p>

<div>

<div>

<p><br>
<b>To:</b> <a href="mailto:freeswitch-users@lists.freeswitch.org" target="_blank">freeswitch-users@lists.freeswitch.org</a><br>
<b>Subject:</b> Re: [Freeswitch-users] Subscribing to events in managed C# /
.NET</p>

</div>

</div>

</div>

<div>

<div>

<p> </p>

<p style="margin-bottom:12.0pt">The question is whether the CLR should take
down the whole phone server due to an unhandled exception...definitely the CLR
should terminate...but shouldn&#39;t it just log the exception to the console, not crash
the core?</p>

<div>

<p>On Wed, Sep 9, 2009 at 6:30 PM, Michael Giagnocavo &lt;<a href="mailto:mgg@giagnocavo.net" target="_blank">mgg@giagnocavo.net</a>&gt;
wrote:</p>

<div>

<div>

<p><span style="font-size:11.0pt;color:#1F497D">That’s by design. If a
thread fails, and there’s no handler, then the application could be in a
corrupted state, so the CLR takes down the process.</span></p>

<p><span style="font-size:11.0pt;color:#1F497D"> </span></p>

<p><span style="font-size:11.0pt;color:#1F497D">I think there is a .NET 1.0
compat switch you can enable in the config if you like exceptions to be
silently ignored </span><span style="font-size:11.0pt;font-family:Wingdings;color:#1F497D">J</span><span style="font-size:11.0pt;color:#1F497D">.</span></p>

<p><span style="font-size:11.0pt;color:#1F497D"> </span></p>

<p><span style="font-size:11.0pt;color:#1F497D">-Michael</span></p>

<p><span style="font-size:11.0pt;color:#1F497D"> </span></p>

<div style="border:none;border-top:solid #B5C4DF 1.0pt;padding:3.0pt 0in 0in 0in">

<p><b><span style="font-size:10.0pt">From:</span></b><span style="font-size:10.0pt"> <a href="mailto:freeswitch-users-bounces@lists.freeswitch.org" target="_blank">freeswitch-users-bounces@lists.freeswitch.org</a> [mailto:<a href="mailto:freeswitch-users-bounces@lists.freeswitch.org" target="_blank">freeswitch-users-bounces@lists.freeswitch.org</a>]
<b>On Behalf Of </b>Josh Rivers<br>
<b>Sent:</b> Wednesday, September 09, 2009 6:39 PM</span></p>

<div>

<div>

<p><br>
<b>To:</b> <a href="mailto:freeswitch-users@lists.freeswitch.org" target="_blank">freeswitch-users@lists.freeswitch.org</a><br>
<b>Subject:</b> Re: [Freeswitch-users] Subscribing to events in managed C# /
.NET</p>

</div>

</div>

</div>

<div>

<div>

<p> </p>

<p>I have a new thought on the crashes...I&#39;m able to crash FreeSWITCH any time
I like, just by having an exception in a thread.</p>

<div>

<p> </p>

<div>

<p>    public class CrashFreeSWITCH : ILoadNotificationPlugin</p>

</div>

<div>

<p>    {</p>

</div>

<div>

<p>        public bool Load()</p>

</div>

<div>

<p>        {</p>

</div>

<div>

<p>          
 ThreadPool.QueueUserWorkItem((o) =&gt; { throw new
NotImplementedException(); });</p>

</div>

<div>

<p>            return true;</p>

</div>

<div>

<p>        }</p>

</div>

<div>

<p>    }</p>

</div>

<div>

<p> </p>

</div>

<div>

<p>Perhaps Application.ThreadException
or AppDomain.UnhandledException need to be trapped?</p>

</div>

<div>

<p> </p>

</div>

<div>

<p>On Wed, Sep 9, 2009 at 4:51 PM, Michael Giagnocavo &lt;<a href="mailto:mgg@giagnocavo.net" target="_blank">mgg@giagnocavo.net</a>&gt;
wrote:</p>

<div>

<div>

<div>

<p>&gt;Looks like the event object goes straight to pinvokes, so a null result
just crashes?</p>

<p> </p>

</div>

<p>If it’s null, you should get a NullReferenceException. The C# compiler
should callvirt the property getter and that’ll do a null check. If that
isn’t happening, that’d be an interesting optimization somewhere
along the line.</p>

<p> </p>

<p>-Michael </p>

<p><span style="font-size:11.0pt;color:#1F497D"> </span></p>

<p><span style="font-size:11.0pt;color:#1F497D"> </span></p>

<div style="border:none;border-top:solid #B5C4DF 1.0pt;padding:3.0pt 0in 0in 0in">

<p><b><span style="font-size:10.0pt">From:</span></b><span style="font-size:10.0pt"> <a href="mailto:freeswitch-users-bounces@lists.freeswitch.org" target="_blank">freeswitch-users-bounces@lists.freeswitch.org</a> [mailto:<a href="mailto:freeswitch-users-bounces@lists.freeswitch.org" target="_blank">freeswitch-users-bounces@lists.freeswitch.org</a>]
<b>On Behalf Of </b>Josh Rivers<br>
<b>Sent:</b> Wednesday, September 09, 2009 3:01 PM</span></p>

<div>

<p><br>
<b>To:</b> <a href="mailto:freeswitch-users@lists.freeswitch.org" target="_blank">freeswitch-users@lists.freeswitch.org</a></p>

</div>

<p><b>Subject:</b> Re: [Freeswitch-users] Subscribing to events in managed C# /
.NET</p>

</div>

<div>

<div>

<p> </p>

<p>A new discovery:</p>

<div>

<div>

<p>        public bool Load()</p>

</div>

<div>

<p>        {</p>

</div>

<div>

<p>          
 ThreadPool.QueueUserWorkItem((o) =&gt;</p>

</div>

<div>

<p>            {</p>

</div>

<div>

<p>              
 Log.WriteLine(LogLevel.Notice, &quot;Thread Starting. &quot;);</p>

</div>

<div>

<p>                EventConsumer
con = new EventConsumer(&quot;all&quot;, &quot;&quot;);</p>

</div>

<div>

<p>                while (true)</p>

</div>

<div>

<p>                {</p>

</div>

<div>

<p>                  
 Event ev = con.pop(0);</p>

</div>

<div>

<p>                  
 if (ev == null) continue;</p>

</div>

<div>

<p>                  
 Log.WriteLine(LogLevel.Notice, &quot;Event: &quot; +
ev.serialized_string);</p>

</div>

<div>

<p>                }</p>

</div>

<div>

<p>            });</p>

</div>

<div>

<p>            return true;</p>

</div>

<div>

<p>        }</p>

</div>

<div>

<p>Does not crash. (Adding the null check prevents crash.) The backgrounded
loop runs fine. Looks like the event object goes straight to pinvokes, so a
null result just crashes?</p>

</div>

<div>

<p> </p>

</div>

<div>

<p>I like the idea of a &#39;startup-script&#39; for mod_managed. It would also be
excellent if there was an event or message  informing the background code to
terminate nicely when the module reloads.</p>

</div>

<div>

<p> </p>

</div>

<div>

<p>--Josh</p>

</div>

<p> </p>

<div>

<p>On Wed, Sep 9, 2009 at 12:57 PM, Jeff Lenk &lt;<a href="mailto:jlenk@frontiernet.net" target="_blank">jlenk@frontiernet.net</a>&gt;
wrote:</p>

<p><br>
I think the problem here is that the loader only keeps this method in scope<br>
until completion then it drops the remoted connection. Therefore you should<br>
not use threads in this method. Michael please correct me if I am wrong<br>
here.<br>
<br>
As an example of the failure simply just put a Sleep(10000) call in the<br>
thread and you will see the failure.<br>
<br>
As Michael said this method was only designed to allow the option to opt out<br>
of being loaded.<br>
<br>
In order to support this perhaps a configuration flag simular to the lua<br>
&quot;startup-script&quot; should be added.</p>

<div>

<p style="margin-bottom:12.0pt"><br>
<br>
<br>
Here is the error I get with the loop I mentioned. -Josh<br>
[image: Capture.PNG]<br>
<br>
On Tue, Sep 8, 2009 at 5:05 AM, Michael Giagnocavo<br>
&lt;<a href="mailto:mgg@giagnocavo.net" target="_blank">mgg@giagnocavo.net</a>&gt;wrote:<br>
<br>
&gt;  Hi,<br>
&gt;<br>
&gt;<br>
&gt;<br>
&gt;                 Can you please
elaborate on the crash you receive when you<br>
&gt; queue a thread during load?<br>
&gt;<br>
&gt;<br>
&gt;<br>
&gt; Thanks,<br>
&gt;<br>
&gt; Michael<br>
&gt;<br>
&gt;</p>

</div>

<p><span style="color:#888888">--<br>
View this message in context: <a href="http://n2.nabble.com/Subscribing-to-events-in-managed-C-NET-tp3573619p3613195.html" target="_blank">http://n2.nabble.com/Subscribing-to-events-in-managed-C-NET-tp3573619p3613195.html</a><br>

Sent from the freeswitch-users mailing list archive at Nabble.com.</span></p>

<div>

<div>

<p><br>
_______________________________________________<br>
FreeSWITCH-users mailing list<br>
<a href="mailto:FreeSWITCH-users@lists.freeswitch.org" target="_blank">FreeSWITCH-users@lists.freeswitch.org</a><br>
<a href="http://lists.freeswitch.org/mailman/listinfo/freeswitch-users" target="_blank">http://lists.freeswitch.org/mailman/listinfo/freeswitch-users</a><br>
UNSUBSCRIBE:<a href="http://lists.freeswitch.org/mailman/options/freeswitch-users" target="_blank">http://lists.freeswitch.org/mailman/options/freeswitch-users</a><br>
<a href="http://www.freeswitch.org" target="_blank">http://www.freeswitch.org</a></p>

</div>

</div>

</div>

<p> </p>

</div>

</div>

</div>

</div>

</div>

<p style="margin-bottom:12.0pt"><br>
_______________________________________________<br>
FreeSWITCH-users mailing list<br>
<a href="mailto:FreeSWITCH-users@lists.freeswitch.org" target="_blank">FreeSWITCH-users@lists.freeswitch.org</a><br>
<a href="http://lists.freeswitch.org/mailman/listinfo/freeswitch-users" target="_blank">http://lists.freeswitch.org/mailman/listinfo/freeswitch-users</a><br>
UNSUBSCRIBE:<a href="http://lists.freeswitch.org/mailman/options/freeswitch-users" target="_blank">http://lists.freeswitch.org/mailman/options/freeswitch-users</a><br>
<a href="http://www.freeswitch.org" target="_blank">http://www.freeswitch.org</a></p>

</div>

<p> </p>

</div>

</div>

</div>

</div>

</div>

<p style="margin-bottom:12.0pt"><br>
_______________________________________________<br>
FreeSWITCH-users mailing list<br>
<a href="mailto:FreeSWITCH-users@lists.freeswitch.org" target="_blank">FreeSWITCH-users@lists.freeswitch.org</a><br>
<a href="http://lists.freeswitch.org/mailman/listinfo/freeswitch-users" target="_blank">http://lists.freeswitch.org/mailman/listinfo/freeswitch-users</a><br>
UNSUBSCRIBE:<a href="http://lists.freeswitch.org/mailman/options/freeswitch-users" target="_blank">http://lists.freeswitch.org/mailman/options/freeswitch-users</a><br>
<a href="http://www.freeswitch.org" target="_blank">http://www.freeswitch.org</a></p>

</div>

<p> </p>

</div>

</div>

</div>

</div>

<p style="margin-bottom:12.0pt"><br>
_______________________________________________<br>
FreeSWITCH-users mailing list<br>
<a href="mailto:FreeSWITCH-users@lists.freeswitch.org" target="_blank">FreeSWITCH-users@lists.freeswitch.org</a><br>
<a href="http://lists.freeswitch.org/mailman/listinfo/freeswitch-users" target="_blank">http://lists.freeswitch.org/mailman/listinfo/freeswitch-users</a><br>
UNSUBSCRIBE:<a href="http://lists.freeswitch.org/mailman/options/freeswitch-users" target="_blank">http://lists.freeswitch.org/mailman/options/freeswitch-users</a><br>
<a href="http://www.freeswitch.org" target="_blank">http://www.freeswitch.org</a></p>

</div>

<p> </p>

</div>

</div></div></div>

</div>


<br>_______________________________________________<br>
FreeSWITCH-users mailing list<br>
<a href="mailto:FreeSWITCH-users@lists.freeswitch.org">FreeSWITCH-users@lists.freeswitch.org</a><br>
<a href="http://lists.freeswitch.org/mailman/listinfo/freeswitch-users" target="_blank">http://lists.freeswitch.org/mailman/listinfo/freeswitch-users</a><br>
UNSUBSCRIBE:<a href="http://lists.freeswitch.org/mailman/options/freeswitch-users" target="_blank">http://lists.freeswitch.org/mailman/options/freeswitch-users</a><br>
<a href="http://www.freeswitch.org" target="_blank">http://www.freeswitch.org</a><br>
<br></blockquote></div><br></div>