From d0cde1b9710644649f81e19950c4dc7a684ec07e Mon Sep 17 00:00:00 2001 From: jungh-yeon <33923914+jungh-yeon@users.noreply.github.com> Date: Fri, 17 May 2019 17:31:01 +0900 Subject: [PATCH] [Tizen.Applications.PackageManager] Fix thread safety issue (#837) PackageManagerEventCallback could be lost in multi-thread environment. So we need to add lock not to lost it. Signed-off-by: Junghyun Yeon --- .../Tizen.Applications/PackageManager.cs | 93 ++++++++++++++-------- 1 file changed, 62 insertions(+), 31 deletions(-) diff --git a/src/Tizen.Applications.PackageManager/Tizen.Applications/PackageManager.cs b/src/Tizen.Applications.PackageManager/Tizen.Applications/PackageManager.cs index 94f41ab..1d48fb1 100644 --- a/src/Tizen.Applications.PackageManager/Tizen.Applications/PackageManager.cs +++ b/src/Tizen.Applications.PackageManager/Tizen.Applications/PackageManager.cs @@ -41,6 +41,7 @@ namespace Tizen.Applications private static event EventHandler s_moveEventHandler; private static event EventHandler s_clearDataEventHandler; + private static readonly object s_pkgEventLock = new object(); private static Interop.PackageManager.PackageManagerEventCallback s_packageManagerEventCallback; private static Dictionary s_totalSizeInfoCallbackDict = new Dictionary(); @@ -71,15 +72,21 @@ namespace Tizen.Applications { add { - SetPackageManagerEventStatus(Interop.PackageManager.EventStatus.Install); - RegisterPackageManagerEventIfNeeded(); - s_installEventHandler += value; + lock (s_pkgEventLock) + { + SetPackageManagerEventStatus(Interop.PackageManager.EventStatus.Install); + RegisterPackageManagerEventIfNeeded(); + s_installEventHandler += value; + } } remove { - s_installEventHandler -= value; - UnregisterPackageManagerEventIfNeeded(); - UnsetPackageManagerEventStatus(); + lock (s_pkgEventLock) + { + s_installEventHandler -= value; + UnregisterPackageManagerEventIfNeeded(); + UnsetPackageManagerEventStatus(); + } } } @@ -91,16 +98,22 @@ namespace Tizen.Applications { add { - SetPackageManagerEventStatus(Interop.PackageManager.EventStatus.Uninstall); - RegisterPackageManagerEventIfNeeded(); - s_uninstallEventHandler += value; + lock (s_pkgEventLock) + { + SetPackageManagerEventStatus(Interop.PackageManager.EventStatus.Uninstall); + RegisterPackageManagerEventIfNeeded(); + s_uninstallEventHandler += value; + } } remove { - s_uninstallEventHandler -= value; - UnregisterPackageManagerEventIfNeeded(); - UnsetPackageManagerEventStatus(); - } + lock (s_pkgEventLock) + { + s_uninstallEventHandler -= value; + UnregisterPackageManagerEventIfNeeded(); + UnsetPackageManagerEventStatus(); + } + } } /// @@ -111,15 +124,21 @@ namespace Tizen.Applications { add { - SetPackageManagerEventStatus(Interop.PackageManager.EventStatus.Upgrade); - RegisterPackageManagerEventIfNeeded(); - s_updateEventHandler += value; + lock (s_pkgEventLock) + { + SetPackageManagerEventStatus(Interop.PackageManager.EventStatus.Upgrade); + RegisterPackageManagerEventIfNeeded(); + s_updateEventHandler += value; + } } remove { - s_updateEventHandler -= value; - UnregisterPackageManagerEventIfNeeded(); - UnsetPackageManagerEventStatus(); + lock (s_pkgEventLock) + { + s_updateEventHandler -= value; + UnregisterPackageManagerEventIfNeeded(); + UnsetPackageManagerEventStatus(); + } } } @@ -131,15 +150,21 @@ namespace Tizen.Applications { add { - SetPackageManagerEventStatus(Interop.PackageManager.EventStatus.Move); - RegisterPackageManagerEventIfNeeded(); - s_moveEventHandler += value; + lock (s_pkgEventLock) + { + SetPackageManagerEventStatus(Interop.PackageManager.EventStatus.Move); + RegisterPackageManagerEventIfNeeded(); + s_moveEventHandler += value; + } } remove { - s_moveEventHandler -= value; - UnregisterPackageManagerEventIfNeeded(); - UnsetPackageManagerEventStatus(); + lock (s_pkgEventLock) + { + s_moveEventHandler -= value; + UnregisterPackageManagerEventIfNeeded(); + UnsetPackageManagerEventStatus(); + } } } @@ -151,15 +176,21 @@ namespace Tizen.Applications { add { - SetPackageManagerEventStatus(Interop.PackageManager.EventStatus.ClearData); - RegisterPackageManagerEventIfNeeded(); - s_clearDataEventHandler += value; + lock (s_pkgEventLock) + { + SetPackageManagerEventStatus(Interop.PackageManager.EventStatus.ClearData); + RegisterPackageManagerEventIfNeeded(); + s_clearDataEventHandler += value; + } } remove { - s_clearDataEventHandler -= value; - UnregisterPackageManagerEventIfNeeded(); - UnsetPackageManagerEventStatus(); + lock (s_pkgEventLock) + { + s_clearDataEventHandler -= value; + UnregisterPackageManagerEventIfNeeded(); + UnsetPackageManagerEventStatus(); + } } } -- 2.7.4