diff --git a/src/discord_rpc.cpp b/src/discord_rpc.cpp index 32682b3..0392453 100644 --- a/src/discord_rpc.cpp +++ b/src/discord_rpc.cpp @@ -54,6 +54,7 @@ static std::atomic_bool WasJustDisconnected{false}; static std::atomic_bool GotErrorMessage{false}; static std::atomic_bool WasJoinGame{false}; static std::atomic_bool WasSpectateGame{false}; +static std::atomic_bool UpdatePresence{false}; static char JoinGameSecret[256]; static char SpectateGameSecret[256]; static int LastErrorCode{0}; @@ -62,7 +63,6 @@ static int LastDisconnectErrorCode{0}; static char LastDisconnectErrorMessage[256]; static std::mutex PresenceMutex; static std::mutex HandlerMutex; -static QueuedMessage CurrentPresence{}; static QueuedMessage QueuedPresence{}; static MsgQueue SendQueue; static MsgQueue JoinAskQueue; @@ -215,17 +215,17 @@ static void Discord_UpdateConnection(void) } // writes - if (QueuedPresence.length) { + if (UpdatePresence.exchange(false) && QueuedPresence.length) { QueuedMessage local; { std::lock_guard guard(PresenceMutex); local.Copy(QueuedPresence); - QueuedPresence.length = 0; } if (!Connection->Write(local.buffer, local.length)) { // if we fail to send, requeue std::lock_guard guard(PresenceMutex); QueuedPresence.Copy(local); + UpdatePresence.exchange(true); } } @@ -311,8 +311,8 @@ extern "C" DISCORD_EXPORT void Discord_Initialize(const char* applicationId, Connection = RpcConnection::Create(applicationId); Connection->onConnect = [](JsonDocument& readyMessage) { Discord_UpdateHandlers(&QueuedHandlers); - if (CurrentPresence.length > 0) { - QueuedPresence.Copy(CurrentPresence); + if (QueuedPresence.length > 0) { + UpdatePresence.exchange(true); SignalIOActivity(); } auto data = GetObjMember(&readyMessage, "data"); @@ -355,8 +355,8 @@ extern "C" DISCORD_EXPORT void Discord_Shutdown(void) Connection->onConnect = nullptr; Connection->onDisconnect = nullptr; Handlers = {}; - CurrentPresence.length = 0; QueuedPresence.length = 0; + UpdatePresence.exchange(false); if (IoThread != nullptr) { IoThread->Stop(); delete IoThread; @@ -372,12 +372,7 @@ extern "C" DISCORD_EXPORT void Discord_UpdatePresence(const DiscordRichPresence* std::lock_guard guard(PresenceMutex); QueuedPresence.length = JsonWriteRichPresenceObj( QueuedPresence.buffer, sizeof(QueuedPresence.buffer), Nonce++, Pid, presence); - } - if (presence) { - CurrentPresence.Copy(QueuedPresence); - } - else { - CurrentPresence.length = 0; + UpdatePresence.exchange(true); } SignalIOActivity(); }