diff options
author | Lauro Moura <lauromoura@expertisesolutions.com.br> | 2019-10-03 20:52:25 -0300 |
---|---|---|
committer | Lauro Moura <lauromoura@expertisesolutions.com.br> | 2019-10-04 10:12:57 -0300 |
commit | d5c8d0529278300eb889881b4774deebc4d46f31 (patch) | |
tree | f5af4c8c4fb6851ad8b1efecae7597c0c5297a9f | |
parent | 6d8e39a6425e721eb40e0cb1e67f1cbf5b223cc0 (diff) | |
download | efl-d5c8d0529278300eb889881b4774deebc4d46f31.tar.gz |
csharp: Move locks inside AddRemove native handlers
Summary:
Instead of using a lock block in every method definition, we just need
them inside the actual methods adding/removing the handlers.
Kudos to @herb for the suggestion.
Reviewers: felipealmeida, herb, brunobelo
Reviewed By: brunobelo
Subscribers: cedric, #reviewers, herb, #committers
Tags: #efl
Differential Revision: https://phab.enlightenment.org/D9758
-rw-r--r-- | src/bin/eolian_mono/eolian/mono/events.hh | 40 | ||||
-rw-r--r-- | src/bindings/mono/eo_mono/EoWrapper.cs | 86 |
2 files changed, 63 insertions, 63 deletions
diff --git a/src/bin/eolian_mono/eolian/mono/events.hh b/src/bin/eolian_mono/eolian/mono/events.hh index 6c5f12ea2a..2e4ca32c66 100644 --- a/src/bin/eolian_mono/eolian/mono/events.hh +++ b/src/bin/eolian_mono/eolian/mono/events.hh @@ -447,36 +447,30 @@ struct event_definition_generator scope_tab << "{\n" << scope_tab << scope_tab << "add\n" << scope_tab << scope_tab << "{\n" - << scope_tab << scope_tab << scope_tab << "lock (eflBindingEventLock)\n" + << scope_tab << scope_tab << scope_tab << "Efl.EventCb callerCb = (IntPtr data, ref Efl.Event.NativeStruct evt) =>\n" << scope_tab << scope_tab << scope_tab << "{\n" - << scope_tab << scope_tab << scope_tab << scope_tab << "Efl.EventCb callerCb = (IntPtr data, ref Efl.Event.NativeStruct evt) =>\n" + << scope_tab << scope_tab << scope_tab << scope_tab << "var obj = Efl.Eo.Globals.WrapperSupervisorPtrToManaged(data).Target;\n" + << scope_tab << scope_tab << scope_tab << scope_tab << "if (obj != null)\n" << scope_tab << scope_tab << scope_tab << scope_tab << "{\n" - << scope_tab << scope_tab << scope_tab << scope_tab << scope_tab << "var obj = Efl.Eo.Globals.WrapperSupervisorPtrToManaged(data).Target;\n" - << scope_tab << scope_tab << scope_tab << scope_tab << scope_tab << "if (obj != null)\n" + << scope_tab << scope_tab << scope_tab << scope_tab << scope_tab << event_args + << scope_tab << scope_tab << scope_tab << scope_tab << scope_tab << "try\n" << scope_tab << scope_tab << scope_tab << scope_tab << scope_tab << "{\n" - << scope_tab << scope_tab << scope_tab << scope_tab << scope_tab << scope_tab << event_args - << scope_tab << scope_tab << scope_tab << scope_tab << scope_tab << scope_tab << "try\n" - << scope_tab << scope_tab << scope_tab << scope_tab << scope_tab << scope_tab << "{\n" - << scope_tab << scope_tab << scope_tab << scope_tab << scope_tab << scope_tab << scope_tab << "value?.Invoke(obj, args);\n" - << scope_tab << scope_tab << scope_tab << scope_tab << scope_tab << scope_tab << "}\n" - << scope_tab << scope_tab << scope_tab << scope_tab << scope_tab << scope_tab << "catch (Exception e)\n" - << scope_tab << scope_tab << scope_tab << scope_tab << scope_tab << scope_tab << "{\n" - << scope_tab << scope_tab << scope_tab << scope_tab << scope_tab << scope_tab << scope_tab << "Eina.Log.Error(e.ToString());\n" - << scope_tab << scope_tab << scope_tab << scope_tab << scope_tab << scope_tab << scope_tab << "Eina.Error.Set(Eina.Error.UNHANDLED_EXCEPTION);\n" - << scope_tab << scope_tab << scope_tab << scope_tab << scope_tab << scope_tab << "}\n" + << scope_tab << scope_tab << scope_tab << scope_tab << scope_tab << scope_tab << "value?.Invoke(obj, args);\n" << scope_tab << scope_tab << scope_tab << scope_tab << scope_tab << "}\n" - << scope_tab << scope_tab << scope_tab << scope_tab << "};\n\n" - << scope_tab << scope_tab << scope_tab << scope_tab << "string key = \"_" << upper_c_name << "\";\n" - << scope_tab << scope_tab << scope_tab << scope_tab << "AddNativeEventHandler(" << library_name << ", key, callerCb, value);\n" - << scope_tab << scope_tab << scope_tab << "}\n" // End of lock block + << scope_tab << scope_tab << scope_tab << scope_tab << scope_tab << "catch (Exception e)\n" + << scope_tab << scope_tab << scope_tab << scope_tab << scope_tab << "{\n" + << scope_tab << scope_tab << scope_tab << scope_tab << scope_tab << scope_tab << "Eina.Log.Error(e.ToString());\n" + << scope_tab << scope_tab << scope_tab << scope_tab << scope_tab << scope_tab << "Eina.Error.Set(Eina.Error.UNHANDLED_EXCEPTION);\n" + << scope_tab << scope_tab << scope_tab << scope_tab << scope_tab << "}\n" + << scope_tab << scope_tab << scope_tab << scope_tab << "}\n" + << scope_tab << scope_tab << scope_tab << "};\n\n" + << scope_tab << scope_tab << scope_tab << "string key = \"_" << upper_c_name << "\";\n" + << scope_tab << scope_tab << scope_tab << "AddNativeEventHandler(" << library_name << ", key, callerCb, value);\n" << scope_tab << scope_tab << "}\n\n" << scope_tab << scope_tab << "remove\n" << scope_tab << scope_tab << "{\n" - << scope_tab << scope_tab << scope_tab << "lock (eflBindingEventLock)\n" - << scope_tab << scope_tab << scope_tab << "{\n" - << scope_tab << scope_tab << scope_tab << scope_tab << "string key = \"_" << upper_c_name << "\";\n" - << scope_tab << scope_tab << scope_tab << scope_tab << "RemoveNativeEventHandler(" << library_name << ", key, value);\n" - << scope_tab << scope_tab << scope_tab << "}\n" // End of lock block + << scope_tab << scope_tab << scope_tab << "string key = \"_" << upper_c_name << "\";\n" + << scope_tab << scope_tab << scope_tab << "RemoveNativeEventHandler(" << library_name << ", key, value);\n" << scope_tab << scope_tab << "}\n" << scope_tab << "}\n\n" ).generate(sink, attributes::unused, context); diff --git a/src/bindings/mono/eo_mono/EoWrapper.cs b/src/bindings/mono/eo_mono/EoWrapper.cs index 79d597c7b6..eae4eea3b5 100644 --- a/src/bindings/mono/eo_mono/EoWrapper.cs +++ b/src/bindings/mono/eo_mono/EoWrapper.cs @@ -20,7 +20,7 @@ namespace Eo public abstract class EoWrapper : IWrapper, IDisposable { /// <summary>Object used to synchronize access to EFL events.</summary> - protected readonly object eflBindingEventLock = new object(); + private readonly object eflBindingEventLock = new object(); private bool generated = true; private System.IntPtr handle = IntPtr.Zero; @@ -215,30 +215,33 @@ public abstract class EoWrapper : IWrapper, IDisposable /// <param name="evtDelegate">Managed delegate that will be called by evtCaller on event raising.</param> protected void AddNativeEventHandler(string lib, string key, Efl.EventCb evtCaller, object evtDelegate) { - IntPtr desc = Efl.EventDescription.GetNative(lib, key); - if (desc == IntPtr.Zero) + lock (eflBindingEventLock) { - Eina.Log.Error($"Failed to get native event {key}"); - return; - } + IntPtr desc = Efl.EventDescription.GetNative(lib, key); + if (desc == IntPtr.Zero) + { + Eina.Log.Error($"Failed to get native event {key}"); + return; + } - var wsPtr = Efl.Eo.Globals.efl_mono_wrapper_supervisor_get(handle); - var ws = Efl.Eo.Globals.WrapperSupervisorPtrToManaged(wsPtr); - if (ws.EoEvents.ContainsKey((desc, evtDelegate))) - { - Eina.Log.Warning($"Event proxy for event {key} already registered!"); - return; - } + var wsPtr = Efl.Eo.Globals.efl_mono_wrapper_supervisor_get(handle); + var ws = Efl.Eo.Globals.WrapperSupervisorPtrToManaged(wsPtr); + if (ws.EoEvents.ContainsKey((desc, evtDelegate))) + { + Eina.Log.Warning($"Event proxy for event {key} already registered!"); + return; + } - IntPtr evtCallerPtr = Marshal.GetFunctionPointerForDelegate(evtCaller); - if (!Efl.Eo.Globals.efl_event_callback_priority_add(handle, desc, 0, evtCallerPtr, wsPtr)) - { - Eina.Log.Error($"Failed to add event proxy for event {key}"); - return; - } + IntPtr evtCallerPtr = Marshal.GetFunctionPointerForDelegate(evtCaller); + if (!Efl.Eo.Globals.efl_event_callback_priority_add(handle, desc, 0, evtCallerPtr, wsPtr)) + { + Eina.Log.Error($"Failed to add event proxy for event {key}"); + return; + } - ws.EoEvents[(desc, evtDelegate)] = (evtCallerPtr, evtCaller); - Eina.Error.RaiseIfUnhandledException(); + ws.EoEvents[(desc, evtDelegate)] = (evtCallerPtr, evtCaller); + Eina.Error.RaiseIfUnhandledException(); + } } /// <summary>Removes the given event handler for the given event. For internal use only.</summary> @@ -247,30 +250,33 @@ public abstract class EoWrapper : IWrapper, IDisposable /// <param name="evtDelegate">The delegate to be removed.</param> protected void RemoveNativeEventHandler(string lib, string key, object evtDelegate) { - IntPtr desc = Efl.EventDescription.GetNative(lib, key); - if (desc == IntPtr.Zero) + lock (eflBindingEventLock) { - Eina.Log.Error($"Failed to get native event {key}"); - return; - } - - var wsPtr = Efl.Eo.Globals.efl_mono_wrapper_supervisor_get(handle); - var ws = Efl.Eo.Globals.WrapperSupervisorPtrToManaged(wsPtr); - var evtPair = (desc, evtDelegate); - if (ws.EoEvents.TryGetValue(evtPair, out var caller)) - { - if (!Efl.Eo.Globals.efl_event_callback_del(handle, desc, caller.evtCallerPtr, wsPtr)) + IntPtr desc = Efl.EventDescription.GetNative(lib, key); + if (desc == IntPtr.Zero) { - Eina.Log.Error($"Failed to remove event proxy for event {key}"); + Eina.Log.Error($"Failed to get native event {key}"); return; } - ws.EoEvents.Remove(evtPair); - Eina.Error.RaiseIfUnhandledException(); - } - else - { - Eina.Log.Error($"Trying to remove proxy for event {key} when it is not registered."); + var wsPtr = Efl.Eo.Globals.efl_mono_wrapper_supervisor_get(handle); + var ws = Efl.Eo.Globals.WrapperSupervisorPtrToManaged(wsPtr); + var evtPair = (desc, evtDelegate); + if (ws.EoEvents.TryGetValue(evtPair, out var caller)) + { + if (!Efl.Eo.Globals.efl_event_callback_del(handle, desc, caller.evtCallerPtr, wsPtr)) + { + Eina.Log.Error($"Failed to remove event proxy for event {key}"); + return; + } + + ws.EoEvents.Remove(evtPair); + Eina.Error.RaiseIfUnhandledException(); + } + else + { + Eina.Log.Error($"Trying to remove proxy for event {key} when it is not registered."); + } } } |