From: pjh9216 Date: Thu, 30 Aug 2018 06:32:17 +0000 (+0900) Subject: [Tizen.Applications] Add finalizer in TizenSyncronizationContext (#429) X-Git-Tag: 5.0.0.14562~86 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=e7b30d50c234a07b0d1ab8d082fdcdae259cc98a;p=platform%2Fcore%2Fcsapi%2Ftizenfx.git [Tizen.Applications] Add finalizer in TizenSyncronizationContext (#429) * [Tizen.Applications] Add finalizer in TizenSyncronizationContext - To clean up native sources, the finalizer was added Signed-off-by: Junghoon Park * [Tizen.Applications.Common] Fix typo Signed-off-by: Junghoon Park * Consider multiple sources Signed-off-by: Junghoon Park --- diff --git a/src/Tizen.Applications.Common/Interop/Interop.Glib.cs b/src/Tizen.Applications.Common/Interop/Interop.Glib.cs index 576a6e2..ae64db1 100755 --- a/src/Tizen.Applications.Common/Interop/Interop.Glib.cs +++ b/src/Tizen.Applications.Common/Interop/Interop.Glib.cs @@ -26,5 +26,8 @@ internal static partial class Interop [DllImport(Libraries.Glib, EntryPoint = "g_idle_add", CallingConvention = CallingConvention.Cdecl)] internal static extern uint IdleAdd(GSourceFunc d, IntPtr data); + + [DllImport(Libraries.Glib, EntryPoint = "g_source_remove", CallingConvention = CallingConvention.Cdecl)] + internal static extern bool RemoveSource(uint source); } } diff --git a/src/Tizen.Applications.Common/Tizen.Applications/TizenSynchronizationContext.cs b/src/Tizen.Applications.Common/Tizen.Applications/TizenSynchronizationContext.cs old mode 100644 new mode 100755 index 741242c..4dd40d0 --- a/src/Tizen.Applications.Common/Tizen.Applications/TizenSynchronizationContext.cs +++ b/src/Tizen.Applications.Common/Tizen.Applications/TizenSynchronizationContext.cs @@ -16,6 +16,7 @@ using System; using System.Collections.Concurrent; +using System.Collections.Generic; using System.Threading; namespace Tizen.Applications @@ -29,7 +30,8 @@ namespace Tizen.Applications { private readonly Interop.Glib.GSourceFunc _wrapperHandler; private readonly Object _transactionLock = new Object(); - private readonly ConcurrentDictionary _handlerMap = new ConcurrentDictionary(); + private readonly ConcurrentDictionary> _handlerMap + = new ConcurrentDictionary>(); private int _transactionId = 0; /// @@ -42,6 +44,18 @@ namespace Tizen.Applications } /// + /// Finalizer to clean up the native source + /// + ~TizenSynchronizationContext() + { + foreach (var s in _handlerMap.Values) + { + if (s.Value > 0) + Interop.Glib.RemoveSource(s.Value); + } + } + + /// /// Initilizes a new TizenSynchronizationContext and install into the current thread. /// /// @@ -114,8 +128,8 @@ namespace Tizen.Applications { id = _transactionId++; } - _handlerMap.TryAdd(id, action); - Interop.Glib.IdleAdd(_wrapperHandler, (IntPtr)id); + _handlerMap.TryAdd(id, new KeyValuePair(action, + Interop.Glib.IdleAdd(_wrapperHandler, (IntPtr)id))); } private bool Handler(IntPtr userData) @@ -123,9 +137,8 @@ namespace Tizen.Applications int key = (int)userData; if (_handlerMap.ContainsKey(key)) { - Action action; - _handlerMap.TryRemove(key, out action); - action?.Invoke(); + _handlerMap.TryRemove(key, out var p); + p.Key?.Invoke(); } return false; }