OSDN Git Service

Fix bugs of deadlock around simultaneous connection.
authors_kawamoto <s_kawamoto@users.sourceforge.jp>
Mon, 19 Sep 2011 06:01:12 +0000 (15:01 +0900)
committers_kawamoto <s_kawamoto@users.sourceforge.jp>
Mon, 19 Sep 2011 06:01:12 +0000 (15:01 +0900)
Fix bugs of deadlock around getting host names.

FFFTP_Eng_Release/FFFTP.exe
Release/FFFTP.exe
connect.c
getput.c
main.c
mbswrapper.c
socket.c

index 27cc9ea..141e220 100644 (file)
Binary files a/FFFTP_Eng_Release/FFFTP.exe and b/FFFTP_Eng_Release/FFFTP.exe differ
index 620f4cc..775a2cd 100644 (file)
Binary files a/Release/FFFTP.exe and b/Release/FFFTP.exe differ
index 515cdaa..bb43e11 100644 (file)
--- a/connect.c
+++ b/connect.c
@@ -964,21 +964,21 @@ int ReConnectTrnSkt(SOCKET *Skt)
 \r
        SetTaskMsg(MSGJPN003);\r
 \r
-       DisableUserOpe();\r
+//     DisableUserOpe();\r
        /* 現在のソケットは切断 */\r
        if(*Skt != INVALID_SOCKET)\r
                do_closesocket(*Skt);\r
        /* 再接続 */\r
        if((*Skt = DoConnect(CurHost.HostAdrs, CurHost.UserName, CurHost.PassWord, CurHost.Account, CurHost.Port, CurHost.FireWall, NO, CurHost.Security)) != INVALID_SOCKET)\r
        {\r
-               AskRemoteCurDir(Path, FMAX_PATH);\r
+//             AskRemoteCurDir(Path, FMAX_PATH);\r
 //             DoCWD(Path, YES, YES, YES);\r
                Sts = FFFTP_SUCCESS;\r
        }\r
        else\r
                SoundPlay(SND_ERROR);\r
 \r
-       EnableUserOpe();\r
+//     EnableUserOpe();\r
        return(Sts);\r
 }\r
 \r
