[IoTConnectivity] Fix wrong callback management (#1041)
authorsemun-lee <35090067+semun-lee@users.noreply.github.com>
Mon, 30 Sep 2019 01:58:09 +0000 (10:58 +0900)
committerGitHub <noreply@github.com>
Mon, 30 Sep 2019 01:58:09 +0000 (10:58 +0900)
* [IoTConnectivity] Fix wrong callback management

Change-Id: I5f9ba403661e32f2f6ed807318cc937b8137cfc9
Signed-off-by: Semun Lee <semun.lee@samsung.com>
* Change id to static

Change-Id: Ib6dd29d64f0c9b991c0a0bfe28f62d187b0fbd61
Signed-off-by: Semun Lee <semun.lee@samsung.com>
src/Tizen.Network.IoTConnectivity/Tizen.Network.IoTConnectivity/RemoteResource.cs

index 6a7d1b4..d8101b1 100755 (executable)
@@ -17,6 +17,7 @@
 
 using System;
 using System.Collections.Generic;
+using System.Collections.Concurrent;
 using System.Net;
 using System.Runtime.InteropServices;
 using System.Threading.Tasks;
@@ -37,8 +38,8 @@ namespace Tizen.Network.IoTConnectivity
         private bool _cacheEnabled = false;
         private ResourceOptions _options;
 
-        private int _responseCallbackId = 1;
-        private static Dictionary<IntPtr, Interop.IoTConnectivity.Client.RemoteResource.ResponseCallback> _responseCallbacksMap = new Dictionary<IntPtr, Interop.IoTConnectivity.Client.RemoteResource.ResponseCallback>();
+        private static int _responseCallbackId = 1;
+        private static IDictionary<IntPtr, Interop.IoTConnectivity.Client.RemoteResource.ResponseCallback> _responseCallbacksMap = new ConcurrentDictionary<IntPtr, Interop.IoTConnectivity.Client.RemoteResource.ResponseCallback>();
 
         private Interop.IoTConnectivity.Client.RemoteResource.CachedRepresentationChangedCallback _cacheUpdatedCallback;
         private Interop.IoTConnectivity.Client.RemoteResource.StateChangedCallback _stateChangedCallback;
@@ -404,10 +405,8 @@ namespace Tizen.Network.IoTConnectivity
             _responseCallbacksMap[id] = (IntPtr resource, int err, int requestType, IntPtr responseHandle, IntPtr userData) =>
             {
                 IntPtr responseCallbackId = userData;
-                lock(_responseCallbacksMap)
-                {
-                    _responseCallbacksMap.Remove(responseCallbackId);
-                }
+
+                _responseCallbacksMap.Remove(responseCallbackId);
 
                 if (responseHandle != IntPtr.Zero)
                 {
@@ -459,10 +458,9 @@ namespace Tizen.Network.IoTConnectivity
             _responseCallbacksMap[id] = (IntPtr resource, int err, int requestType, IntPtr responseHandle, IntPtr userData) =>
             {
                 IntPtr responseCallbackId = userData;
-                lock (_responseCallbacksMap)
-                {
-                    _responseCallbacksMap.Remove(responseCallbackId);
-                }
+
+                _responseCallbacksMap.Remove(responseCallbackId);
+
                 if (err == (int)(IoTConnectivityError.Iotivity))
                 {
                     RemoteResponse response = new RemoteResponse();
@@ -519,10 +517,9 @@ namespace Tizen.Network.IoTConnectivity
             _responseCallbacksMap[id] = (IntPtr resource, int err, int requestType, IntPtr responseHandle, IntPtr userData) =>
             {
                 IntPtr responseCallbackId = userData;
-                lock (_responseCallbacksMap)
-                {
-                    _responseCallbacksMap.Remove(responseCallbackId);
-                }
+
+                _responseCallbacksMap.Remove(responseCallbackId);
+
                 if (responseHandle != IntPtr.Zero)
                 {
                     try
@@ -570,10 +567,9 @@ namespace Tizen.Network.IoTConnectivity
             _responseCallbacksMap[id] = (IntPtr resource, int err, int requestType, IntPtr responseHandle, IntPtr userData) =>
             {
                 IntPtr responseCallbackId = userData;
-                lock (_responseCallbacksMap)
-                {
-                    _responseCallbacksMap.Remove(responseCallbackId);
-                }
+
+                _responseCallbacksMap.Remove(responseCallbackId);
+
                 if (err == (int)(IoTConnectivityError.Iotivity))
                 {
                     RemoteResponse response = new RemoteResponse();