lauromoura pushed a commit to branch master. http://git.enlightenment.org/core/efl.git/commit/?id=d5c8d0529278300eb889881b4774deebc4d46f31
commit d5c8d0529278300eb889881b4774deebc4d46f31 Author: Lauro Moura <[email protected]> Date: Thu Oct 3 20:52:25 2019 -0300 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 --- src/bin/eolian_mono/eolian/mono/events.hh | 40 ++++++-------- 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."); + } } } --
