From 7cb7a36b440e86b34b02ba68bc3610030d606999 Mon Sep 17 00:00:00 2001 From: Seonah Moon <31679495+SeonahMoon@users.noreply.github.com> Date: Mon, 26 Feb 2018 20:09:04 +0900 Subject: [PATCH] [WiFi][Connection] Apply CAPIs for thread handling (#134) * [Tizen.Network.WiFi] Use lock on checking if instance is null * [WiFi][Connection] Apply CAPIs for thread handling --- .../Interop/Interop.Connection.cs | 8 +-- .../ConnectionInternalManager.cs | 81 ++++++---------------- src/Tizen.Network.WiFi/Interop/Interop.WiFi.cs | 8 +-- .../Tizen.Network.WiFi/WiFiManager.cs | 13 +++- .../Tizen.Network.WiFi/WiFiManagerImpl.cs | 31 +++++---- 5 files changed, 57 insertions(+), 84 deletions(-) diff --git a/src/Tizen.Network.Connection/Interop/Interop.Connection.cs b/src/Tizen.Network.Connection/Interop/Interop.Connection.cs index 89011c8..d4db427 100755 --- a/src/Tizen.Network.Connection/Interop/Interop.Connection.cs +++ b/src/Tizen.Network.Connection/Interop/Interop.Connection.cs @@ -33,11 +33,11 @@ internal static partial class Interop [UnmanagedFunctionPointer(CallingConvention.Cdecl)] public delegate bool IPv6AddressCallback(IntPtr ipv6, IntPtr userData); - [DllImport(Libraries.Connection, EntryPoint = "connection_create")] - public static extern int Create(out IntPtr handle); + [DllImport(Libraries.Connection, EntryPoint = "connection_create_cs")] + public static extern int Create(int tid, out IntPtr handle); - [DllImport(Libraries.Connection, EntryPoint = "connection_destroy")] - public static extern int Destroy(IntPtr handle); + [DllImport(Libraries.Connection, EntryPoint = "connection_destroy_cs")] + public static extern int Destroy(int tid, IntPtr handle); [DllImport(Libraries.Connection, EntryPoint = "connection_get_type")] public static extern int GetType(IntPtr handle, out int type); diff --git a/src/Tizen.Network.Connection/Tizen.Network.Connection/ConnectionInternalManager.cs b/src/Tizen.Network.Connection/Tizen.Network.Connection/ConnectionInternalManager.cs index 908a6d2..a4ef319 100755 --- a/src/Tizen.Network.Connection/Tizen.Network.Connection/ConnectionInternalManager.cs +++ b/src/Tizen.Network.Connection/Tizen.Network.Connection/ConnectionInternalManager.cs @@ -25,15 +25,17 @@ using System.Threading; namespace Tizen.Network.Connection { - class HandleHolder : IDisposable + class HandleHolder { private IntPtr Handle; - private bool disposed = false; + private int tid; public HandleHolder() { - Log.Debug(Globals.LogTag, "Handle: " + Handle); - int ret = Interop.Connection.Create(out Handle); + tid = Thread.CurrentThread.ManagedThreadId; + Log.Info(Globals.LogTag, "PInvoke connection_destroy for Thread " + tid); + int ret = Interop.Connection.Create(tid, out Handle); + Log.Info(Globals.LogTag, "Handle: " + Handle); if(ret != (int)ConnectionError.None) { ConnectionErrorFactory.CheckFeatureUnsupportedException(ret, "http://tizen.org/feature/network.telephony " + "http://tizen.org/feature/network.wifi " + "http://tizen.org/feature/network.tethering.bluetooth " + "http://tizen.org/feature/network.ethernet"); @@ -44,7 +46,7 @@ namespace Tizen.Network.Connection ~HandleHolder() { - Dispose(false); + Destroy(); } internal IntPtr GetHandle() @@ -52,30 +54,11 @@ namespace Tizen.Network.Connection Log.Debug(Globals.LogTag, "handleholder handle = " + Handle); return Handle; } - public void Dispose() - { - Dispose(true); - GC.SuppressFinalize(this); - } - - private void Dispose(bool disposing) - { - Log.Debug(Globals.LogTag, ">>> HandleHolder Dispose with " + disposing); - Log.Debug(Globals.LogTag, ">>> Handle: " + Handle); - if (disposed) - return; - - if (disposing) - { - // Free managed objects. - Destroy(); - } - disposed = true; - } private void Destroy() { - Interop.Connection.Destroy(Handle); + Log.Info(Globals.LogTag, "PInvoke connection_destroy for Thread " + tid); + Interop.Connection.Destroy(tid, Handle); if (Handle != IntPtr.Zero) { Handle = IntPtr.Zero; @@ -85,7 +68,6 @@ namespace Tizen.Network.Connection internal class ConnectionInternalManager { - private bool disposed = false; private static readonly Lazy s_instance = new Lazy(() => new ConnectionInternalManager()); @@ -120,29 +102,6 @@ namespace Tizen.Network.Connection ~ConnectionInternalManager() { - Dispose(false); - } - - public void Dispose() - { - Dispose(true); - GC.SuppressFinalize(this); - } - - private void Dispose(bool disposing) - { - Log.Debug(Globals.LogTag, ">>> ConnectionInternalManager Dispose with disposing " + disposing + ", disposed " + disposed); - Log.Debug(Globals.LogTag, ">>> Handle: " + GetHandle()); - if (disposed) - return; - - if (disposing) - { - // Free managed objects. - } - - UnregisterEvents(); - disposed = true; } internal IntPtr GetHandle() @@ -401,7 +360,7 @@ namespace Tizen.Network.Connection internal System.Net.IPAddress GetIPAddress(AddressFamily family) { - Log.Debug(Globals.LogTag, "GetIPAddress " + family); + Log.Info(Globals.LogTag, "GetIPAddress " + family); IntPtr ip; int ret = Interop.Connection.GetIPAddress(GetHandle(), (int)family, out ip); if ((ConnectionError)ret != ConnectionError.None) @@ -414,7 +373,7 @@ namespace Tizen.Network.Connection string result = Marshal.PtrToStringAnsi(ip); Interop.Libc.Free(ip); - Log.Debug(Globals.LogTag, "IPAddress " + result + " (" + result.Length + ")"); + Log.Info(Globals.LogTag, "IPAddress " + result + " (" + result.Length + ")"); if (result.Length == 0) { if (family == AddressFamily.IPv4) @@ -475,7 +434,7 @@ namespace Tizen.Network.Connection internal string GetMacAddress(ConnectionType type) { - Log.Debug(Globals.LogTag, "GetMacAddress " + type); + Log.Info(Globals.LogTag, "GetMacAddress " + type); IntPtr mac; int ret = Interop.Connection.GetMacAddress(GetHandle(), (int)type, out mac); if ((ConnectionError)ret != ConnectionError.None) @@ -571,7 +530,7 @@ namespace Tizen.Network.Connection { get { - Log.Debug(Globals.LogTag, "get ConnectionType"); + Log.Info(Globals.LogTag, "get ConnectionType"); int type = 0; int ret = Interop.Connection.GetType(GetHandle(), out type); if ((ConnectionError)ret != ConnectionError.None) @@ -587,7 +546,7 @@ namespace Tizen.Network.Connection { get { - Log.Debug(Globals.LogTag, "get CellularState"); + Log.Info(Globals.LogTag, "get CellularState"); int type = 0; int ret = Interop.Connection.GetCellularState(GetHandle(), out type); if ((ConnectionError)ret != ConnectionError.None) @@ -603,7 +562,7 @@ namespace Tizen.Network.Connection { get { - Log.Debug(Globals.LogTag, "get WiFiState"); + Log.Info(Globals.LogTag, "get WiFiState"); int type = 0; int ret = Interop.Connection.GetWiFiState(GetHandle(), out type); if ((ConnectionError)ret != ConnectionError.None) @@ -619,7 +578,7 @@ namespace Tizen.Network.Connection { get { - Log.Debug(Globals.LogTag, "get BluetoothState"); + Log.Info(Globals.LogTag, "get BluetoothState"); int type = 0; int ret = Interop.Connection.GetBtState(GetHandle(), out type); if ((ConnectionError)ret != ConnectionError.None) @@ -635,7 +594,7 @@ namespace Tizen.Network.Connection { get { - Log.Debug(Globals.LogTag, "get ConnectionType"); + Log.Info(Globals.LogTag, "get ConnectionType"); int type = 0; int ret = Interop.Connection.GetEthernetState(GetHandle(), out type); if ((ConnectionError)ret != ConnectionError.None) @@ -651,7 +610,7 @@ namespace Tizen.Network.Connection { get { - Log.Debug(Globals.LogTag, "get EthernetCableState"); + Log.Info(Globals.LogTag, "get EthernetCableState"); int type = 0; int ret = Interop.Connection.GetEthernetCableState(GetHandle(), out type); if ((ConnectionError)ret != ConnectionError.None) @@ -741,7 +700,7 @@ namespace Tizen.Network.Connection internal void UpdateProfile(ConnectionProfile profile) { - Log.Debug(Globals.LogTag, "UpdateProfile"); + Log.Info(Globals.LogTag, "UpdateProfile"); if (profile != null) { int ret = Interop.Connection.UpdateProfile(GetHandle(), profile.ProfileHandle); @@ -762,7 +721,7 @@ namespace Tizen.Network.Connection internal ConnectionProfile GetCurrentProfile() { - Log.Debug(Globals.LogTag, "GetCurrentProfile"); + Log.Info(Globals.LogTag, "GetCurrentProfile"); IntPtr ProfileHandle; int ret = Interop.Connection.GetCurrentProfile(GetHandle(), out ProfileHandle); if ((ConnectionError)ret != ConnectionError.None) diff --git a/src/Tizen.Network.WiFi/Interop/Interop.WiFi.cs b/src/Tizen.Network.WiFi/Interop/Interop.WiFi.cs index d07116c..a70c6b1 100755 --- a/src/Tizen.Network.WiFi/Interop/Interop.WiFi.cs +++ b/src/Tizen.Network.WiFi/Interop/Interop.WiFi.cs @@ -38,10 +38,10 @@ internal static partial class Interop internal delegate void RssiLevelChangedCallback(int level, IntPtr userData); //capi-network-wifi-1.0.65-19.23.armv7l - [DllImport(Libraries.WiFi, EntryPoint = "wifi_manager_initialize")] - internal static extern int Initialize(out SafeWiFiManagerHandle wifi); - [DllImport(Libraries.WiFi, EntryPoint = "wifi_manager_deinitialize")] - internal static extern int Deinitialize(IntPtr wifi); + [DllImport(Libraries.WiFi, EntryPoint = "wifi_manager_initialize_cs")] + internal static extern int Initialize(int tid, out SafeWiFiManagerHandle wifi); + [DllImport(Libraries.WiFi, EntryPoint = "wifi_manager_deinitialize_cs")] + internal static extern int Deinitialize(int tid, IntPtr wifi); ////Wi-Fi Manager [DllImport(Libraries.WiFi, EntryPoint = "wifi_manager_activate")] diff --git a/src/Tizen.Network.WiFi/Tizen.Network.WiFi/WiFiManager.cs b/src/Tizen.Network.WiFi/Tizen.Network.WiFi/WiFiManager.cs index 2c39137..96d613c 100755 --- a/src/Tizen.Network.WiFi/Tizen.Network.WiFi/WiFiManager.cs +++ b/src/Tizen.Network.WiFi/Tizen.Network.WiFi/WiFiManager.cs @@ -29,6 +29,8 @@ namespace Tizen.Network.WiFi [EditorBrowsable(EditorBrowsableState.Never)] public sealed class SafeWiFiManagerHandle : SafeHandle { + private int tid; + internal SafeWiFiManagerHandle() : base(IntPtr.Zero, true) { } @@ -51,10 +53,19 @@ namespace Tizen.Network.WiFi /// protected override bool ReleaseHandle() { - Interop.WiFi.Deinitialize(this.handle); + Interop.WiFi.Deinitialize(tid, this.handle); this.SetHandle(IntPtr.Zero); return true; } + + internal int TID + { + set + { + tid = value; + Log.Info(Globals.LogTag, "New Handle for Thread " + tid); + } + } } /// diff --git a/src/Tizen.Network.WiFi/Tizen.Network.WiFi/WiFiManagerImpl.cs b/src/Tizen.Network.WiFi/Tizen.Network.WiFi/WiFiManagerImpl.cs index 9745f41..053949a 100755 --- a/src/Tizen.Network.WiFi/Tizen.Network.WiFi/WiFiManagerImpl.cs +++ b/src/Tizen.Network.WiFi/Tizen.Network.WiFi/WiFiManagerImpl.cs @@ -34,7 +34,7 @@ namespace Tizen.Network.WiFi internal HandleHolder() { _handle = WiFiManagerImpl.Instance.Initialize(); - Log.Debug(Globals.LogTag, "Handle: " + _handle); + Log.Info(Globals.LogTag, "Handle: " + _handle); } internal SafeWiFiManagerHandle GetSafeHandle() @@ -134,7 +134,7 @@ namespace Tizen.Network.WiFi private WiFiManagerImpl() { - Log.Info(Globals.LogTag, "WiFiManagerImpl constructor"); + Log.Info(Globals.LogTag, "WiFiManagerImpl constructor"); } internal SafeWiFiManagerHandle GetSafeHandle() @@ -145,18 +145,21 @@ namespace Tizen.Network.WiFi internal SafeWiFiManagerHandle Initialize() { SafeWiFiManagerHandle handle; - int ret = Interop.WiFi.Initialize(out handle); + int tid = Thread.CurrentThread.ManagedThreadId; + Log.Info(Globals.LogTag, "PInvoke wifi_manager_initialize"); + int ret = Interop.WiFi.Initialize(tid, out handle); if (ret != (int)WiFiError.None) { Log.Error(Globals.LogTag, "Failed to initialize wifi, Error - " + (WiFiError)ret); WiFiErrorFactory.ThrowWiFiException(ret, "http://tizen.org/privilege/network.get"); } + handle.TID = tid; return handle; } internal IEnumerable GetFoundAPs() { - Log.Debug(Globals.LogTag, "GetFoundAPs"); + Log.Info(Globals.LogTag, "GetFoundAPs"); List apList = new List(); Interop.WiFi.HandleCallback callback = (IntPtr apHandle, IntPtr userData) => { @@ -183,7 +186,7 @@ namespace Tizen.Network.WiFi internal IEnumerable GetFoundSpecificAPs() { - Log.Debug(Globals.LogTag, "GetFoundSpecificAPs"); + Log.Info(Globals.LogTag, "GetFoundSpecificAPs"); List apList = new List(); Interop.WiFi.HandleCallback callback = (IntPtr apHandle, IntPtr userData) => { @@ -255,7 +258,7 @@ namespace Tizen.Network.WiFi internal WiFiAP GetConnectedAP() { - Log.Debug(Globals.LogTag, "GetConnectedAP"); + Log.Info(Globals.LogTag, "GetConnectedAP"); IntPtr apHandle; int ret = Interop.WiFi.GetConnectedAP(GetSafeHandle(), out apHandle); if (ret != (int)WiFiError.None) @@ -277,7 +280,7 @@ namespace Tizen.Network.WiFi internal Task ActivateAsync() { - Log.Debug(Globals.LogTag, "ActivateAsync"); + Log.Info(Globals.LogTag, "ActivateAsync"); TaskCompletionSource task = new TaskCompletionSource(); IntPtr id; lock (_callback_map) @@ -285,7 +288,7 @@ namespace Tizen.Network.WiFi id = (IntPtr)_requestId++; _callback_map[id] = (error, key) => { - Log.Debug(Globals.LogTag, "wifi activated"); + Log.Info(Globals.LogTag, "wifi activated"); if (error != (int)WiFiError.None) { Log.Error(Globals.LogTag, "Error occurs during WiFi activating, " + (WiFiError)error); @@ -347,7 +350,7 @@ namespace Tizen.Network.WiFi internal Task DeactivateAsync() { - Log.Debug(Globals.LogTag, "DeactivateAsync"); + Log.Info(Globals.LogTag, "DeactivateAsync"); TaskCompletionSource task = new TaskCompletionSource(); IntPtr id; lock (_callback_map) @@ -355,7 +358,7 @@ namespace Tizen.Network.WiFi id = (IntPtr)_requestId++; _callback_map[id] = (error, key) => { - Log.Debug(Globals.LogTag, "Deactivation finished"); + Log.Info(Globals.LogTag, "Deactivation finished"); if (error != (int)WiFiError.None) { Log.Error(Globals.LogTag, "Error occurs during WiFi deactivating, " + (WiFiError)error); @@ -382,7 +385,7 @@ namespace Tizen.Network.WiFi internal Task ScanAsync() { - Log.Debug(Globals.LogTag, "ScanAsync"); + Log.Info(Globals.LogTag, "ScanAsync"); TaskCompletionSource task = new TaskCompletionSource(); IntPtr id; lock (_callback_map) @@ -390,7 +393,7 @@ namespace Tizen.Network.WiFi id = (IntPtr)_requestId++; _callback_map[id] = (error, key) => { - Log.Debug(Globals.LogTag, "Scanning finished"); + Log.Info(Globals.LogTag, "Scanning finished"); if (error != (int)WiFiError.None) { Log.Error(Globals.LogTag, "Error occurs during WiFi scanning, " + (WiFiError)error); @@ -417,7 +420,7 @@ namespace Tizen.Network.WiFi internal Task ScanSpecificAPAsync(string essid) { - Log.Debug(Globals.LogTag, "ScanSpecificAPAsync " + essid); + Log.Info(Globals.LogTag, "ScanSpecificAPAsync " + essid); TaskCompletionSource task = new TaskCompletionSource(); IntPtr id; lock (_callback_map) @@ -425,7 +428,7 @@ namespace Tizen.Network.WiFi id = (IntPtr)_requestId++; _callback_map[id] = (error, key) => { - Log.Debug(Globals.LogTag, "Scanning with specific AP finished"); + Log.Info(Globals.LogTag, "Scanning with specific AP finished"); if (error != (int)WiFiError.None) { Log.Error(Globals.LogTag, "Error occurs during WiFi scanning, " + (WiFiError)error); -- 2.7.4