<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns:p="urn:schemas-microsoft-com:office:powerpoint" xmlns:a="urn:schemas-microsoft-com:office:access" xmlns:dt="uuid:C2F41010-65B3-11d1-A29F-00AA00C14882" xmlns:s="uuid:BDC6E3F0-6DA3-11d1-A2A3-00AA00C14882" xmlns:rs="urn:schemas-microsoft-com:rowset" xmlns:z="#RowsetSchema" xmlns:b="urn:schemas-microsoft-com:office:publisher" xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet" xmlns:c="urn:schemas-microsoft-com:office:component:spreadsheet" xmlns:odc="urn:schemas-microsoft-com:office:odc" xmlns:oa="urn:schemas-microsoft-com:office:activation" xmlns:html="http://www.w3.org/TR/REC-html40" xmlns:q="http://schemas.xmlsoap.org/soap/envelope/" xmlns:rtc="http://microsoft.com/officenet/conferencing" xmlns:D="DAV:" xmlns:Repl="http://schemas.microsoft.com/repl/" xmlns:mt="http://schemas.microsoft.com/sharepoint/soap/meetings/" xmlns:x2="http://schemas.microsoft.com/office/excel/2003/xml" xmlns:ppda="http://www.passport.com/NameSpace.xsd" xmlns:ois="http://schemas.microsoft.com/sharepoint/soap/ois/" xmlns:dir="http://schemas.microsoft.com/sharepoint/soap/directory/" xmlns:ds="http://www.w3.org/2000/09/xmldsig#" xmlns:dsp="http://schemas.microsoft.com/sharepoint/dsp" xmlns:udc="http://schemas.microsoft.com/data/udc" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:sub="http://schemas.microsoft.com/sharepoint/soap/2002/1/alerts/" xmlns:ec="http://www.w3.org/2001/04/xmlenc#" xmlns:sp="http://schemas.microsoft.com/sharepoint/" xmlns:sps="http://schemas.microsoft.com/sharepoint/soap/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:udcs="http://schemas.microsoft.com/data/udc/soap" xmlns:udcxf="http://schemas.microsoft.com/data/udc/xmlfile" xmlns:udcp2p="http://schemas.microsoft.com/data/udc/parttopart" xmlns:wf="http://schemas.microsoft.com/sharepoint/soap/workflow/" xmlns:dsss="http://schemas.microsoft.com/office/2006/digsig-setup" xmlns:dssi="http://schemas.microsoft.com/office/2006/digsig" xmlns:mdssi="http://schemas.openxmlformats.org/package/2006/digital-signature" xmlns:mver="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns:mrels="http://schemas.openxmlformats.org/package/2006/relationships" xmlns:spwp="http://microsoft.com/sharepoint/webpartpages" xmlns:ex12t="http://schemas.microsoft.com/exchange/services/2006/types" xmlns:ex12m="http://schemas.microsoft.com/exchange/services/2006/messages" xmlns:pptsl="http://schemas.microsoft.com/sharepoint/soap/SlideLibrary/" xmlns:spsl="http://microsoft.com/webservices/SharePointPortalServer/PublishedLinksService" xmlns:Z="urn:schemas-microsoft-com:" xmlns:st="&#1;" xmlns="http://www.w3.org/TR/REC-html40">

<head>
<meta http-equiv=Content-Type content="text/html; charset=us-ascii">
<meta name=Generator content="Microsoft Word 12 (filtered medium)">
<style>
<!--
 /* Font Definitions */
 @font-face
        {font-family:Wingdings;
        panose-1:5 0 0 0 0 0 0 0 0 0;}
@font-face
        {font-family:"MS Mincho";
        panose-1:2 2 6 9 4 2 5 8 3 4;}
@font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
        {font-family:Tahoma;
        panose-1:2 11 6 4 3 5 4 4 2 4;}
@font-face
        {font-family:"\@MS Mincho";
        panose-1:2 2 6 9 4 2 5 8 3 4;}
 /* Style Definitions */
 p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0in;
        margin-bottom:.0001pt;
        font-size:12.0pt;
        font-family:"Times New Roman","serif";}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:purple;
        text-decoration:underline;}
p
        {mso-style-priority:99;
        mso-margin-top-alt:auto;
        margin-right:0in;
        mso-margin-bottom-alt:auto;
        margin-left:0in;
        font-size:12.0pt;
        font-family:"Times New Roman","serif";}
