dotgnu-pnet-commits
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[dotgnu-pnet-commits] pnetlib/System.Windows.Forms Control.cs


From: Heiko Weiss
Subject: [dotgnu-pnet-commits] pnetlib/System.Windows.Forms Control.cs
Date: Tue, 11 Apr 2006 15:43:16 +0000

CVSROOT:        /sources/dotgnu-pnet
Module name:    pnetlib
Branch:         
Changes by:     Heiko Weiss <address@hidden>    06/04/11 15:43:16

Modified files:
        System.Windows.Forms: Control.cs 

Log message:
        fixed deadlock in invokes.

CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/dotgnu-pnet/pnetlib/System.Windows.Forms/Control.cs.diff?tr1=1.120&tr2=1.121&r1=text&r2=text

Patches:
Index: pnetlib/System.Windows.Forms/Control.cs
diff -u pnetlib/System.Windows.Forms/Control.cs:1.120 
pnetlib/System.Windows.Forms/Control.cs:1.121
--- pnetlib/System.Windows.Forms/Control.cs:1.120       Tue Apr 11 15:34:08 2006
+++ pnetlib/System.Windows.Forms/Control.cs     Tue Apr 11 15:43:16 2006
@@ -332,21 +332,30 @@
        // Implement the ISynchronizeInvoke interface.
        private void ProcessInvokeEvent(IntPtr i_gch)   
        {
-               lock( this.invokeEventQueue ) {
+               while( true ) {
+                       InvokeParameters iParm = null;
                        
-                       while( this.invokeEventQueue.Count > 0 ) {
-                               InvokeParameters iParm = (InvokeParameters) 
invokeEventQueue.Dequeue();
-       
-                               Delegate dg = iParm.method;
-                               Object ro = dg.DynamicInvoke(iParm.args);
-               
-                               InvokeAsyncResult ar = iParm.wr;
+                       lock( this.invokeEventQueue ) {
                                
-                               if( ar != null )
-                               {
-                                       ar.retObject = ro;
-                                       ar.SetComplete();
+                               if( this.invokeEventQueue.Count > 0 ) {
+                                       iParm = (InvokeParameters) 
invokeEventQueue.Dequeue();
                                }
+                               else {
+                                       iParm = null;
+                               }
+                       }
+                       
+                       if( null == iParm ) break;      // no more items
+               
+                       Delegate dg = iParm.method;
+                       Object ro = dg.DynamicInvoke(iParm.args);
+       
+                       InvokeAsyncResult ar = iParm.wr;
+                       
+                       if( ar != null )
+                       {
+                               ar.retObject = ro;
+                               ar.SetComplete();
                        }
                }
        }




reply via email to

[Prev in Thread] Current Thread [Next in Thread]