summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLauro Moura <lauromoura@expertisesolutions.com.br>2019-10-03 20:52:25 -0300
committerLauro Moura <lauromoura@expertisesolutions.com.br>2019-10-04 10:12:57 -0300
commitd5c8d0529278300eb889881b4774deebc4d46f31 (patch)
treef5af4c8c4fb6851ad8b1efecae7597c0c5297a9f
parent6d8e39a6425e721eb40e0cb1e67f1cbf5b223cc0 (diff)
downloadefl-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.hh40
-rw-r--r--src/bindings/mono/eo_mono/EoWrapper.cs86
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.");
+ }
}
}