summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJustin Berger <j.david.berger@gmail.com>2017-07-22 15:29:18 (GMT)
committerBrad King <brad.king@kitware.com>2017-08-31 19:35:46 (GMT)
commit0e4d503384a254c843a065c26f77bc19dfccff16 (patch)
treed37dcc0050435080a9704030d9e6938d7ea708bf
parent124424e9974ade26521bf4751f3701c1e7d91c3d (diff)
downloadCMake-0e4d503384a254c843a065c26f77bc19dfccff16.zip
CMake-0e4d503384a254c843a065c26f77bc19dfccff16.tar.gz
CMake-0e4d503384a254c843a065c26f77bc19dfccff16.tar.bz2
server: Added thread check to protect writedata
-rw-r--r--Source/cmConnection.cxx6
-rw-r--r--Source/cmServer.cxx6
-rw-r--r--Source/cmServer.h9
3 files changed, 21 insertions, 0 deletions
diff --git a/Source/cmConnection.cxx b/Source/cmConnection.cxx
index c0d1b82..f482412 100644
--- a/Source/cmConnection.cxx
+++ b/Source/cmConnection.cxx
@@ -69,6 +69,12 @@ bool cmEventBasedConnection::IsOpen() const
void cmEventBasedConnection::WriteData(const std::string& _data)
{
+#ifndef NDEBUG
+ auto curr_thread_id = uv_thread_self();
+ assert(this->Server);
+ assert(uv_thread_equal(&curr_thread_id, &this->Server->ServeThreadId));
+#endif
+
auto data = _data;
assert(this->WriteStream);
if (BufferStrategy) {
diff --git a/Source/cmServer.cxx b/Source/cmServer.cxx
index b1b4020..30d0f51 100644
--- a/Source/cmServer.cxx
+++ b/Source/cmServer.cxx
@@ -436,6 +436,12 @@ bool cmServerBase::StartServeThread()
bool cmServerBase::Serve(std::string* errorMessage)
{
+#ifndef NDEBUG
+ uv_thread_t blank_thread_t = {};
+ assert(uv_thread_equal(&blank_thread_t, &ServeThreadId));
+ ServeThreadId = uv_thread_self();
+#endif
+
errorMessage->clear();
uv_signal_init(&Loop, &this->SIGINTHandler);
diff --git a/Source/cmServer.h b/Source/cmServer.h
index d8f73c1..15fd2ba 100644
--- a/Source/cmServer.h
+++ b/Source/cmServer.h
@@ -67,6 +67,15 @@ protected:
bool ServeThreadRunning = false;
uv_thread_t ServeThread;
uv_async_t ShutdownSignal;
+#ifndef NDEBUG
+public:
+ // When the server starts it will mark down it's current thread ID,
+ // which is useful in other contexts to just assert that operations
+ // are performed on that same thread.
+ uv_thread_t ServeThreadId = {};
+
+protected:
+#endif
uv_loop_t Loop;