From 846f38b0fb603cac57f9e113be163c33ff4b145f Mon Sep 17 00:00:00 2001 From: Sven Strickroth Date: Wed, 6 Feb 2019 08:48:32 +0100 Subject: [PATCH] Make thread creation thread-safe Signed-off-by: Sven Strickroth --- src/TortoiseProc/AddDlg.cpp | 15 +++++++-------- src/TortoiseProc/ChangedDlg.cpp | 16 +++++++--------- src/TortoiseProc/FileDiffDlg.cpp | 9 +++++++-- src/TortoiseProc/ResolveDlg.cpp | 7 +++---- src/TortoiseProc/RevertDlg.cpp | 10 +++++----- src/TortoiseProc/SyncDlg.cpp | 3 ++- 6 files changed, 31 insertions(+), 29 deletions(-) diff --git a/src/TortoiseProc/AddDlg.cpp b/src/TortoiseProc/AddDlg.cpp index fa5ac89de..1c01b087f 100644 --- a/src/TortoiseProc/AddDlg.cpp +++ b/src/TortoiseProc/AddDlg.cpp @@ -189,7 +189,8 @@ BOOL CAddDlg::PreTranslateMessage(MSG* pMsg) LRESULT CAddDlg::OnSVNStatusListCtrlNeedsRefresh(WPARAM, LPARAM) { - InterlockedExchange(&m_bThreadRunning, TRUE); + if (InterlockedExchange(&m_bThreadRunning, TRUE)) + return 0; if (!AfxBeginThread(AddThreadEntry, this)) { InterlockedExchange(&m_bThreadRunning, FALSE); @@ -259,14 +260,12 @@ LRESULT CAddDlg::OnFileDropped(WPARAM, LPARAM lParam) void CAddDlg::Refresh() { - if (!m_bThreadRunning) + if (InterlockedExchange(&m_bThreadRunning, TRUE)) + return; + if (!AfxBeginThread(AddThreadEntry, this)) { - InterlockedExchange(&m_bThreadRunning, TRUE); - if (!AfxBeginThread(AddThreadEntry, this)) - { - InterlockedExchange(&m_bThreadRunning, FALSE); - CMessageBox::Show(this->m_hWnd, IDS_ERR_THREADSTARTFAILED, IDS_APPNAME, MB_OK | MB_ICONERROR); - } + InterlockedExchange(&m_bThreadRunning, FALSE); + CMessageBox::Show(this->m_hWnd, IDS_ERR_THREADSTARTFAILED, IDS_APPNAME, MB_OK | MB_ICONERROR); } } diff --git a/src/TortoiseProc/ChangedDlg.cpp b/src/TortoiseProc/ChangedDlg.cpp index e87d6ea37..e9ef2ebb3 100644 --- a/src/TortoiseProc/ChangedDlg.cpp +++ b/src/TortoiseProc/ChangedDlg.cpp @@ -147,8 +147,6 @@ UINT CChangedDlg::ChangedStatusThreadEntry(LPVOID pVoid) UINT CChangedDlg::ChangedStatusThread() { - InterlockedExchange(&m_bBlock, TRUE); - m_bCanceled = false; SetDlgItemText(IDOK, CString(MAKEINTRESOURCE(IDS_MSGBOX_CANCEL))); DialogEnableWindow(IDC_REFRESH, FALSE); @@ -324,10 +322,7 @@ BOOL CChangedDlg::PreTranslateMessage(MSG* pMsg) switch (pMsg->wParam) { case VK_F5: - { - if (!m_bBlock) - OnBnClickedRefresh(); - } + OnBnClickedRefresh(); break; } } @@ -337,10 +332,13 @@ BOOL CChangedDlg::PreTranslateMessage(MSG* pMsg) void CChangedDlg::OnBnClickedRefresh() { - if (!m_bBlock) + if (InterlockedExchange(&m_bBlock, TRUE)) + return; + + if (!AfxBeginThread(ChangedStatusThreadEntry, this)) { - if (!AfxBeginThread(ChangedStatusThreadEntry, this)) - CMessageBox::Show(GetSafeHwnd(), IDS_ERR_THREADSTARTFAILED, IDS_APPNAME, MB_OK | MB_ICONERROR); + InterlockedExchange(&m_bBlock, FALSE); + CMessageBox::Show(GetSafeHwnd(), IDS_ERR_THREADSTARTFAILED, IDS_APPNAME, MB_OK | MB_ICONERROR); } } diff --git a/src/TortoiseProc/FileDiffDlg.cpp b/src/TortoiseProc/FileDiffDlg.cpp index 5813d2493..6f7d0b06f 100644 --- a/src/TortoiseProc/FileDiffDlg.cpp +++ b/src/TortoiseProc/FileDiffDlg.cpp @@ -1096,7 +1096,8 @@ void CFileDiffDlg::ClickRevButton(CMenuButton *button, GitRev *rev, CACEdit *edi SetURLLabels(); - InterlockedExchange(&m_bThreadRunning, TRUE); + if (InterlockedExchange(&m_bThreadRunning, TRUE)) + return; if (!AfxBeginThread(DiffThreadEntry, this)) { InterlockedExchange(&m_bThreadRunning, FALSE); @@ -1195,7 +1196,11 @@ void CFileDiffDlg::OnTimer(UINT_PTR nIDEvent) if(mask == 0x3) { - InterlockedExchange(&m_bThreadRunning, TRUE); + if (InterlockedExchange(&m_bThreadRunning, TRUE)) + { + SetTimer(IDT_INPUT, 1000, nullptr); + return; + } if (!AfxBeginThread(DiffThreadEntry, this)) { InterlockedExchange(&m_bThreadRunning, FALSE); diff --git a/src/TortoiseProc/ResolveDlg.cpp b/src/TortoiseProc/ResolveDlg.cpp index 7b9209425..2df877114 100644 --- a/src/TortoiseProc/ResolveDlg.cpp +++ b/src/TortoiseProc/ResolveDlg.cpp @@ -169,10 +169,8 @@ BOOL CResolveDlg::PreTranslateMessage(MSG* pMsg) break; case VK_F5: { - if (!m_bThreadRunning) + if (!InterlockedExchange(&m_bThreadRunning, TRUE)) { - InterlockedExchange(&m_bThreadRunning, TRUE); - if (!AfxBeginThread(ResolveThreadEntry, this)) { InterlockedExchange(&m_bThreadRunning, FALSE); @@ -189,7 +187,8 @@ BOOL CResolveDlg::PreTranslateMessage(MSG* pMsg) LRESULT CResolveDlg::OnSVNStatusListCtrlNeedsRefresh(WPARAM, LPARAM) { - InterlockedExchange(&m_bThreadRunning, TRUE); + if (InterlockedExchange(&m_bThreadRunning, TRUE)) + return 0; if (!AfxBeginThread(ResolveThreadEntry, this)) { InterlockedExchange(&m_bThreadRunning, FALSE); diff --git a/src/TortoiseProc/RevertDlg.cpp b/src/TortoiseProc/RevertDlg.cpp index 054ee1085..799da3093 100644 --- a/src/TortoiseProc/RevertDlg.cpp +++ b/src/TortoiseProc/RevertDlg.cpp @@ -93,7 +93,7 @@ BOOL CRevertDlg::OnInitDialog() InterlockedExchange(&m_bThreadRunning, TRUE); if (AfxBeginThread(RevertThreadEntry, this) == nullptr) { - InterlockedExchange(&m_bThreadRunning, TFALSE); + InterlockedExchange(&m_bThreadRunning, FALSE); CMessageBox::Show(this->m_hWnd, IDS_ERR_THREADSTARTFAILED, IDS_APPNAME, MB_OK | MB_ICONERROR); } @@ -224,12 +224,11 @@ BOOL CRevertDlg::PreTranslateMessage(MSG* pMsg) break; case VK_F5: { - if (!m_bThreadRunning) + if (!InterlockedExchange(&m_bThreadRunning, TRUE)) { - InterlockedExchange(&m_bThreadRunning, TRUE); if (AfxBeginThread(RevertThreadEntry, this) == nullptr) { - InterlockedExchange(&m_bThreadRunning, FALSE); + InterlockedExchange(&m_bThreadRunning, FALSE); CMessageBox::Show(this->m_hWnd, IDS_ERR_THREADSTARTFAILED, IDS_APPNAME, MB_OK | MB_ICONERROR); } } @@ -243,7 +242,8 @@ BOOL CRevertDlg::PreTranslateMessage(MSG* pMsg) LRESULT CRevertDlg::OnSVNStatusListCtrlNeedsRefresh(WPARAM, LPARAM) { - InterlockedExchange(&m_bThreadRunning, TRUE); + if (InterlockedExchange(&m_bThreadRunning, TRUE)) + return 0; if (AfxBeginThread(RevertThreadEntry, this) == nullptr) { InterlockedExchange(&m_bThreadRunning, FALSE); diff --git a/src/TortoiseProc/SyncDlg.cpp b/src/TortoiseProc/SyncDlg.cpp index 00257fa6c..6e4a3ec4d 100644 --- a/src/TortoiseProc/SyncDlg.cpp +++ b/src/TortoiseProc/SyncDlg.cpp @@ -1870,7 +1870,8 @@ void CSyncDlg::OnEnscrollLog() void CSyncDlg::StartWorkerThread() { - InterlockedExchange(&m_bBlock, TRUE); + if (InterlockedExchange(&m_bBlock, TRUE)) + return; m_pThread = AfxBeginThread(ProgressThreadEntry, this, THREAD_PRIORITY_NORMAL); if (!m_pThread) -- 2.11.4.GIT