FFFTPのソースコードです。
Revision | 46cb6ad4eea69835e1aab2d29ed9c8117a6d516b (tree) |
---|---|
Time | 2011-10-15 16:22:08 |
Author | s_kawamoto <s_kawamoto@user...> |
Commiter | s_kawamoto |
Fix bugs of asyncronous socket control.
Fix bugs of deadlock around file deletion.
Adjust performance of simultaneous connection.
Fix bugs of UI for Kanji code of filenames.
Change handling timestamp that do not include year.
This version may be nearly stable (not for 1.99 but for 1.98b).
@@ -741,8 +741,8 @@ BEGIN | ||
741 | 741 | CONTROL "UTF-8",HSET_UTF8N_CNV,"Button",BS_AUTORADIOBUTTON,12,69,41,10 |
742 | 742 | CONTROL "Hankaku to Zenkaku",HSET_HANCNV,"Button",BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP,12,96,90,10 |
743 | 743 | GROUPBOX "&Filename Kanji Code",-1,107,7,97,116,WS_GROUP |
744 | - CONTROL "Automatic",HSET_FN_AUTO_CNV,"Button",BS_AUTORADIOBUTTON | WS_GROUP,114,21,65,10 | |
745 | - CONTROL "Shift_JIS",HSET_FN_SJIS_CNV,"Button",BS_AUTORADIOBUTTON | WS_GROUP,111,33,65,10 | |
744 | + CONTROL "Automatic",HSET_FN_AUTO_CNV,"Button",BS_AUTORADIOBUTTON | WS_GROUP,111,21,65,10 | |
745 | + CONTROL "Shift_JIS",HSET_FN_SJIS_CNV,"Button",BS_AUTORADIOBUTTON,111,33,65,10 | |
746 | 746 | CONTROL "JIS",HSET_FN_JIS_CNV,"Button",BS_AUTORADIOBUTTON,111,45,70,10 |
747 | 747 | CONTROL "EUC",HSET_FN_EUC_CNV,"Button",BS_AUTORADIOBUTTON,111,57,41,10 |
748 | 748 | CONTROL "Samba-HEX",HSET_FN_SMH_CNV,"Button",BS_AUTORADIOBUTTON,111,69,66,10 |
@@ -4771,9 +4771,11 @@ static int ResolvFileInfo(char *Str, int ListType, char *Fname, LONGLONG *Size, | ||
4771 | 4771 | |
4772 | 4772 | /* 年がない */ |
4773 | 4773 | /* 現在の日付から推定 */ |
4774 | - if((sTimeNow.wMonth == 12) && (sTime.wMonth == 1)) | |
4775 | - sTime.wYear++; | |
4776 | - else if(sTimeNow.wMonth+1 == sTime.wMonth) | |
4774 | + // 恐らくホストとローカルの時刻が異なる場合の対処のようだがとりあえず無効にする | |
4775 | +// if((sTimeNow.wMonth == 12) && (sTime.wMonth == 1)) | |
4776 | +// sTime.wYear++; | |
4777 | +// else if(sTimeNow.wMonth+1 == sTime.wMonth) | |
4778 | + if(sTimeNow.wMonth+1 == sTime.wMonth) | |
4777 | 4779 | /* nothing */; |
4778 | 4780 | else if(sTimeNow.wMonth < sTime.wMonth) |
4779 | 4781 | sTime.wYear--; |
@@ -1960,6 +1960,8 @@ void DeleteProc(void) | ||
1960 | 1960 | char CurDir[FMAX_PATH+1]; |
1961 | 1961 | char Tmp[FMAX_PATH+1]; |
1962 | 1962 | |
1963 | + // デッドロック対策 | |
1964 | + DisableUserOpe(); | |
1963 | 1965 | Sts = YES; |
1964 | 1966 | AskRemoteCurDir(CurDir, FMAX_PATH); |
1965 | 1967 | FileListBase = NULL; |
@@ -1979,7 +1981,8 @@ void DeleteProc(void) | ||
1979 | 1981 | |
1980 | 1982 | if(Sts == YES) |
1981 | 1983 | { |
1982 | - DisableUserOpe(); | |
1984 | + // デッドロック対策 | |
1985 | +// DisableUserOpe(); | |
1983 | 1986 | |
1984 | 1987 | DelFlg = NO; |
1985 | 1988 | Sts = NO; |
@@ -2015,8 +2018,11 @@ void DeleteProc(void) | ||
2015 | 2018 | GetRemoteDirForWnd(CACHE_REFRESH, &CancelFlg); |
2016 | 2019 | } |
2017 | 2020 | |
2018 | - EnableUserOpe(); | |
2021 | + // デッドロック対策 | |
2022 | +// EnableUserOpe(); | |
2019 | 2023 | } |
2024 | + // デッドロック対策 | |
2025 | + EnableUserOpe(); | |
2020 | 2026 | return; |
2021 | 2027 | } |
2022 | 2028 |
@@ -143,6 +143,9 @@ static int MoveToForeground = NO; /* ウインドウを前面に移動するか | ||
143 | 143 | static char CurDir[FMAX_PATH+1] = { "" }; |
144 | 144 | static char ErrMsg[ERR_MSG_LEN+7]; |
145 | 145 | |
146 | +// 同時接続対応 | |
147 | +static int WaitForMainThread = NO; | |
148 | + | |
146 | 149 | /*===== 外部参照 =====*/ |
147 | 150 | |
148 | 151 | /* 設定値 */ |
@@ -362,6 +365,7 @@ void AddTransFileList(TRANSPACKET *Pkt) | ||
362 | 365 | // WaitForSingleObject(hListAccMutex, INFINITE); |
363 | 366 | while(WaitForSingleObject(hListAccMutex, 0) == WAIT_TIMEOUT) |
364 | 367 | { |
368 | + WaitForMainThread = YES; | |
365 | 369 | BackgrndMessageProc(); |
366 | 370 | Sleep(1); |
367 | 371 | } |
@@ -379,6 +383,8 @@ void AddTransFileList(TRANSPACKET *Pkt) | ||
379 | 383 | if(NextTransPacketBase == NULL) |
380 | 384 | NextTransPacketBase = TransPacketBase; |
381 | 385 | ReleaseMutex(hListAccMutex); |
386 | + // 同時接続対応 | |
387 | + WaitForMainThread = NO; | |
382 | 388 | |
383 | 389 | return; |
384 | 390 | } |
@@ -405,6 +411,7 @@ void AppendTransFileList(TRANSPACKET *Pkt) | ||
405 | 411 | // WaitForSingleObject(hListAccMutex, INFINITE); |
406 | 412 | while(WaitForSingleObject(hListAccMutex, 0) == WAIT_TIMEOUT) |
407 | 413 | { |
414 | + WaitForMainThread = YES; | |
408 | 415 | BackgrndMessageProc(); |
409 | 416 | Sleep(1); |
410 | 417 | } |
@@ -436,6 +443,8 @@ void AppendTransFileList(TRANSPACKET *Pkt) | ||
436 | 443 | } |
437 | 444 | |
438 | 445 | ReleaseMutex(hListAccMutex); |
446 | + // 同時接続対応 | |
447 | + WaitForMainThread = NO; | |
439 | 448 | return; |
440 | 449 | } |
441 | 450 |
@@ -492,6 +501,7 @@ static void EraseTransFileList(void) | ||
492 | 501 | // WaitForSingleObject(hListAccMutex, INFINITE); |
493 | 502 | while(WaitForSingleObject(hListAccMutex, 0) == WAIT_TIMEOUT) |
494 | 503 | { |
504 | + WaitForMainThread = YES; | |
495 | 505 | BackgrndMessageProc(); |
496 | 506 | Sleep(1); |
497 | 507 | } |
@@ -525,6 +535,8 @@ static void EraseTransFileList(void) | ||
525 | 535 | TransFiles = 0; |
526 | 536 | PostMessage(GetMainHwnd(), WM_CHANGE_COND, 0, 0); |
527 | 537 | ReleaseMutex(hListAccMutex); |
538 | + // 同時接続対応 | |
539 | + WaitForMainThread = NO; | |
528 | 540 | |
529 | 541 | strcpy(Pkt.Cmd, "GOQUIT"); |
530 | 542 | AddTransFileList(&Pkt); |
@@ -649,6 +661,7 @@ static ULONG WINAPI TransferThread(void *Dummy) | ||
649 | 661 | CmdSkt = INVALID_SOCKET; |
650 | 662 | NewCmdSkt = INVALID_SOCKET; |
651 | 663 | TrnSkt = INVALID_SOCKET; |
664 | + SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_LOWEST); | |
652 | 665 | |
653 | 666 | while((TransPacketBase != NULL) || |
654 | 667 | (WaitForSingleObject(hRunMutex, 200) == WAIT_TIMEOUT)) |
@@ -656,6 +669,13 @@ static ULONG WINAPI TransferThread(void *Dummy) | ||
656 | 669 | if(fTransferThreadExit == TRUE) |
657 | 670 | break; |
658 | 671 | |
672 | + if(WaitForMainThread == YES) | |
673 | + { | |
674 | + BackgrndMessageProc(); | |
675 | + Sleep(100); | |
676 | + continue; | |
677 | + } | |
678 | + | |
659 | 679 | // WaitForSingleObject(hListAccMutex, INFINITE); |
660 | 680 | while(WaitForSingleObject(hListAccMutex, 0) == WAIT_TIMEOUT) |
661 | 681 | { |
@@ -1089,7 +1109,8 @@ static ULONG WINAPI TransferThread(void *Dummy) | ||
1089 | 1109 | } |
1090 | 1110 | } |
1091 | 1111 | BackgrndMessageProc(); |
1092 | - Sleep(1); | |
1112 | +// Sleep(1); | |
1113 | + Sleep(100); | |
1093 | 1114 | |
1094 | 1115 | if(GoExit == YES) |
1095 | 1116 | { |
@@ -1116,7 +1137,10 @@ static ULONG WINAPI TransferThread(void *Dummy) | ||
1116 | 1137 | hWndTrans = NULL; |
1117 | 1138 | } |
1118 | 1139 | BackgrndMessageProc(); |
1119 | - Sleep(1); | |
1140 | + if(ThreadCount < AskMaxThreadCount()) | |
1141 | + Sleep(1); | |
1142 | + else | |
1143 | + Sleep(100); | |
1120 | 1144 | } |
1121 | 1145 | } |
1122 | 1146 | if(TrnSkt != INVALID_SOCKET) |
@@ -484,8 +484,8 @@ static int RegistAsyncTable(SOCKET s) | ||
484 | 484 | { |
485 | 485 | // 強制的に閉じられたソケットがあると重複する可能性あり |
486 | 486 | // MessageBox(GetMainHwnd(), "Async socket already registerd.", "FFFTP inner error", MB_OK); |
487 | +// break; | |
487 | 488 | Signal[Pos].Socket = INVALID_SOCKET; |
488 | - break; | |
489 | 489 | } |
490 | 490 | } |
491 | 491 | // スレッド衝突のバグ修正 |