Files
MuditaOS/module-services/service-gui/DrawCommandsQueue.hpp
Dawid Wojtas 8c2b5aa7b0 [BH-1624] Fix shutdown procedure
In some cases, the system wasn't able to turn off
because the GUI service got stuck. The device
was still working in the background. The cause
was an empty queue in DrawCommandQueue which
hang the GUI worker.

The interface was modified and synchronization
mechanism was removed.
The thread no longer waits in dequeue().

Also changed the worker to close in the right
way the logger worker.
2023-03-06 21:47:11 +01:00

42 lines
1.1 KiB
C++

// Copyright (c) 2017-2023, Mudita Sp. z.o.o. All rights reserved.
// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md
#pragma once
#include <gui/core/DrawCommand.hpp>
#include <mutex.hpp>
#include <cstdint>
#include <list>
#include <memory>
#include <vector>
namespace service::gui
{
class DrawCommandsQueue
{
public:
using CommandList = std::list<std::unique_ptr<::gui::DrawCommand>>;
struct QueueItem
{
CommandList commands;
::gui::RefreshModes refreshMode = ::gui::RefreshModes::GUI_REFRESH_FAST;
};
using QueueContainer = std::vector<QueueItem>;
explicit DrawCommandsQueue(std::size_t expectedSize);
void enqueue(QueueItem &&item);
auto stop() -> void;
[[nodiscard]] auto dequeue() -> std::optional<QueueItem>;
[[nodiscard]] auto getMaxRefreshModeAndClear() -> ::gui::RefreshModes;
void clear();
[[nodiscard]] auto size() const noexcept -> QueueContainer::size_type;
private:
QueueContainer queue;
mutable cpp_freertos::MutexStandard queueMutex;
};
} // namespace service::gui