mirror of
https://github.com/mudita/MuditaOS.git
synced 2026-04-18 22:18:38 -04:00
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.
42 lines
1.1 KiB
C++
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
|