span.EmailStyle18
        {mso-style-type:personal-reply;
        font-family:"Calibri","sans-serif";
        color:#1F497D;}
.MsoChpDefault
        {mso-style-type:export-only;}
@page Section1
        {size:8.5in 11.0in;
        margin:1.0in 1.0in 1.0in 1.0in;}
div.Section1
        {page:Section1;}
-->
</style>
<!--[if gte mso 9]><xml>
 <o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
 <o:shapelayout v:ext="edit">
  <o:idmap v:ext="edit" data="1" />
 </o:shapelayout></xml><![endif]-->
</head>

<body lang=EN-US link=blue vlink=purple>

<div class=Section1>

<p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'>Hey nice to see someone interested in this &#8211; that&#8217;s
a lot of files you have there, and looks like you put a lot of effort into it!
I haven&#8217;t had time to look at it much, but here are a few initial
impressions.<o:p></o:p></span></p>

<p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'><o:p>&nbsp;</o:p></span></p>

<p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'>Right off the bat: there can be tons of cleanup and refactoring,
no doubt about that. Much of the current code is to satisfy my needs in production,
which it does very well. With that out of the way&#8230;<o:p></o:p></span></p>

<p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'><o:p>&nbsp;</o:p></span></p>

<p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'>I&#8217;m a bit hesitant to go too far from the FreeSWITCH core
as far as architecture goes. For instance, I&#8217;m not quite sure why&#8217;d
we have our own managed logging subsystem that allows them to plug in other
things that aren&#8217;t part of FS. Either they should use the FS logging
system, or use their own such as log4net. Or perhaps I don&#8217;t see why we&#8217;d
want this behavior.<o:p></o:p></span></p>

<p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'><o:p>&nbsp;</o:p></span></p>

<p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'>Going away from the core as far as adding .NET specific features
(like look at the static ManagedSession.Originate that takes hangup delegates,
or the &#8220;nice&#8221; wrapper for Log (Write and WeiteLine, with an enum
instead of a string) are keeping close to the core, just adding a tiny bit of
API cleanup. FreeSWITCH exposes a lot of strings, and while maybe that&#8217;s
important for some languages, .NET users are going to expect stronger typing.
But I don&#8217;t think these types of things get people away from FreeSWITCH
much.<o:p></o:p></span></p>

<p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'><o:p>&nbsp;</o:p></span></p>

<p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'>Things like making a published SOAP interface for FS seem not
really related to mod_managed. They can easily be done as 3<sup>rd</sup> party plugins,
or convince the core FS team that exposing via SOAP via mod_managed is the way to
go. Also keep in mind that the majority of users are on Linux, so that rules
out WCF and some other fun stuff that only works on the CLR &#8211; I&#8217;d
say it all has to work on Mono.<o:p></o:p></span></p>

<p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'><o:p>&nbsp;</o:p></span></p>

<p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'>As for all the rest of it, can we talk interactively, perhaps with
other users interested in mod_managed? Reading over your email, I think I&#8217;m
not understanding many of the use cases that are being fixed.<o:p></o:p></span></p>

<p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'><o:p>&nbsp;</o:p></span></p>

<p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'>Thanks a lot!<o:p></o:p></span></p>

<p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'>-Michael<o:p></o:p></span></p>

<p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'><o:p>&nbsp;</o:p></span></p>

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

<p class=MsoNormal><b><span style='font-size:10.0pt;font-family:"Tahoma","sans-serif"'>From:</span></b><span
style='font-size:10.0pt;font-family:"Tahoma","sans-serif"'>
freeswitch-users-bounces@lists.freeswitch.org
[mailto:freeswitch-users-bounces@lists.freeswitch.org] <b>On Behalf Of </b>Josh
Rivers<br>
<b>Sent:</b> Wednesday, September 23, 2009 5:00 PM<br>
<b>To:</b> freeswitch-users@lists.freeswitch.org<br>
<b>Subject:</b> Re: [Freeswitch-users] Subscribing to events in managed C# /
.NET<o:p></o:p></span></p>

</div>

<p class=MsoNormal><o:p>&nbsp;</o:p></p>

<div>

<p class=MsoNormal>I've been having the same idea, except completely different.
I'd probably start with StructureMap or MEF. I'm attracted to the idea of
creating an alternative to mod_event_socket except using WCF as the transport,
enabling both WS-* and Rest access into the FreeSWITCH core.<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal><o:p>&nbsp;</o:p></p>

</div>

<div>

<p class=MsoNormal>I think an effort to create a better archtecture in
mod_managed is likely to get very religious very quickly. There's a _lot_ of
difference of opinion in the .NET ecosystem. Just witness Michael and I
disagreeing on something as simple as how to handle unhandled exceptions.<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal><o:p>&nbsp;</o:p></p>

</div>

<div>

<p class=MsoNormal>Instead of architecting a more complete solution, I think a
good solution might be to de-architect the current solution to easily enable
extensibility and component replacement. That way, each of us can have the
high-level framework we want without disagreement on the low-level framework.
This is the same model used in <a href="http://ASP.NET" target="_blank">ASP.NET</a>
MVC, where it works well out of the box, but you can easily hook in and replace
any chunk of it you want if your needs vary.<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal><o:p>&nbsp;</o:p></p>

</div>

<div>

<p class=MsoNormal>I started playing with a refactoring of the current
managed.dll in order to make it more pluggable. It kinda got away from
me....&lt;grin&gt;....I've published my code up on github at <a
href="http://github.com/joshrivers/FreeSWITCH.Managed">http://github.com/joshrivers/FreeSWITCH.Managed</a><o:p></o:p></p>

</div>

<div>

<p class=MsoNormal><o:p>&nbsp;</o:p></p>

</div>

<div>

<p class=MsoNormal>The first thing I did was make it _really_ easy to make your
own managed.dll. There's two basic points where managed code attaches to
unmanaged code. If you rewrite the loader class, you can make your own
managed.dll that does anything you want.<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal><o:p>&nbsp;</o:p></p>

</div>

<div>

<p class=MsoNormal>The next layer up exposes a simple IOC registry that could
be modified to replace or add to the logging chain, the module loading chain,
or the command execution chain.<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal><o:p>&nbsp;</o:p></p>

</div>

<div>

<p class=MsoNormal>Beyond that, appdomain loading, script compilation, and
inside-appdomain plugin loading are all plugabble.<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal><o:p>&nbsp;</o:p></p>

</div>

<div>

<p class=MsoNormal>Current plugins should all remain compatible (mine at least
haven't needed a recompile).<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal><o:p>&nbsp;</o:p></p>

</div>

<div>

<p class=MsoNormal>What needs to be done:<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>- There are a few changes in SVN that need to be integrated
with my fork.<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>- A lot more unit testing would be useful.<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>- There should be a mechanism for indicating that a script
or dll should be pre-loaded into all other appdomains (as a mechanism for
defining new plugin types).<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>- There should also be a mechanism for loading a script or
dll into the primary appdomain (to allow your code to modify the core operation
of mod_managed without recompiling the dll)<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal><o:p>&nbsp;</o:p></p>

</div>

<div>

<p class=MsoNormal>Most of this should be simple, but I thought it was high
time that I got some feedback. I think this model makes it possible to much
more simply add new functionality to mod_managed allowing coders to establish
their own plugin models and use frameworks such as StructureMap, Spring.NET,
MEF, WCF, or Workflow to create their voip applications.<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal><o:p>&nbsp;</o:p></p>

</div>

<div>

<p class=MsoNormal>Let me know what you think,<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>Josh<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal><o:p>&nbsp;</o:p></p>

<div>

<p class=MsoNormal>On Fri, Sep 11, 2009 at 12:55 AM, Raffaele P. Guidi &lt;<a
href="mailto:raffaele.p.guidi@gmail.com" target="_blank">raffaele.p.guidi@gmail.com</a>&gt;
wrote:<o:p></o:p></p>

<div>

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

<div>

<p class=MsoNormal><o:p>&nbsp;</o:p></p>

</div>

</div>

<div>

<p class=MsoNormal>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&nbsp;<o:p></o:p></p>

<div>

<div>

<p class=MsoNormal style='margin-bottom:12.0pt'><o:p>&nbsp;</o:p></p>

<div>

<p class=MsoNormal>On Fri, Sep 11, 2009 at 00:19, Michael Giagnocavo &lt;<a
href="mailto:mgg@giagnocavo.net" target="_blank">mgg@giagnocavo.net</a>&gt;
wrote:<o:p></o:p></p>

<div>

<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><o:p></o:p></p>

<p><span style='font-size:11.0pt;color:#1F497D'>&nbsp;</span><o:p></o:p></p>

<p><span style='font-size:11.0pt;color:#1F497D'>However, that&#8217;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&#8217;m not really in favour of this, and suggested at least a
&#8220;required&#8221; attribute in the modules.conf that would prevent the
switch from loading if the module fails. </span><o:p></o:p></p>

<p><span style='font-size:11.0pt;color:#1F497D'>&nbsp;</span><o:p></o:p></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&#8217;d add an attribute with
an enumeration like:</span><o:p></o:p></p>

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

<p style='margin-left:.75in'><span style='font-size:11.0pt;color:#1F497D'>-</span><span
style='font-size:7.0pt;color:#1F497D'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span><span style='font-size:11.0pt;color:#1F497D'>NoLoad (don&#8217;t load
the assembly)</span><o:p></o:p></p>

<p style='margin-left:.75in'><span style='font-size:11.0pt;color:#1F497D'>-</span><span
style='font-size:7.0pt;color:#1F497D'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span><span style='font-size:11.0pt;color:#1F497D'>Critical (stop the switch
if there&#8217;s an exception during loading)</span><o:p></o:p></p>

<p><span style='font-size:11.0pt;color:#1F497D'>&nbsp;</span><o:p></o:p></p>

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

<p><span style='font-size:11.0pt;color:#1F497D'>&nbsp;</span><o:p></o:p></p>

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

<p><span style='font-size:11.0pt;color:#1F497D'>&nbsp;</span><o:p></o:p></p>

<p><span style='font-size:11.0pt;color:#1F497D'>How&#8217;s that sound?</span><o:p></o:p></p>

<p><span style='font-size:11.0pt;color:#1F497D'>&nbsp;</span><o:p></o:p></p>

<p><span style='font-size:11.0pt;color:#1F497D'>&nbsp;</span><o:p></o:p></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><o:p></o:p></p>

<div>

<div>

<p class=MsoNormal><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<o:p></o:p></p>

</div>

</div>

</div>

<div>

<div>

<p>&nbsp;<o:p></o:p></p>

<p>I'm only concerned with the difference in treatment.<br>
<br>
public class CrashFreeSWITCH : ILoadNotificationPlugin<br>
&nbsp;&nbsp; &nbsp;{<br>
&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;public bool Load()<br>
&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;{<br>
&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;ThreadPool.QueueUserWorkItem((o)
=&gt; { throw new NotImplementedException(); });<br>
&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return true;<br>
&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;}<br>
&nbsp;&nbsp; &nbsp;}<o:p></o:p></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><o:p></o:p></p>

<p><span style='color:black'>public class CrashFreeSWITCH :
ILoadNotificationPlugin<br>
&nbsp;&nbsp; &nbsp;{<br>
&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;public bool Load()<br>
&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;{<br>
&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;throw new
NotImplementedException();<br>
&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return true;<br>
&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;}<br>
&nbsp;&nbsp; &nbsp;}</span><o:p></o:p></p>

</div>

<p>Logs a message to the console and doesn't load the module, while leaving the
switch operating.<o:p></o:p></p>

</div>

<div>

<p>&nbsp;<o:p></o:p></p>

</div>

<div>

<p>In my experience, exceptions in&nbsp;multi-threaded&nbsp;code: a) happen, b)
are hard to diagnose. Is the best behavior for the environment to crash,
providing no diagnostic information? That's hard in development, and even
harder in production. I suppose 'terminate switch on fault' 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't any fault do the same
thing? What if the billing was happening in my second code block?<o:p></o:p></p>

</div>

<div>

<p>&nbsp;<o:p></o:p></p>

</div>

<div>

<p>Normally, I'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.<o:p></o:p></p>

</div>

<div>

<p>&nbsp;<o:p></o:p></p>

</div>

<div>

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

</div>

<div>

<p>&nbsp;<o:p></o: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:<o:p></o:p></p>

<div>

<div>

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

<p><span style='font-size:11.0pt;color:#1F497D'>&nbsp;</span><o:p></o:p></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 &#8211;
do you really want it to go on?</span><o:p></o:p></p>

<p><span style='font-size:11.0pt;color:#1F497D'>&nbsp;</span><o:p></o:p></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><o:p></o:p></p>

<p><span style='font-size:11.0pt;color:#1F497D'>&nbsp;</span><o:p></o:p></p>

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

<p><span style='font-size:11.0pt;color:#1F497D'>&nbsp;</span><o:p></o:p></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><o:p></o:p></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<o:p></o:p></p>

</div>

</div>

</div>

<div>

<div>

<p>&nbsp;<o:p></o: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't it just log the exception to the console, not
crash the core?<o:p></o:p></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:<o:p></o:p></p>

<div>

<div>

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

<p><span style='font-size:11.0pt;color:#1F497D'>&nbsp;</span><o:p></o:p></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><o:p></o:p></p>

<p><span style='font-size:11.0pt;color:#1F497D'>&nbsp;</span><o:p></o:p></p>

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

<p><span style='font-size:11.0pt;color:#1F497D'>&nbsp;</span><o:p></o:p></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><o:p></o:p></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<o:p></o:p></p>

</div>

</div>

</div>

<div>

<div>

<p>&nbsp;<o:p></o:p></p>

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

<div>

<p>&nbsp;<o:p></o:p></p>

<div>

<p>&nbsp;&nbsp; &nbsp;public class CrashFreeSWITCH : ILoadNotificationPlugin<o:p></o:p></p>

</div>

<div>

<p>&nbsp;&nbsp; &nbsp;{<o:p></o:p></p>

</div>

<div>

<p>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;public bool Load()<o:p></o:p></p>

</div>

<div>

<p>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;{<o:p></o:p></p>

</div>

<div>

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

</div>

<div>

<p>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return true;<o:p></o:p></p>

</div>

<div>

<p>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;}<o:p></o:p></p>

</div>

<div>

<p>&nbsp;&nbsp; &nbsp;}<o:p></o:p></p>

</div>

<div>

<p>&nbsp;<o:p></o:p></p>

</div>

<div>

<p>Perhaps&nbsp;Application.ThreadException or&nbsp;AppDomain.UnhandledException
need to be trapped?<o:p></o:p></p>

</div>

<div>

<p>&nbsp;<o:p></o: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:<o:p></o:p></p>

<div>

<div>

<div>

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

<p>&nbsp;<o:p></o:p></p>

</div>

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

<p>&nbsp;<o:p></o:p></p>

<p>-Michael <o:p></o:p></p>

<p><span style='font-size:11.0pt;color:#1F497D'>&nbsp;</span><o:p></o:p></p>

<p><span style='font-size:11.0pt;color:#1F497D'>&nbsp;</span><o:p></o:p></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><o:p></o:p></p>

<div>

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

</div>

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

</div>

<div>

<div>

<p>&nbsp;<o:p></o:p></p>

<p>A new discovery:<o:p></o:p></p>

<div>

<div>

<p>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;public bool Load()<o:p></o:p></p>

</div>

<div>

<p>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;{<o:p></o:p></p>

</div>

<div>

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

</div>

<div>

<p>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;{<o:p></o:p></p>

</div>

<div>

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

</div>

<div>

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

</div>

<div>

<p>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;while (true)<o:p></o:p></p>

</div>

<div>

<p>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;{<o:p></o:p></p>

</div>

<div>

<p>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp;Event ev = con.pop(0);<o:p></o:p></p>

</div>

<div>

<p>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp;if (ev == null) continue;<o:p></o:p></p>

</div>

<div>

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

</div>

<div>

<p>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}<o:p></o:p></p>

</div>

<div>

<p>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;});<o:p></o:p></p>

</div>

<div>

<p>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return true;<o:p></o:p></p>

</div>

<div>

<p>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;}<o:p></o: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?<o:p></o:p></p>

</div>

<div>

<p>&nbsp;<o:p></o:p></p>

</div>

<div>

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

</div>

<div>

<p>&nbsp;<o:p></o:p></p>

</div>

<div>

<p>--Josh<o:p></o:p></p>

</div>

<p>&nbsp;<o:p></o: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:<o:p></o:p></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.<o:p></o:p></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; &nbsp;Hi,<br>
&gt;<br>
&gt;<br>
&gt;<br>
&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 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;<o:p></o:p></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><o:p></o:p></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><o:p></o:p></p>

</div>

</div>

</div>

<p>&nbsp;<o:p></o: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><o:p></o:p></p>

</div>

<p>&nbsp;<o:p></o: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><o:p></o:p></p>

</div>

<p>&nbsp;<o:p></o: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><o:p></o:p></p>

</div>

<p>&nbsp;<o:p></o:p></p>

</div>

</div>

</div>

</div>

</div>

<p class=MsoNormal 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><o:p></o:p></p>

</div>

<p class=MsoNormal><o:p>&nbsp;</o:p></p>

</div>

</div>

</div>

<p class=MsoNormal 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><o:p></o:p></p>

</div>

<p class=MsoNormal><o:p>&nbsp;</o:p></p>

</div>

</div>

</body>

</html>