diff options
author | Hendrik Leppkes <h.leppkes@gmail.com> | 2016-01-11 17:38:19 +0300 |
---|---|---|
committer | Hendrik Leppkes <h.leppkes@gmail.com> | 2016-01-11 17:38:19 +0300 |
commit | 2f78882aaa91009459ae63df19337e58bc55d81b (patch) | |
tree | 0a75f887c54963323f9cf71de9b201341862920b /common | |
parent | b40b411b714426727362808179f6a98042caa21d (diff) |
More thread safety for log file handling
Diffstat (limited to 'common')
-rw-r--r-- | common/DSUtilLite/DShowUtil.cpp | 31 |
1 files changed, 14 insertions, 17 deletions
diff --git a/common/DSUtilLite/DShowUtil.cpp b/common/DSUtilLite/DShowUtil.cpp index 08337225..ff5377c8 100644 --- a/common/DSUtilLite/DShowUtil.cpp +++ b/common/DSUtilLite/DShowUtil.cpp @@ -67,25 +67,24 @@ volatile LONG hOutputCounter = 0; extern HRESULT DbgUniqueProcessName(LPCTSTR inName, LPTSTR outName); void DbgSetLogFile(LPCTSTR szFile) { - if (m_hOutput != INVALID_HANDLE_VALUE) { - CloseHandle (m_hOutput); - m_hOutput = INVALID_HANDLE_VALUE; - } + HANDLE hOutput = CreateFile(szFile, GENERIC_WRITE, FILE_SHARE_READ, nullptr, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, nullptr); - m_hOutput = CreateFile(szFile, GENERIC_WRITE, FILE_SHARE_READ, nullptr, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, nullptr); - - if (INVALID_HANDLE_VALUE == m_hOutput && + if (INVALID_HANDLE_VALUE == hOutput && GetLastError() == ERROR_SHARING_VIOLATION) { TCHAR uniqueName[MAX_PATH] = {0}; if (SUCCEEDED(DbgUniqueProcessName(szFile, uniqueName))) { - m_hOutput = CreateFile(uniqueName, GENERIC_WRITE, FILE_SHARE_READ, nullptr, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, nullptr); + hOutput = CreateFile(uniqueName, GENERIC_WRITE, FILE_SHARE_READ, nullptr, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, nullptr); } } - if (m_hOutput != INVALID_HANDLE_VALUE) - InterlockedIncrement(&hOutputCounter); + if (hOutput != INVALID_HANDLE_VALUE) { + if (InterlockedCompareExchangePointer(&m_hOutput, hOutput, INVALID_HANDLE_VALUE) != INVALID_HANDLE_VALUE) + CloseHandle(hOutput); + } + + InterlockedIncrement(&hOutputCounter); } void DbgSetLogFileDesktop(LPCTSTR szFile) @@ -98,13 +97,11 @@ void DbgSetLogFileDesktop(LPCTSTR szFile) void DbgCloseLogFile() { - if (m_hOutput != INVALID_HANDLE_VALUE) { - LONG count = InterlockedDecrement(&hOutputCounter); - if (count == 0) { - FlushFileBuffers(m_hOutput); - CloseHandle(m_hOutput); - m_hOutput = INVALID_HANDLE_VALUE; - } + LONG count = InterlockedDecrement(&hOutputCounter); + if (count == 0 && m_hOutput != INVALID_HANDLE_VALUE) { + FlushFileBuffers(m_hOutput); + CloseHandle(m_hOutput); + m_hOutput = INVALID_HANDLE_VALUE; } } #endif |