2009-05-20 Dick Porter <dick@acm.org>
authorDick Porter <dick@acm.org>
Wed, 20 May 2009 16:11:17 +0000 (16:11 -0000)
committerDick Porter <dick@acm.org>
Wed, 20 May 2009 16:11:17 +0000 (16:11 -0000)
* XplatUICarbon.cs: Add more locking around MessageQueue
manipulations.

svn path=/trunk/mcs/; revision=134465

mcs/class/Managed.Windows.Forms/System.Windows.Forms/ChangeLog
mcs/class/Managed.Windows.Forms/System.Windows.Forms/XplatUICarbon.cs

index 2bbda4784b97505fc1c1e355ff0c7023e298967b..538df90a9acc5b509bd3d5f3317800f97584da58 100644 (file)
@@ -1,3 +1,8 @@
+2009-05-20  Dick Porter  <dick@acm.org>
+
+       * XplatUICarbon.cs: Add more locking around MessageQueue
+       manipulations.
+
 2009-05-18  Carlos Alberto Cortez <calberto.cortez@gmail.com> 
 
        * DateTimePicker.cs: Call Focus in HideMonthCalendar to avoid
index fb44a43f850f9a4cad1cb4f82b9f3105e54a6a33..7d6bb22322699e24463214a371bdb1b97d815ffa 100644 (file)
@@ -141,13 +141,15 @@ namespace System.Windows.Forms {
 
                internal void FlushQueue () {
                        CheckTimers (DateTime.UtcNow);
-                       while (MessageQueue.Count > 0) {
-                               object queueobj = MessageQueue.Dequeue ();
-                               if (queueobj is GCHandle) {
-                                       XplatUIDriverSupport.ExecuteClientMessage((GCHandle)queueobj);
-                               } else {
-                                       MSG msg = (MSG)queueobj;
-                                       NativeWindow.WndProc (msg.hwnd, msg.message, msg.wParam, msg.lParam);
+                       lock (queuelock) {
+                               while (MessageQueue.Count > 0) {
+                                       object queueobj = MessageQueue.Dequeue ();
+                                       if (queueobj is GCHandle) {
+                                               XplatUIDriverSupport.ExecuteClientMessage((GCHandle)queueobj);
+                                       } else {
+                                               MSG msg = (MSG)queueobj;
+                                               NativeWindow.WndProc (msg.hwnd, msg.message, msg.wParam, msg.lParam);
+                                       }
                                }
                        }
                }
@@ -420,7 +422,7 @@ namespace System.Windows.Forms {
                                msg.message = Msg.WM_MOUSEHOVER;
                                msg.wParam = GetMousewParam (0);
                                msg.lParam = (IntPtr)((ushort)Hover.X << 16 | (ushort)Hover.X);
-                               MessageQueue.Enqueue (msg);
+                               EnqueueMessage (msg);
                        }
                }
                #endregion
@@ -736,7 +738,7 @@ namespace System.Windows.Forms {
                                        MSG msg = new MSG ();
                                        msg.message = Msg.WM_PAINT;
                                        msg.hwnd = hwnd.Handle;
-                                       MessageQueue.Enqueue (msg);
+                                       EnqueueMessage (msg);
                                        hwnd.expose_pending = true;
                                }
                        } else {
@@ -749,7 +751,7 @@ namespace System.Windows.Forms {
                                        msg.wParam = hrgn == IntPtr.Zero ? (IntPtr)1 : hrgn;
                                        msg.refobject = rgn;
                                        msg.hwnd = hwnd.Handle;
-                                       MessageQueue.Enqueue (msg);
+                                       EnqueueMessage (msg);
                                        hwnd.nc_expose_pending = true;
 
                                }
@@ -1613,7 +1615,7 @@ namespace System.Windows.Forms {
                        msg.message = message;
                        msg.wParam = wParam;
                        msg.lParam = lParam;
-                       MessageQueue.Enqueue (msg);
+                       EnqueueMessage (msg);
                        return true;
                }
 
@@ -1681,7 +1683,9 @@ namespace System.Windows.Forms {
                [MonoTODO]
                internal override void SendAsyncMethod (AsyncMethodData method) {
                        // Fake async
-                       MessageQueue.Enqueue (GCHandle.Alloc (method));
+                       lock (queuelock) {
+                               MessageQueue.Enqueue (GCHandle.Alloc (method));
+                       }
                }
 
                [MonoTODO]