CMake/Source/cmServerConnection.h
Tobias Hunger 68277e16c4 server-mode: Improve shutdown behavior
Add a signal handler to trigger shutdown and be more paranoid about
libuv doing things asynchronously.  This should fix test cases not
shutting down properly.
2016-10-04 09:15:32 -04:00

96 lines
1.9 KiB
C++

/* Distributed under the OSI-approved BSD 3-Clause License. See accompanying
file Copyright.txt or https://cmake.org/licensing for details. */
#pragma once
#include <string>
#include <vector>
#if defined(CMAKE_BUILD_WITH_CMAKE)
#include "cm_uv.h"
#endif
class cmServer;
class cmFileMonitor;
class LoopGuard;
class cmServerConnection
{
public:
cmServerConnection();
virtual ~cmServerConnection();
void SetServer(cmServer* s);
bool ProcessEvents(std::string* errorMessage);
void ReadData(const std::string& data);
void TriggerShutdown();
void WriteData(const std::string& data);
void ProcessNextRequest();
virtual void Connect(uv_stream_t* server) { (void)(server); }
cmFileMonitor* FileMonitor() const { return this->mFileMonitor; }
protected:
virtual bool DoSetup(std::string* errorMessage) = 0;
virtual void TearDown() = 0;
void SendGreetings();
uv_loop_t* Loop() const { return mLoop; }
protected:
std::string RawReadBuffer;
std::string RequestBuffer;
uv_stream_t* ReadStream = nullptr;
uv_stream_t* WriteStream = nullptr;
private:
uv_loop_t* mLoop = nullptr;
cmFileMonitor* mFileMonitor = nullptr;
cmServer* Server = nullptr;
uv_signal_t* SIGINTHandler = nullptr;
uv_signal_t* SIGHUPHandler = nullptr;
friend class LoopGuard;
};
class cmServerStdIoConnection : public cmServerConnection
{
public:
cmServerStdIoConnection();
bool DoSetup(std::string* errorMessage) override;
void TearDown() override;
private:
typedef union
{
uv_tty_t* tty;
uv_pipe_t* pipe;
} InOutUnion;
bool usesTty = false;
InOutUnion Input;
InOutUnion Output;
};
class cmServerPipeConnection : public cmServerConnection
{
public:
cmServerPipeConnection(const std::string& name);
bool DoSetup(std::string* errorMessage) override;
void TearDown() override;
void Connect(uv_stream_t* server) override;
private:
const std::string PipeName;
uv_pipe_t* ServerPipe = nullptr;
uv_pipe_t* ClientPipe = nullptr;
};