Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mpc-hc/LAVFilters.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/common
diff options
context:
space:
mode:
authorHendrik Leppkes <h.leppkes@gmail.com>2016-01-11 17:38:19 +0300
committerHendrik Leppkes <h.leppkes@gmail.com>2016-01-11 17:38:19 +0300
commit2f78882aaa91009459ae63df19337e58bc55d81b (patch)
tree0a75f887c54963323f9cf71de9b201341862920b /common
parentb40b411b714426727362808179f6a98042caa21d (diff)
More thread safety for log file handling
Diffstat (limited to 'common')
-rw-r--r--common/DSUtilLite/DShowUtil.cpp31
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