diff options
author | ouwou <26526779+ouwou@users.noreply.github.com> | 2020-10-05 21:37:07 -0400 |
---|---|---|
committer | ouwou <26526779+ouwou@users.noreply.github.com> | 2020-10-05 21:37:07 -0400 |
commit | 0cdaea97dd035bcbf9d46b8a261b3eeaf4dea69c (patch) | |
tree | c340566dbccc77d2d3cb21b1290e01e5c1c0d9c4 /discord | |
parent | cfcb0d4e662b960dcdd331a7c61dc2b9c614f930 (diff) | |
download | abaddon-portaudio-0cdaea97dd035bcbf9d46b8a261b3eeaf4dea69c.tar.gz abaddon-portaudio-0cdaea97dd035bcbf9d46b8a261b3eeaf4dea69c.zip |
slap a bunch of shit everywhere until the crashing stops
Diffstat (limited to 'discord')
-rw-r--r-- | discord/discord.cpp | 16 | ||||
-rw-r--r-- | discord/discord.hpp | 7 | ||||
-rw-r--r-- | discord/http.cpp | 16 | ||||
-rw-r--r-- | discord/http.hpp | 16 |
4 files changed, 44 insertions, 11 deletions
diff --git a/discord/discord.cpp b/discord/discord.cpp index 4d43486..79f2886 100644 --- a/discord/discord.cpp +++ b/discord/discord.cpp @@ -5,6 +5,9 @@ DiscordClient::DiscordClient() : m_http(DiscordAPI) , m_decompress_buf(InflateChunkSize) { + + m_msg_dispatch.connect(sigc::mem_fun(*this, &DiscordClient::MessageDispatch)); + LoadEventMap(); } @@ -396,7 +399,10 @@ void DiscordClient::HandleGatewayMessageRaw(std::string str) { if (err != Z_OK) { fprintf(stderr, "Error decompressing input buffer %d (%d/%d)\n", err, m_zstream.avail_in, m_zstream.avail_out); } else { - HandleGatewayMessage(std::string(m_decompress_buf.begin(), m_decompress_buf.begin() + m_zstream.total_out)); + m_msg_mutex.lock(); + m_msg_queue.push(std::string(m_decompress_buf.begin(), m_decompress_buf.begin() + m_zstream.total_out)); + m_msg_dispatch.emit(); + m_msg_mutex.unlock(); if (m_decompress_buf.size() > InflateChunkSize) m_decompress_buf.resize(InflateChunkSize); } @@ -407,6 +413,14 @@ void DiscordClient::HandleGatewayMessageRaw(std::string str) { m_compressed_buf.clear(); } +void DiscordClient::MessageDispatch() { + m_msg_mutex.lock(); + auto msg = m_msg_queue.front(); + m_msg_queue.pop(); + m_msg_mutex.unlock(); + HandleGatewayMessage(msg); +} + void DiscordClient::HandleGatewayMessage(std::string str) { GatewayMessage m; try { diff --git a/discord/discord.hpp b/discord/discord.hpp index 025d969..47486fb 100644 --- a/discord/discord.hpp +++ b/discord/discord.hpp @@ -11,6 +11,8 @@ #include <unordered_set> #include <mutex> #include <zlib.h> +#include <glibmm.h> +#include <queue> // bruh #ifdef GetMessage @@ -147,6 +149,11 @@ private: HeartbeatWaiter m_heartbeat_waiter; std::atomic<bool> m_heartbeat_acked = true; + mutable std::mutex m_msg_mutex; + Glib::Dispatcher m_msg_dispatch; + std::queue<std::string> m_msg_queue; + void MessageDispatch(); + // signals public: typedef sigc::signal<void> type_signal_gateway_ready; diff --git a/discord/http.cpp b/discord/http.cpp index b4a0f4b..4c9cf87 100644 --- a/discord/http.cpp +++ b/discord/http.cpp @@ -2,7 +2,9 @@ //#define USE_LOCAL_PROXY HTTPClient::HTTPClient(std::string api_base) - : m_api_base(api_base) {} + : m_api_base(api_base) { + m_dispatcher.connect(sigc::mem_fun(*this, &HTTPClient::RunCallbacks)); +} void HTTPClient::SetAuth(std::string auth) { m_authorization = auth; @@ -98,10 +100,20 @@ void HTTPClient::CleanupFutures() { } } +void HTTPClient::RunCallbacks() { + m_mutex.lock(); + m_queue.front()(); + m_queue.pop(); + m_mutex.unlock(); +} + void HTTPClient::OnResponse(cpr::Response r, std::function<void(cpr::Response r)> cb) { CleanupFutures(); try { - cb(r); + m_mutex.lock(); + m_queue.push([this, r, cb] { cb(r); }); + m_dispatcher.emit(); + m_mutex.unlock(); } catch (std::exception &e) { fprintf(stderr, "error handling response (%s, code %d): %s\n", r.url.c_str(), r.status_code, e.what()); } diff --git a/discord/http.hpp b/discord/http.hpp index b8489f9..12667f7 100644 --- a/discord/http.hpp +++ b/discord/http.hpp @@ -5,14 +5,9 @@ #include <string> #include <unordered_map> #include <memory> - -template<typename F> -void fire_and_forget(F &&func) { - auto ptr = std::make_shared<std::future<void>>(); - *ptr = std::async(std::launch::async, [ptr, func]() { - func(); - }); -} +#include <mutex> +#include <queue> +#include <glibmm.h> class HTTPClient { public: @@ -28,6 +23,11 @@ private: void OnResponse(cpr::Response r, std::function<void(cpr::Response r)> cb); void CleanupFutures(); + mutable std::mutex m_mutex; + Glib::Dispatcher m_dispatcher; + std::queue<std::function<void()>> m_queue; + void RunCallbacks(); + std::vector<std::future<void>> m_futures; std::string m_api_base; std::string m_authorization; |