From 7266f5ae68a0c9a63c7b99a85adc464906696449 Mon Sep 17 00:00:00 2001 From: rdb Date: Thu, 23 Jun 2016 22:56:18 +0200 Subject: [PATCH] Fix race condition when multiple threads write to MultiplexStream simultaneously --- panda/src/downloader/multiplexStreamBuf.cxx | 18 +++++------------- panda/src/downloader/multiplexStreamBuf.h | 2 ++ 2 files changed, 7 insertions(+), 13 deletions(-) diff --git a/panda/src/downloader/multiplexStreamBuf.cxx b/panda/src/downloader/multiplexStreamBuf.cxx index e78eb1d838..daa2d78ed9 100644 --- a/panda/src/downloader/multiplexStreamBuf.cxx +++ b/panda/src/downloader/multiplexStreamBuf.cxx @@ -12,6 +12,7 @@ */ #include "multiplexStreamBuf.h" +#include "lightMutexHolder.h" #if defined(WIN32_VC) || defined(WIN64_VC) #define WINDOWS_LEAN_AND_MEAN @@ -113,10 +114,8 @@ void MultiplexStreamBuf:: add_output(MultiplexStreamBuf::BufferType buffer_type, MultiplexStreamBuf::OutputType output_type, ostream *out, FILE *fout, bool owns_obj) { -#ifdef OLD_HAVE_IPC // Ensure that we have the mutex while we fiddle with the list of outputs. - mutex_lock m(_lock); -#endif + LightMutexHolder holder(_lock); Output o; o._buffer_type = buffer_type; @@ -133,9 +132,7 @@ add_output(MultiplexStreamBuf::BufferType buffer_type, */ void MultiplexStreamBuf:: flush() { -#ifdef OLD_HAVE_IPC - mutex_lock m(_lock); -#endif + LightMutexHolder holder(_lock); write_chars("", 0, true); } @@ -146,9 +143,7 @@ flush() { */ int MultiplexStreamBuf:: overflow(int ch) { -#ifdef OLD_HAVE_IPC - mutex_lock m(_lock); -#endif + LightMutexHolder holder(_lock); streamsize n = pptr() - pbase(); @@ -172,9 +167,7 @@ overflow(int ch) { */ int MultiplexStreamBuf:: sync() { -#ifdef OLD_HAVE_IPC - mutex_lock m(_lock); -#endif + LightMutexHolder holder(_lock); streamsize n = pptr() - pbase(); @@ -242,5 +235,4 @@ write_chars(const char *start, int length, bool flush) { break; } } - } diff --git a/panda/src/downloader/multiplexStreamBuf.h b/panda/src/downloader/multiplexStreamBuf.h index e2d0f589b5..52a75c5ff9 100644 --- a/panda/src/downloader/multiplexStreamBuf.h +++ b/panda/src/downloader/multiplexStreamBuf.h @@ -17,6 +17,7 @@ #include "pandabase.h" #include "pvector.h" +#include "lightMutex.h" #include /** @@ -69,6 +70,7 @@ private: typedef pvector Outputs; Outputs _outputs; + LightMutex _lock; string _line_buffer; };