]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
Add auto run thread abort on hangup to AppFunction
authorMichael Giagnocavo <mgg@giagnocavo.net>
Thu, 5 Jun 2008 18:15:28 +0000 (18:15 +0000)
committerMichael Giagnocavo <mgg@giagnocavo.net>
Thu, 5 Jun 2008 18:15:28 +0000 (18:15 +0000)
git-svn-id: http://svn.freeswitch.org/svn/freeswitch/trunk@8768 d0543943-73ff-0310-b7d9-9358b9ac24b2

src/mod/languages/mod_mono_managed/AppFunction.cs

index 0eb6da7ccd038d859d99f839d4786b71853fb566..345e9f710963235586c8294f8093ab62d955b366 100644 (file)
@@ -46,6 +46,7 @@ namespace FreeSWITCH
         void hangupCallback()\r
         {\r
             Log.WriteLine(LogLevel.Debug, "AppFunction is in hangupCallback.");\r
+            abortRun();\r
             var f = HangupFunction;\r
             if (f != null) f();\r
         }\r
@@ -103,6 +104,18 @@ namespace FreeSWITCH
             }\r
         }\r
 \r
+        protected virtual bool AbortOnHangup { get { return false; } }\r
+        bool abortable = false;\r
+        readonly object abortLock = new object();\r
+        Thread runThread;\r
+        void abortRun()\r
+        {\r
+            if (!AbortOnHangup) return;\r
+            lock (abortLock) {\r
+                if (abortable) runThread.Abort();\r
+            }\r
+        }\r
+\r
         protected Guid Uuid { get; private set; }\r
 \r
         internal void RunInternal(FreeSWITCH.Native.MonoSession session, string args)\r
@@ -112,7 +125,19 @@ namespace FreeSWITCH
             Session.SetDelegates(this.inputCallback, this.hangupCallback);\r
             try { this.Uuid = new Guid(Session.GetUuid()); }\r
             catch { }\r
-            Run();\r
+            try {\r
+                runThread = Thread.CurrentThread;\r
+                lock (abortLock) abortable = true;\r
+                Run();\r
+            }\r
+            catch (ThreadAbortException) {\r
+                Log.WriteLine(LogLevel.Debug, "Run thread aborted.");\r
+                Thread.ResetAbort();\r
+            }\r
+            finally {\r
+                lock (abortLock) { abortable = false; }\r
+                Thread.ResetAbort();\r
+            }\r
         }\r
 \r
         protected abstract void Run();\r