Major bugfix in server

This commit is contained in:
AlexandreRouma
2022-01-22 02:30:08 +01:00
parent 34fc32dcf7
commit 4c1b50a3ac
10 changed files with 104 additions and 29 deletions

View File

@ -10,6 +10,7 @@
#include <options.h>
#include <gui/widgets/stepped_slider.h>
#include <utils/optionlist.h>
#include <gui/dialogs/dialog_box.h>
#define CONCAT(a, b) ((std::string(a) + b).c_str())
@ -142,6 +143,10 @@ private:
bool connected = (_this->client && _this->client->isOpen());
gui::mainWindow.playButtonLocked = !connected;
ImGui::GenericDialog("##sdrpp_srv_src_err_dialog", _this->serverBusy, GENERIC_DIALOG_BUTTONS_OK, [=](){
ImGui::Text("This server is already in use.");
});
if (connected) { style::beginDisabled(); }
if (ImGui::InputText(CONCAT("##sdrpp_srv_srv_host_", _this->name), _this->hostname, 1023)) {
config.acquire();
@ -166,6 +171,7 @@ private:
}
catch (std::exception e) {
spdlog::error("Could not connect to SDR: {0}", e.what());
if (!strcmp(e.what(), "Server busy")) { _this->serverBusy = true; }
}
}
else if (connected && ImGui::Button("Disconnect##sdrpp_srv_source", ImVec2(menuWidth, 0))) {
@ -238,6 +244,7 @@ private:
bool running = false;
double freq;
bool serverBusy = false;
float datarate = 0;
float frametimeCounter = 0;

View File

@ -35,11 +35,10 @@ namespace server {
// Start readers
client->readAsync(sizeof(PacketHeader), rbuffer, tcpHandler, this);
// Default configuration
stop();
// Ask for a UI
getUI();
int res = getUI();
if (res == -1) { throw std::runtime_error("Timed out"); }
else if (res == -2) { throw std::runtime_error("Server busy"); }
}
ClientClass::~ClientClass() {
@ -153,6 +152,23 @@ namespace server {
_this->currentSampleRate = *(double*)_this->r_cmd_data;
core::setInputSampleRate(_this->currentSampleRate);
}
else if (_this->r_cmd_hdr->cmd == COMMAND_DISCONNECT) {
spdlog::error("Asked to disconnect by the server");
_this->serverBusy = true;
// Cancel waiters
std::vector<PacketWaiter*> toBeRemoved;
for (auto& [waiter, cmd] : _this->commandAckWaiters) {
waiter->cancel();
toBeRemoved.push_back(waiter);
}
// Remove handled waiters
for (auto& waiter : toBeRemoved) {
_this->commandAckWaiters.erase(waiter);
delete waiter;
}
}
}
else if (_this->r_pkt_hdr->type == PACKET_TYPE_COMMAND_ACK) {
// Notify waiters
@ -184,7 +200,7 @@ namespace server {
_this->client->readAsync(sizeof(PacketHeader), _this->rbuffer, tcpHandler, _this);
}
void ClientClass::getUI() {
int ClientClass::getUI() {
auto waiter = awaitCommandAck(COMMAND_GET_UI);
sendCommand(COMMAND_GET_UI, 0);
if (waiter->await(PROTOCOL_TIMEOUT_MS)) {
@ -192,9 +208,12 @@ namespace server {
dl.load(r_cmd_data, r_pkt_hdr->size - sizeof(PacketHeader) - sizeof(CommandHeader));
}
else {
spdlog::error("Timeout out after asking for UI");
if (!serverBusy) { spdlog::error("Timeout out after asking for UI"); };
waiter->handled();
return serverBusy ? -2 : -1;
}
waiter->handled();
return 0;
}
void ClientClass::sendPacket(PacketType type, int len) {

View File

@ -23,7 +23,7 @@ namespace server {
public:
bool await(int timeout) {
std::unique_lock lck(readyMtx);
return readyCnd.wait_for(lck, std::chrono::milliseconds(timeout), [=](){ return dataReady; });
return readyCnd.wait_for(lck, std::chrono::milliseconds(timeout), [=](){ return dataReady || canceled; }) && !canceled;
}
void handled() {
@ -49,16 +49,23 @@ namespace server {
}
}
void cancel() {
canceled = true;
notify();
}
void reset() {
std::lock_guard lck1(readyMtx);
std::lock_guard lck2(handledMtx);
dataReady = false;
dataHandled = false;
canceled = false;
}
private:
bool dataReady = false;
bool dataHandled = false;
bool canceled = 0;
std::condition_variable readyCnd;
std::condition_variable handledCnd;
@ -86,11 +93,12 @@ namespace server {
bool isOpen();
int bytes = 0;
bool serverBusy = false;
private:
static void tcpHandler(int count, uint8_t* buf, void* ctx);
void getUI();
int getUI();
void sendPacket(PacketType type, int len);
void sendCommand(Command cmd, int len);