Skip to content

关于一个死锁问题 #87

Description

@htk719809837

前提:在创建对话框以后,对齐进行整个移动,MoveWindow()的操作(这里我们是输入框向上移动)
操作:然后通过CreateMainWindowIndirectParam()创建一个新的对话框(这里我们是基于对话框创建创建键盘),这个ui卡住,但是不崩溃
问题排查:
通过CreateMainWindowIndirectParam()创建基于对话框的键盘会默认
走到dialog.c中
hMainWin = CreateMainWindowEx (&CreateInfo,
werdr_name, we_attrs, window_name, layer_name);
如上的创建函数里面。
进一步跟到:window.c中
if (SendMessage (HWND_DESKTOP, MSG_ADDNEWMAINWIN, (WPARAM) pWin, 0) < 0)
goto err;
进一步跟到:desktop-comm.c中
case MSG_ADDNEWMAINWIN:
#ifdef _MGHAVE_MENU
if (sg_ptmi)
dskForceCloseMenu ();
#endif
return dskAddNewMainWindow(pWin);
再跟到:desktop.c中
dskMoveWindow
AllocZOrderNodeEx()函数:
到这个函数走不下去了,发现卡在lock_zi_for_change(zi)走不下去了,发现该值为负值溢出为正,导致进行一次unlock后没有归零,无法进行写操作。
然后分析前后因果关系发现是由MoveWindow()导致的,所以去检查MoveWindow();
跟到:desktop.c中的
dskMoveWindow()函数中:发现在 update_client_window_rgn (nodes [idx_znode].cli,
nodes [idx_znode].hwnd);
这句下面有一句
/* unlock zi for change ... */
unlock_zi_for_change (zi);
解锁函数,这里与minigui3不同样,minigui3将这句话放在了稍微前面一点的EmptyClipRgn (&sg_UpdateRgn);之后;

看到提交记录里面有对其进行一个修改,但是修改并不生效。

*******归结起来分析出来就是在desktop.c中的dskMoveWindow()函数中,有一句unlock_zi_for_change (zi);被移动了位置,导致进行一次unlock后没有归零,无法进行写操作,但是我尝试按照3.0的思路移动到前面,却不起任何作用,打算跟一步跟进的时候发现内部实现过于复杂了,所以想问一下是不是有解决方法

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions