From 1ff4f156ab5f5a826d5a01621d2441cdeba07bca Mon Sep 17 00:00:00 2001 From: Markus Mertama Date: Wed, 3 Apr 2024 11:16:16 +0300 Subject: [PATCH] Regression fixes after 1.3.6 open rewrote --- gempyrelib/CMakeLists.txt | 2 +- gempyrelib/src/core.cpp | 2 +- gempyrelib/src/gempyre_internal.cpp | 30 +++++++++++++++---------- gempyrelib/src/gempyre_internal.h | 6 ++++- gempyrelib/src/server.h | 1 + gempyrelib/src/uwebsockets/server.cpp | 6 ++++- gempyrelib/src/uwebsockets/uws_server.h | 1 + 7 files changed, 32 insertions(+), 16 deletions(-) diff --git a/gempyrelib/CMakeLists.txt b/gempyrelib/CMakeLists.txt index 96c65fa1..dbb1789d 100644 --- a/gempyrelib/CMakeLists.txt +++ b/gempyrelib/CMakeLists.txt @@ -1,7 +1,7 @@ #cmake_minimum_required (VERSION 3.18) -project (gempyre VERSION 1.3.6 LANGUAGES CXX C) +project (gempyre VERSION 1.3.7 LANGUAGES CXX C) # Must use GNUInstallDirs to install libraries into correct # locations on all platforms. include(GNUInstallDirs) diff --git a/gempyrelib/src/core.cpp b/gempyrelib/src/core.cpp index 49c3c2d5..e37746d3 100644 --- a/gempyrelib/src/core.cpp +++ b/gempyrelib/src/core.cpp @@ -520,6 +520,6 @@ void Ui::flush() { } bool Ui::ui_available() const { - return m_ui->is_connected() && m_ui->is_running(); + return m_ui->is_ui_available(); } diff --git a/gempyrelib/src/gempyre_internal.cpp b/gempyrelib/src/gempyre_internal.cpp index ba8a5e55..bad019db 100644 --- a/gempyrelib/src/gempyre_internal.cpp +++ b/gempyrelib/src/gempyre_internal.cpp @@ -284,11 +284,15 @@ GempyreInternal& Ui::ref() { //do nothing } else if(type == "ui_ready") { GempyreUtils::log(GempyreUtils::LogLevel::Debug, "UI ready request"); + const auto open_function = take_open(); add_request([open_function, this]() { - GempyreUtils::log(GempyreUtils::LogLevel::Debug, "call onOpen"); - open_function(); - //set_hold(false); + if(open_function) { + GempyreUtils::log(GempyreUtils::LogLevel::Debug, "calling onOpen"); + open_function(); + } else { + GempyreUtils::log(GempyreUtils::LogLevel::Debug, "missing onOpen"); + } shoot_requests(); return true; }); @@ -516,15 +520,15 @@ void GempyreInternal::eventLoop(bool is_main) { } - if(has_requests() && *this != State::RUNNING) { - GempyreUtils::log(GempyreUtils::LogLevel::Debug, "skip requestqueue", state_str()); - } - - if(!has_open() && !is_hold()) - shoot_requests(); + if( has_requests() && + *this == State::RUNNING && + !has_open() && + !is_hold()) { + shoot_requests(); + } if(has_requests()) { - GempyreUtils::log(GempyreUtils::LogLevel::Debug, "unfinished business", state_str(), is_connected()); + GempyreUtils::log(GempyreUtils::LogLevel::Debug, "unfinished business", state_str(), is_running()); } //if there are responses they must be handled @@ -552,8 +556,10 @@ void GempyreInternal::eventLoop(bool is_main) { } void GempyreInternal::shoot_requests() { + GempyreUtils::log(GempyreUtils::LogLevel::Debug, + "shoot_requests", has_requests(), "running", *this == State::RUNNING, "available", is_ui_available()); //shoot pending requests - while(has_requests() && *this == State::RUNNING && is_connected()) { + while(has_requests() && *this == State::RUNNING && is_ui_available()) { GempyreUtils::log(GempyreUtils::LogLevel::Debug_Trace, "do request"); auto topRequest = take_request(); if(!topRequest) // since "flush" can be called in another thread this can happen :-o @@ -606,7 +612,7 @@ void GempyreInternal::consume_events() { "has open:", has_open(), "State:", state_str(), "Connected", is_connected()); - continue; + //continue; } const auto element = m_elements.find(it.element); if(element != m_elements.end()) { diff --git a/gempyrelib/src/gempyre_internal.h b/gempyrelib/src/gempyre_internal.h index d30ecbc8..126f539d 100644 --- a/gempyrelib/src/gempyre_internal.h +++ b/gempyrelib/src/gempyre_internal.h @@ -194,6 +194,10 @@ class GempyreInternal { return has_server() && m_server->isRunning(); } + bool is_ui_available() const { + return is_connected() && is_running() && m_server->isUiReady(); + } + void add_handler(const std::string& id, const std::string& name, const Element::SubscribeFunction& handler) { HandlerFunction hf = [handler](const Event& event) { @@ -405,7 +409,7 @@ class GempyreInternal { std::function take_open() { GEM_DEBUG("Take open"); - const auto fptr = std::move(m_onOpen); + const auto fptr = m_onOpen; m_onOpen = nullptr; return fptr; } diff --git a/gempyrelib/src/server.h b/gempyrelib/src/server.h index 80dd8d9a..0da62c55 100644 --- a/gempyrelib/src/server.h +++ b/gempyrelib/src/server.h @@ -62,6 +62,7 @@ class Server { virtual bool isJoinable() const = 0; virtual bool isRunning() const = 0; virtual bool isConnected() const = 0; + virtual bool isUiReady() const = 0; int queryId() const {return ++m_queryId;} unsigned int port() const {return m_port;} diff --git a/gempyrelib/src/uwebsockets/server.cpp b/gempyrelib/src/uwebsockets/server.cpp index 4fc9b408..ec98c5da 100644 --- a/gempyrelib/src/uwebsockets/server.cpp +++ b/gempyrelib/src/uwebsockets/server.cpp @@ -358,7 +358,11 @@ bool Uws_Server::retryStart() { } bool Uws_Server::isConnected() const { - return !m_broadcaster->empty() /*&& m_uiready*/; // why was this - + return !m_broadcaster->empty(); +} + +bool Uws_Server::isUiReady() const { + return m_uiready; } bool Uws_Server::beginBatch() { diff --git a/gempyrelib/src/uwebsockets/uws_server.h b/gempyrelib/src/uwebsockets/uws_server.h index 85e462f3..3bacb2ba 100644 --- a/gempyrelib/src/uwebsockets/uws_server.h +++ b/gempyrelib/src/uwebsockets/uws_server.h @@ -34,6 +34,7 @@ class Uws_Server : public Server { // joinable does not mean it is running, and not running does not mean it soon wont :-) bool isConnected() const override; + bool isUiReady() const override; bool retryStart() override; void close(bool wait = false) override; bool send(Server::TargetSocket target, Server::Value&& value) override;