If a Menu is accessed and the application used the function SetTimer, then the application and the wineserver use 100% of the CPU (loop of sending and receiving WM_TIMER).
function used: SetTimer(NULL, 0, 100, TimerProc)
Description of the loop: dlls/user/menu.c MENU_TrackMenu
while (!fEndMenu) { ... for (;;) { (1) if (PeekMessageW( &msg, 0, 0, 0, PM_NOREMOVE )) ... { (2) DispatchMessageW( &msg ); } if (!fEndMenu) fRemove = TRUE;
/* finally remove message from the queue */
if (fRemove && !(mt.trackFlags & TF_SKIPREMOVE) ) (3) PeekMessageW( &msg, 0, msg.message, msg.message, PM_REMOVE ); else mt.trackFlags &= ~TF_SKIPREMOVE; }
(1) The WM_TIMER is peeked and the timer is not restarted (PM_NOREMOVE) (2) The WM_TIMER is dispatched here (3) The WM_TIMER is only removed from the queue. The next PeekMessageW (1) return immediately with WM_TIMER since the timer was not restarted.
I propose to unconditionally restart the timer when the timer message is generated. Are there any collateral effect?
--- server/queue.c.orig 2005-03-24 16:16:54.000000000 -0300 +++ server/queue.c 2005-04-13 16:10:42.000000000 -0300 @@ -972,7 +972,7 @@ if (win && timer->win != win) continue; if (timer->msg >= get_first && timer->msg <= get_last) { - if (remove) restart_timer( queue, timer ); + restart_timer( queue, timer ); return timer; } }