index 5a3b750..d7e00c2 100644 (file)
--- a/getput.c
+++ b/getput.c
@@ -356,7 +356,13 @@ void AddTransFileList(TRANSPACKET *Pkt)
 {\r
        DispTransPacket(Pkt);\r
 \r
-       WaitForSingleObject(hListAccMutex, INFINITE);\r
+       // 同時接続対応\r
+//     WaitForSingleObject(hListAccMutex, INFINITE);\r
+       while(WaitForSingleObject(hListAccMutex, 0) == WAIT_TIMEOUT)\r
+       {\r
+               BackgrndMessageProc();\r
+               Sleep(1);\r
+       }\r
 \r
        if(AddTmpTransFileList(Pkt, &TransPacketBase) == FFFTP_SUCCESS)\r
        {\r
@@ -390,7 +396,13 @@ void AppendTransFileList(TRANSPACKET *Pkt)
 {\r
        TRANSPACKET *Pos;\r
 \r
-       WaitForSingleObject(hListAccMutex, INFINITE);\r
+       // 同時接続対応\r
+//     WaitForSingleObject(hListAccMutex, INFINITE);\r
+       while(WaitForSingleObject(hListAccMutex, 0) == WAIT_TIMEOUT)\r
+       {\r
+               BackgrndMessageProc();\r
+               Sleep(1);\r
+       }\r
 \r
        if(TransPacketBase == NULL)\r
                TransPacketBase = Pkt;\r
@@ -468,7 +480,13 @@ static void EraseTransFileList(void)
 \r
        NotDel = NULL;\r
 \r
-       WaitForSingleObject(hListAccMutex, INFINITE);\r
+       // 同時接続対応\r
+//     WaitForSingleObject(hListAccMutex, INFINITE);\r
+       while(WaitForSingleObject(hListAccMutex, 0) == WAIT_TIMEOUT)\r
+       {\r
+               BackgrndMessageProc();\r
+               Sleep(1);\r
+       }\r
        New = TransPacketBase;\r
        while(New != NULL)\r
        {\r
@@ -621,7 +639,12 @@ static ULONG WINAPI TransferThread(void *Dummy)
                if(fTransferThreadExit == TRUE)\r
                        break;\r
 \r
-               WaitForSingleObject(hListAccMutex, INFINITE);\r
+//             WaitForSingleObject(hListAccMutex, INFINITE);\r
+               while(WaitForSingleObject(hListAccMutex, 0) == WAIT_TIMEOUT)\r
+               {\r
+                       BackgrndMessageProc();\r
+                       Sleep(1);\r
+               }\r
                memset(ErrMsg, NUL, ERR_MSG_LEN+7);\r
 \r
 //             Canceled = NO;\r
@@ -634,7 +657,12 @@ static ULONG WINAPI TransferThread(void *Dummy)
                        {\r
                                ReleaseMutex(hListAccMutex);\r
                                ReConnectTrnSkt(&TrnSkt);\r
-                               WaitForSingleObject(hListAccMutex, INFINITE);\r
+//                             WaitForSingleObject(hListAccMutex, INFINITE);\r
+                               while(WaitForSingleObject(hListAccMutex, 0) == WAIT_TIMEOUT)\r
+                               {\r
+                                       BackgrndMessageProc();\r
+                                       Sleep(1);\r
+                               }\r
                        }\r
                }\r
                else\r
@@ -644,7 +672,12 @@ static ULONG WINAPI TransferThread(void *Dummy)
                                ReleaseMutex(hListAccMutex);\r
                                DoClose(TrnSkt);\r
                                TrnSkt = INVALID_SOCKET;\r
-                               WaitForSingleObject(hListAccMutex, INFINITE);\r
+//                             WaitForSingleObject(hListAccMutex, INFINITE);\r
+                               while(WaitForSingleObject(hListAccMutex, 0) == WAIT_TIMEOUT)\r
+                               {\r
+                                       BackgrndMessageProc();\r
+                                       Sleep(1);\r
+                               }\r
                        }\r
                }\r
                CmdSkt = NewCmdSkt;\r
@@ -958,7 +991,12 @@ static ULONG WINAPI TransferThread(void *Dummy)
 \r
                        if(ForceAbort == NO)\r
                        {\r
-                               WaitForSingleObject(hListAccMutex, INFINITE);\r
+//                             WaitForSingleObject(hListAccMutex, INFINITE);\r
+                               while(WaitForSingleObject(hListAccMutex, 0) == WAIT_TIMEOUT)\r
+                               {\r
+                                       BackgrndMessageProc();\r
+                                       Sleep(1);\r
+                               }\r
                                if(ClearAll == YES)\r
 //                                     EraseTransFileList();\r
                                {\r
diff --git a/main.c b/main.c
index d7e1244..704be47 100644 (file)
--- a/main.c
+++ b/main.c
@@ -2615,7 +2615,6 @@ int BackgrndMessageProc(void)
        int Ret;\r
 \r
        Ret = NO;\r
-       SendMessage(GetMainHwnd(), WM_NULL, 0, 0);\r
        while(PeekMessage(&Msg, NULL, 0, 0, PM_REMOVE))\r
        {\r
                if(!HtmlHelp(NULL, NULL, HH_PRETRANSLATEMESSAGE, (DWORD)&Msg))\r
index bd4a9a5..be07d6c 100644 (file)
@@ -549,7 +549,7 @@ START_ROUTINE
                r = TerminateStringM((LPSTR)lParam, wParam);
                break;
        case WM_GETTEXTLENGTH:
-               Size = SendMessageW(hWnd, WM_GETTEXTLENGTH, 0, 0) + 1;
+               Size = SendMessageW(hWnd, WM_GETTEXTLENGTH, wParam, lParam) + 1;
                pw0 = AllocateStringW(Size);
                SendMessageW(hWnd, WM_GETTEXT, (WPARAM)Size, (LPARAM)pw0);
                r = WtoM(NULL, 0, pw0, -1) - 1;
index c823465..7c80486 100644 (file)
--- a/socket.c
+++ b/socket.c
@@ -291,6 +291,31 @@ static LRESULT CALLBACK SocketWndProc(HWND hWnd, UINT message, WPARAM wParam, LP
                                        break;\r
                                }\r
                        }\r
+                       // APIの仕様上ハンドルが登録される前にウィンドウメッセージが呼び出される可能性あり\r
+                       if(Pos == MAX_SIGNAL_ENTRY_DBASE)\r
+                       {\r
+                               for(Pos = 0; Pos < MAX_SIGNAL_ENTRY_DBASE; Pos++)\r
+                               {\r
+                                       if(SignalDbase[Pos].Async == 0)\r
+                                       {\r
+                                               SignalDbase[Pos].Async = (HANDLE)wParam;\r
+                                               SignalDbase[Pos].Done = 0;\r
+                                               SignalDbase[Pos].ErrorDb = 0;\r
+                                               if(HIWORD(lParam) != 0)\r
+                                               {\r
+                                                       SignalDbase[Pos].ErrorDb = 1;\r
+#if DBG_MSG\r
+                                                       DoPrintf("##### SignalDatabase: error");\r
+#endif\r
+                                               }\r
+                                               SignalDbase[Pos].Done = 1;\r
+#if DBG_MSG\r
+                                               DoPrintf("##### SignalDatabase: Done");\r
+#endif\r
+                                               break;\r
+                                       }\r
+                               }\r
+                       }\r
                        // スレッド衝突のバグ修正\r
                        ReleaseMutex(hAsyncTblAccMutex);\r
                        break;\r
@@ -525,7 +550,7 @@ static int RegistAsyncTableDbase(HANDLE Async)
                {\r
                        // 強制的に閉じられたハンドルがあると重複する可能性あり\r
 //                     MessageBox(GetMainHwnd(), "Async handle already registerd.", "FFFTP inner error", MB_OK);\r
-                       SignalDbase[Pos].Async = 0;\r
+                       // APIの仕様上ハンドルが登録される前にウィンドウメッセージが呼び出される可能性あり\r
                        break;\r
                }\r
        }\r