[Monodevelop-patches-list] r2087 - in trunk/MonoDevelop/Core/src/Main/Base: . Gui/Pads Services/DispatchService

commit-watcher at mono-cvs.ximian.com commit-watcher at mono-cvs.ximian.com
Tue Dec 21 06:35:44 EST 2004


Author: lluis
Date: 2004-12-21 06:35:44 -0500 (Tue, 21 Dec 2004)
New Revision: 2087

Modified:
   trunk/MonoDevelop/Core/src/Main/Base/ChangeLog
   trunk/MonoDevelop/Core/src/Main/Base/Gui/Pads/OpenTaskView.cs
   trunk/MonoDevelop/Core/src/Main/Base/Services/DispatchService/DispatchService.cs
   trunk/MonoDevelop/Core/src/Main/Base/Services/DispatchService/SyncContext.cs
Log:
2004-12-21  Lluis Sanchez Gual  <lluis at novell.com>

	* Services/DispatchService/DispatchService.cs: Removed unneded check
	for empty queue in QueueMessage. Not needed since all changes are now
	done inside a lock.
	* Services/DispatchService/SyncContext.cs: Fixed the delegate generator.
	The implementation was wrong. Also added a sample generated class to
	help understand what it does.
	* Gui/Pads/OpenTaskView.cs: Keep track of added tasks. TaskService
	events can be sent asynchronously, so when the event is handled,
	there is no	guarantee that the state of the task service is the same
	as when the event was raised.
	


Modified: trunk/MonoDevelop/Core/src/Main/Base/ChangeLog
===================================================================
--- trunk/MonoDevelop/Core/src/Main/Base/ChangeLog	2004-12-17 20:02:04 UTC (rev 2086)
+++ trunk/MonoDevelop/Core/src/Main/Base/ChangeLog	2004-12-21 11:35:44 UTC (rev 2087)
@@ -1,3 +1,16 @@
+2004-12-21  Lluis Sanchez Gual  <lluis at novell.com>
+
+	* Services/DispatchService/DispatchService.cs: Removed unneded check
+	for empty queue in QueueMessage. Not needed since all changes are now
+	done inside a lock.
+	* Services/DispatchService/SyncContext.cs: Fixed the delegate generator.
+	The implementation was wrong. Also added a sample generated class to
+	help understand what it does.
+	* Gui/Pads/OpenTaskView.cs: Keep track of added tasks. TaskService
+	events can be sent asynchronously, so when the event is handled,
+	there is no	guarantee that the state of the task service is the same
+	as when the event was raised.
+	
 2004-12-16  Lluis Sanchez Gual  <lluis at novell.com>
 
 	* Services/DispatchService/SyncContext.cs: Dispatch delegate calls

Modified: trunk/MonoDevelop/Core/src/Main/Base/Gui/Pads/OpenTaskView.cs
===================================================================
--- trunk/MonoDevelop/Core/src/Main/Base/Gui/Pads/OpenTaskView.cs	2004-12-17 20:02:04 UTC (rev 2086)
+++ trunk/MonoDevelop/Core/src/Main/Base/Gui/Pads/OpenTaskView.cs	2004-12-21 11:35:44 UTC (rev 2087)
@@ -26,6 +26,7 @@
 		Gtk.TreeView view;
 		ListStore store;
 		Clipboard clipboard;
