[IoTConnectivity] Handle the exception for getting Dictionary item (#1092)
authordh79pyun <31202060+dh79pyun@users.noreply.github.com>
Fri, 18 Oct 2019 01:42:54 +0000 (10:42 +0900)
committerGitHub <noreply@github.com>
Fri, 18 Oct 2019 01:42:54 +0000 (10:42 +0900)
We should prevent the crash in next exception case.

Unhandled exception.

System.Collections.Generic.KeyNotFoundException: The given key '2' was not present in the dictionary.
 at System.Collections.Concurrent.ConcurrentDictionary`2.ThrowKeyNotFoundException(Object key)
 at System.Collections.Concurrent.ConcurrentDictionary`2.get_Item(TKey key)
 at Tizen.Network.IoTConnectivity.RemoteResource.NativePutResultCallbackHandler(IntPtr resource, Int32 err, Int32 requestType, IntPtr responseHandle, IntPtr userData)

src/Tizen.Network.IoTConnectivity/Tizen.Network.IoTConnectivity/RemoteResource.cs

index ccc7ec564704e6255103f29f5ced7ba67e6b11b6..766b6057d6da616f806f9df7ee0fc59a6be39e77 100755 (executable)
@@ -39,7 +39,7 @@ namespace Tizen.Network.IoTConnectivity
         private ResourceOptions _options;
 
         private static int _responseCompletionId = 1;
-        private static IDictionary<IntPtr, TaskCompletionSource<RemoteResponse>> _taskCompletionMap = new ConcurrentDictionary<IntPtr, TaskCompletionSource<RemoteResponse>>();
+        private static ConcurrentDictionary<IntPtr, TaskCompletionSource<RemoteResponse>> _taskCompletionMap = new ConcurrentDictionary<IntPtr, TaskCompletionSource<RemoteResponse>>();
 
         private static Interop.IoTConnectivity.Client.RemoteResource.ResponseCallback _getResultCallback = NativeGetResultCallbackHandler;
         private static Interop.IoTConnectivity.Client.RemoteResource.ResponseCallback _putResultCallback = NativePutResultCallbackHandler;
@@ -423,8 +423,15 @@ namespace Tizen.Network.IoTConnectivity
         private static void NativeGetResultCallbackHandler(IntPtr resource, int err, int requestType, IntPtr responseHandle, IntPtr userData)
         {
             IntPtr responseCompletionId = userData;
-            TaskCompletionSource<RemoteResponse> responseCompletionSource = _taskCompletionMap[responseCompletionId];
-            _taskCompletionMap.Remove(responseCompletionId);
+            TaskCompletionSource<RemoteResponse> responseCompletionSource;
+
+            Log.Info(IoTConnectivityErrorFactory.LogTag, "Result callback for : " + responseCompletionId);
+
+            if (!_taskCompletionMap.TryRemove(responseCompletionId, out responseCompletionSource))
+            {
+                Log.Error(IoTConnectivityErrorFactory.LogTag, "Failed to remove Key");
+                return;
+            }
 
             if (responseHandle != IntPtr.Zero)
             {
@@ -479,8 +486,15 @@ namespace Tizen.Network.IoTConnectivity
         private static void NativePutResultCallbackHandler(IntPtr resource, int err, int requestType, IntPtr responseHandle, IntPtr userData)
         {
             IntPtr responseCompletionId = userData;
-            TaskCompletionSource<RemoteResponse> responseCompletionSource = _taskCompletionMap[responseCompletionId];
-            _taskCompletionMap.Remove(responseCompletionId);
+            TaskCompletionSource<RemoteResponse> responseCompletionSource;
+
+            Log.Info(IoTConnectivityErrorFactory.LogTag, "Result callback for : " + responseCompletionId);
+
+            if (!_taskCompletionMap.TryRemove(responseCompletionId, out responseCompletionSource))
+            {
+                Log.Error(IoTConnectivityErrorFactory.LogTag, "Failed to remove Key");
+                return;
+            }
 
             if (err == (int)(IoTConnectivityError.Iotivity))
             {
@@ -542,8 +556,15 @@ namespace Tizen.Network.IoTConnectivity
         private static void NativePostResultCallbackHandler(IntPtr resource, int err, int requestType, IntPtr responseHandle, IntPtr userData)
         {
             IntPtr responseCompletionId = userData;
-            TaskCompletionSource<RemoteResponse> responseCompletionSource = _taskCompletionMap[responseCompletionId];
-            _taskCompletionMap.Remove(responseCompletionId);
+            TaskCompletionSource<RemoteResponse> responseCompletionSource;
+
+            Log.Info(IoTConnectivityErrorFactory.LogTag, "Result callback for : " + responseCompletionId);
+
+            if (!_taskCompletionMap.TryRemove(responseCompletionId, out responseCompletionSource))
+            {
+                Log.Error(IoTConnectivityErrorFactory.LogTag, "Failed to remove Key");
+                return;
+            }
 
             if (responseHandle != IntPtr.Zero)
             {
@@ -595,8 +616,15 @@ namespace Tizen.Network.IoTConnectivity
         private static void NativeDeleteResultCallbackHandler(IntPtr resource, int err, int requestType, IntPtr responseHandle, IntPtr userData)
         {
             IntPtr responseCompletionId = userData;
-            TaskCompletionSource<RemoteResponse> responseCompletionSource = _taskCompletionMap[responseCompletionId];
-            _taskCompletionMap.Remove(responseCompletionId);
+            TaskCompletionSource<RemoteResponse> responseCompletionSource;
+
+            Log.Info(IoTConnectivityErrorFactory.LogTag, "Result callback for : " + responseCompletionId);
+
+            if (!_taskCompletionMap.TryRemove(responseCompletionId, out responseCompletionSource))
+            {
+                Log.Error(IoTConnectivityErrorFactory.LogTag, "Failed to remove Key");
+                return;
+            }
 
             if (err == (int)(IoTConnectivityError.Iotivity))
             {