Skip to content

Commit

Permalink
Properly cleanup shadow server when listener is stopped
Browse files Browse the repository at this point in the history
  • Loading branch information
Sri Ramanujam authored and SriRamanujam committed Dec 1, 2017
1 parent e517852 commit 99b8fc7
Show file tree
Hide file tree
Showing 2 changed files with 36 additions and 7 deletions.
9 changes: 7 additions & 2 deletions include/rdp/RDPListener.h
Original file line number Diff line number Diff line change
Expand Up @@ -152,6 +152,11 @@ class RDPListener
*/
std::string CredentialPath();

/**
* @brief Shutdown and unregister the listener.
*/
void shutdown();

/**
* @brief The freerdp_listener struct this object manages.
*
Expand Down Expand Up @@ -247,11 +252,11 @@ class RDPListener
/**
* @brief Mutex guarding stop.
*/
std::mutex stopMutex;
std::mutex listenerStopMutex;
/**
* @brief Flag to be set when the listener needs to clean up and exit.
*/
bool stop;
bool listener_running;
/**
* @brief DBus id.
*/
Expand Down
34 changes: 29 additions & 5 deletions src/rdp/RDPListener.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -48,11 +48,11 @@ RDPListener::RDPListener(std::string uuid, int vm_id, uint16_t port, RDPServerWo
uuid(uuid),
samfile(),
vm_id(vm_id),
listener_running(false),
targetFPS(30),
credential_path()
{
WTSRegisterWtsApiFunctionTable(FreeRDP_InitWtsApi());
stop = false;

shadow_subsystem_set_entry(RDPMux_ShadowSubsystemEntry);
server = shadow_server_new();
Expand All @@ -68,9 +68,15 @@ RDPListener::RDPListener(std::string uuid, int vm_id, uint16_t port, RDPServerWo

RDPListener::~RDPListener()
{
shadow_server_stop(server);
dbus_conn->unregister_object(registered_id);
{
std::lock_guard<std::mutex> lock(listenerStopMutex);
if (listener_running) {
shadow_server_stop(server);
}
listener_running = false;
}
shadow_server_free(server);
dbus_conn->unregister_object(registered_id);
WSACleanup();
}

Expand Down Expand Up @@ -121,6 +127,11 @@ void RDPListener::RunServer()
goto cleanup;
}

{
std::lock_guard<std::mutex> lock(listenerStopMutex);
listener_running = true;
}

WaitForSingleObject(this->server->thread, INFINITE);

if (!GetExitCodeThread(this->server->thread, &exitCode)) {
Expand All @@ -131,9 +142,22 @@ void RDPListener::RunServer()

VLOG(1) << "LISTENER " << this << ": Main loop exited, exit code " << status;
cleanup:
parent->UnregisterVM(this->uuid, this->port); // this will trigger destruction of the RDPListener object.
shutdown(); // this will trigger destruction of the RDPListener object.
}

void RDPListener::shutdown()
{
{
std::lock_guard<std::mutex> lock(listenerStopMutex);
if (listener_running) {
shadow_server_stop(this->server);
}
listener_running = false;
}
parent->UnregisterVM(this->uuid, this->port);
}


void RDPListener::processOutgoingMessage(std::vector<uint16_t> vec)
{
QueueItem item = std::make_tuple(vec, this->uuid);
Expand All @@ -150,7 +174,7 @@ void RDPListener::processIncomingMessage(std::vector<uint32_t> rvec)
processDisplaySwitch(rvec);
} else if (rvec[0] == SHUTDOWN) {
VLOG(2) << "LISTENER " << this << ": Shutdown event received!";
parent->UnregisterVM(this->uuid, this->port);
shutdown();
} else {
// what the hell have you sent me
LOG(WARNING) << "Invalid message type sent.";
Expand Down

0 comments on commit 99b8fc7

Please sign in to comment.