+		Hashtable tasks = new Hashtable ();
 		
 		public Gtk.Widget Control {
 			get {
@@ -194,6 +195,7 @@
 		public void ShowResults (object sender, EventArgs e)
 		{
 			store.Clear ();
+			tasks.Clear ();
 			
 			foreach (Task t in Runtime.TaskService.Tasks) {
 				AddTask (t);
@@ -208,6 +210,9 @@
 		
 		public void AddTask (Task t)
 		{
+			if (tasks.Contains (t)) return;
+			tasks [t] = t;
+			
 			Gdk.Pixbuf stock;
 			switch (t.TaskType) {
 				case TaskType.Warning:

Modified: trunk/MonoDevelop/Core/src/Main/Base/Services/DispatchService/DispatchService.cs
===================================================================
--- trunk/MonoDevelop/Core/src/Main/Base/Services/DispatchService/DispatchService.cs	2004-12-17 20:02:04 UTC (rev 2086)
+++ trunk/MonoDevelop/Core/src/Main/Base/Services/DispatchService/DispatchService.cs	2004-12-21 11:35:44 UTC (rev 2087)
@@ -82,17 +82,8 @@
 		{
 			lock (arrGuiQueue) {
 				arrGuiQueue.Add (msg);
-				if (iIdle == 0) {
+				if (iIdle == 0)
 					iIdle = GLib.Idle.Add (handler);
-					/* This code is required because for some
-					 * reason the idle handler is run once
-					 * before being set, so you get a idle
-					 * handler that isnt running, but our code
-					 * thinks that it is.
-					 */
-					if (arrGuiQueue.Count == 0 && iIdle != 0)
-						iIdle = 0;
-				}
 			}
 		}
 		

Modified: trunk/MonoDevelop/Core/src/Main/Base/Services/DispatchService/SyncContext.cs
===================================================================
--- trunk/MonoDevelop/Core/src/Main/Base/Services/DispatchService/SyncContext.cs	2004-12-17 20:02:04 UTC (rev 2086)
+++ trunk/MonoDevelop/Core/src/Main/Base/Services/DispatchService/SyncContext.cs	2004-12-21 11:35:44 UTC (rev 2087)
@@ -65,36 +65,49 @@
 		{
 			MethodInfo invoke = delegateType.GetMethod ("Invoke");
 			ModuleBuilder module = GetModuleBuilder ();
-			TypeBuilder typeBuilder = module.DefineType ("__" + delegateType.Name + "_DelegateFactory", TypeAttributes.Public, typeof(object), new Type[] {typeof(IDelegateFactory)});
 			
-			// Context and target delegate field
+			// *** Data class
 			
-			FieldBuilder contextField = typeBuilder.DefineField ("context", typeof(SyncContext), FieldAttributes.Public);
-			FieldBuilder targetField = typeBuilder.DefineField ("target", delegateType, FieldAttributes.Public);
+			TypeBuilder dataTypeBuilder = module.DefineType ("__" + delegateType.Name + "_DelegateData", TypeAttributes.Public, typeof(object), Type.EmptyTypes);
 			
 			// Parameters
-			
 			ParameterInfo[] pars = invoke.GetParameters ();
 			FieldBuilder[] paramFields = new FieldBuilder [pars.Length];
 			Type[] paramTypes = new Type[pars.Length];
 			for (int n=0; n<pars.Length; n++)
 			{
 				ParameterInfo pi = pars [n];
-				paramFields [n] = typeBuilder.DefineField ("p" + n, pi.ParameterType, FieldAttributes.Public);
+				paramFields [n] = dataTypeBuilder.DefineField ("p" + n, pi.ParameterType, FieldAttributes.Public);
 				paramTypes [n] = pi.ParameterType;
 			}
 			
 			// Return value
-			
 			FieldBuilder returnField = null;
 			if (invoke.ReturnType != typeof(void))
-				returnField = typeBuilder.DefineField ("ret", invoke.ReturnType, FieldAttributes.Public);
+				returnField = dataTypeBuilder.DefineField ("ret", invoke.ReturnType, FieldAttributes.Public);
 			
 			// Constructor
+			ConstructorBuilder dataCtor = dataTypeBuilder.DefineConstructor (MethodAttributes.Public, CallingConventions.Standard, Type.EmptyTypes);
+			ConstructorInfo baseCtor = typeof(object).GetConstructor (Type.EmptyTypes);
+			ILGenerator gen = dataCtor.GetILGenerator();
+			gen.Emit (OpCodes.Ldarg_0);
+			gen.Emit (OpCodes.Call, baseCtor);
+			gen.Emit (OpCodes.Ret);
+
 			
+			// *** Factory class
+			
+			TypeBuilder typeBuilder = module.DefineType ("__" + delegateType.Name + "_DelegateFactory", TypeAttributes.Public, typeof(object), new Type[] {typeof(IDelegateFactory)});
+			
+			// Context and target delegate field
+			
+			FieldBuilder contextField = typeBuilder.DefineField ("context", typeof(SyncContext), FieldAttributes.Public);
+			FieldBuilder targetField = typeBuilder.DefineField ("target", delegateType, FieldAttributes.Public);
+			
+			// Constructor
+			
 			ConstructorBuilder ctor = typeBuilder.DefineConstructor (MethodAttributes.Public, CallingConventions.Standard, Type.EmptyTypes);
-			ConstructorInfo baseCtor = typeof(object).GetConstructor (Type.EmptyTypes);
-			ILGenerator gen = ctor.GetILGenerator();
+			gen = ctor.GetILGenerator();
 			gen.Emit (OpCodes.Ldarg_0);
 			gen.Emit (OpCodes.Call, baseCtor);
 			gen.Emit (OpCodes.Ret);
@@ -103,14 +116,20 @@
 			
 			MethodBuilder methodDispatch = typeBuilder.DefineMethod ("Dispatch", MethodAttributes.Public, typeof(void), new Type[] {typeof(object)});
 			gen = methodDispatch.GetILGenerator();
+			
+			LocalBuilder data = gen.DeclareLocal (dataTypeBuilder);
+			gen.Emit (OpCodes.Ldarg_1);
+			gen.Emit (OpCodes.Castclass, dataTypeBuilder);
+			gen.Emit (OpCodes.Stloc, data);
+			
 			if (returnField != null)
-				gen.Emit (OpCodes.Ldarg_0);
+				gen.Emit (OpCodes.Ldloc, data);
+
 			gen.Emit (OpCodes.Ldarg_0);
 			gen.Emit (OpCodes.Ldfld, targetField);
 			
-			for (int n=0; n<pars.Length; n++)
-			{
-				gen.Emit (OpCodes.Ldarg_0);
+			for (int n=0; n<pars.Length; n++) {
+				gen.Emit (OpCodes.Ldloc, data);
 				gen.Emit (OpCodes.Ldfld, paramFields[n]);
 			}
 			gen.Emit (OpCodes.Callvirt, invoke);
@@ -124,8 +143,13 @@
 			
 			MethodBuilder methodProxyCall = typeBuilder.DefineMethod ("ProxyCall", MethodAttributes.Public, invoke.ReturnType, paramTypes);
 			gen = methodProxyCall.GetILGenerator();
+			
+			data = gen.DeclareLocal (dataTypeBuilder);
+			gen.Emit (OpCodes.Newobj, dataCtor);
+			gen.Emit (OpCodes.Stloc, data);
+			
 			for (int n=0; n<paramFields.Length; n++) {
-				gen.Emit (OpCodes.Ldarg_0);
+				gen.Emit (OpCodes.Ldloc, data);
 				gen.Emit (OpCodes.Ldarg, n+1);
 				gen.Emit (OpCodes.Stfld, paramFields[n]);
 			}
@@ -134,13 +158,16 @@
 			gen.Emit (OpCodes.Ldarg_0);
 			gen.Emit (OpCodes.Ldftn, methodDispatch);
 			gen.Emit (OpCodes.Newobj, typeof(StatefulMessageHandler).GetConstructor (new Type[] {typeof(object), typeof(IntPtr)} ));
-			gen.Emit (OpCodes.Ldnull);
-			gen.Emit (OpCodes.Callvirt, typeof(SyncContext).GetMethod ("AsyncDispatch"));
+			gen.Emit (OpCodes.Ldloc, data);
 			
 			if (returnField != null) {
-				gen.Emit (OpCodes.Ldarg_0);
+				gen.Emit (OpCodes.Callvirt, typeof(SyncContext).GetMethod ("Dispatch"));
+				gen.Emit (OpCodes.Ldloc, data);
 				gen.Emit (OpCodes.Ldfld, returnField);
 			}
+			else {
+				gen.Emit (OpCodes.Callvirt, typeof(SyncContext).GetMethod ("AsyncDispatch"));
+			}
 			gen.Emit (OpCodes.Ret);
 			
 			// Create method
@@ -163,6 +190,7 @@
 			gen.Emit (OpCodes.Ret);
 			typeBuilder.DefineMethodOverride (methodCreate, typeof(IDelegateFactory).GetMethod ("Create"));
 			
+			dataTypeBuilder.CreateType ();
 			return typeBuilder.CreateType ();
 		}
 		
@@ -185,4 +213,44 @@
 	{
 		Delegate Create (Delegate del, SyncContext ctx);
 	}
+	
+	
+	/* Sample class generated for the EventHandler delegate
+	
+	class __EventHandler_DelegateData
+	{
+		public object psender;
+		public EventArgs pargs;
+	}
+	
+	class __EventHandler_DelegateFactory: IDelegateFactory
+	{
+		EventHandler target;
+		SyncContext context;
+		
+		public Delegate Create (Delegate del, SyncContext ctx)
+		{
+			__EventHandler_DelegateFactory vthis = new __EventHandler_DelegateFactory ();
+			vthis.target = del;
+			vthis.context = ctx;
+			return new EventHandler (vthis.ProxyCall);
+		}
+		
+		public void ProxyCall (object sender, EventArgs args)
+		{
+			__EventHandler_DelegateData data = new __EventHandler_DelegateData ();
+			data.psender = sender;
+			data.pargs = args;
+			StatefulMessageHandler msg = new StatefulMessageHandler (Dispatch);
+			context.AsyncDispatch (msg, data);
+		}
+		
+		public void Dispatch (object obj)
+		{
+			__EventHandler_DelegateData data = (__EventHandler_DelegateData) obj;
+			target (data.psender, data.pargs);
+		}
+	}
+	
+	*/
 }




More information about the Monodevelop-patches-list mailing list