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