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.");
+            }
         }
     }
 

-- 


Reply via email to