Hi all,

I think I found the reason for the freeze.
If DropTarget::initialize called from a STA thread, the wait function
WaitForSingleObject() should not be used, because this wait will block the
message pumping of the thread, all COM calls will be blocked, this could
lead to a freeze.

Quote from the API document of WaitForSingleObject:

Use caution when calling the wait functions and code that directly or
indirectly creates windows. If a thread creates any windows, it must process
messages. Message broadcasts are sent to all windows in the system. A thread
that uses a wait function with no time-out interval may cause the system to
become deadlocked. Two examples of code that indirectly creates windows are
DDE and the 
*CoInitialize*<http://msdn.microsoft.com/en-us/library/ms678543%28VS.85%29.aspx>function.
Therefore, if you have a thread that creates windows, use
*MsgWaitForMultipleObjects*<http://msdn.microsoft.com/en-us/library/ms684242%28VS.85%29.aspx>or
*MsgWaitForMultipleObjectsEx*<http://msdn.microsoft.com/en-us/library/ms684245%28VS.85%29.aspx>,
rather than *WaitForSingleObject*.


I think we should use CoWaitForMultipleHandles(), which is a wrapper for
MsgWaitForMultipleObjects(), after I switched to CoWaitForMultipleHandles(),
app did not freeze in DropTarget::initialize anymore.

Any idea about this.

Thanks

-Huai Dong

On Mon, Nov 30, 2009 at 5:00 PM, Carsten Driesner
<carsten.dries...@sun.com>wrote:

> Huaidong Qiu wrote:
>
>> Hi Carsten,
>>
>> Yes, you are right, the possibility of OleInitialize failure is very low.
>> There wasn't two thread calling DropTarget::initialize, and the calling
>> thread is not main thread, I just think DropTarget::initialize call should
>> return already.
>>
>> But there are another possibility, the freeze main be caused by the main
>> thread, looks like some recursive calling going on. Could give some
>> suggestion about this.
>>
>> BTW: this comes from a crash report.
>>
>>
> Hi Huaidong,
>
> This is a completely different call stack and you are right that it looks
> like a strange recursion problem. I am not very familiar with this part of
> OpenOffice.org as the responsible code resides in VCL which is maintained by
> the gsl team. Hopefully someone from the team can give us some more
> information about this strange stack.
>
> Regards,
> Carsten
>
>  Thanks
>>
>>
>> function name:     void __cdecl ImplSalYieldMutexAcquireWithWait(void)
>> function name:     long __cdecl ImplHandleSalObjKeyMsg(struct HWND__
>> *,unsigned int,unsigned int,long)
>> function name:     long __stdcall SalFrameWndProc(struct HWND__ *,unsigned
>> int,unsigned int,long,int &)
>> function name:     long __stdcall SalFrameWndProcW(struct HWND__
>> *,unsigned
>> int,unsigned int,long)
>> function name:     int __cdecl ImplGetMessage(struct tagMSG *,struct
>> HWND__
>> *,unsigned int,unsigned int)
>> function name:     void __cdecl ImplSalYieldMutexAcquireWithWait(void)
>> function name:     long __cdecl ImplHandleSalObjKeyMsg(struct HWND__
>> *,unsigned int,unsigned int,long)
>> function name:     long __stdcall SalFrameWndProc(struct HWND__ *,unsigned
>> int,unsigned int,long,int &)
>> function name:     long __stdcall SalFrameWndProcW(struct HWND__
>> *,unsigned
>> int,unsigned int,long)
>> function name:     int __cdecl ImplGetMessage(struct tagMSG *,struct
>> HWND__
>> *,unsigned int,unsigned int)
>> function name:     void __cdecl ImplSalYieldMutexAcquireWithWait(void)
>> function name:     long __cdecl ImplHandleSalObjKeyMsg(struct HWND__
>> *,unsigned int,unsigned int,long)
>> function name:     long __stdcall SalFrameWndProc(struct HWND__ *,unsigned
>> int,unsigned int,long,int &)
>> function name:     long __stdcall SalFrameWndProcW(struct HWND__
>> *,unsigned
>> int,unsigned int,long)
>> function name:     int __cdecl ImplGetMessage(struct tagMSG *,struct
>> HWND__
>> *,unsigned int,unsigned int)
>> function name:     void __cdecl ImplSalYieldMutexAcquireWithWait(void)
>> function name:     public: virtual void __thiscall
>> WinSalInstance::Yield(bool,bool)
>> function name:     public: static void __cdecl Application::Yield(bool)
>> function name:     public: static void __cdecl Application::Execute(void)
>> function name:     unsigned char __cdecl ImplSVMain(void)
>> function name:     unsigned char __cdecl SVMain(void)
>>
>>
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: dev-unsubscr...@framework.openoffice.org
> For additional commands, e-mail: dev-h...@framework.openoffice.org
>
>

Reply via email to