FreeRTOS handles were stored plainly and they were deleted in the destructor of classes. This meant that if a class were to be copied, the destructor would be called twice on the same handles and lead to double-free. Seha on Discord suggested to fix this by using `std::unique_ptr` with a custom deletion function. The changes affect: - Thread - Semaphore - Mutex - StreamBuffer - Timer - MessageQueue - EventFlag Thread changes: - Removal of the hack with the `Data` struct - Thread's main body is now just a private static function inside the class. - The C functions were relocated to static class members PubSub changes: - Refactored pubsub into class - Renamed files to `PubSub` instead of `Pubsub` - `PubSubSubscription` is now a private inner struct and `PubSub` only exposes `SubscriptionHandle` Lockable, ScopedLockable, Mutex: - Added `lock()` method that locks indefinitely - Remove deprecated `acquire()` and `release()` methods - Removed `TtWaitForever` in favour of `portMAX_DELAY`
51 lines
1.3 KiB
C++
51 lines
1.3 KiB
C++
#pragma once
|
|
|
|
#include "RtosCompatEventGroups.h"
|
|
#include <memory>
|
|
|
|
namespace tt {
|
|
|
|
/**
|
|
* Wrapper for FreeRTOS xEventGroup.
|
|
*/
|
|
class EventFlag {
|
|
private:
|
|
|
|
struct EventGroupHandleDeleter {
|
|
void operator()(EventGroupHandle_t handleToDelete) {
|
|
vEventGroupDelete(handleToDelete);
|
|
}
|
|
};
|
|
|
|
std::unique_ptr<std::remove_pointer_t<EventGroupHandle_t>, EventGroupHandleDeleter> handle;
|
|
|
|
public:
|
|
|
|
EventFlag();
|
|
~EventFlag();
|
|
|
|
enum Flag {
|
|
WaitAny = 0x00000000U, ///< Wait for any flag (default).
|
|
WaitAll = 0x00000001U, ///< Wait for all flags.
|
|
NoClear = 0x00000002U, ///< Do not clear flags which have been specified to wait for.
|
|
|
|
Error = 0x80000000U, ///< Error indicator.
|
|
ErrorUnknown = 0xFFFFFFFFU, ///< TtStatusError (-1).
|
|
ErrorTimeout = 0xFFFFFFFEU, ///< TtStatusErrorTimeout (-2).
|
|
ErrorResource = 0xFFFFFFFDU, ///< TtStatusErrorResource (-3).
|
|
ErrorParameter = 0xFFFFFFFCU, ///< TtStatusErrorParameter (-4).
|
|
ErrorISR = 0xFFFFFFFAU, ///< TtStatusErrorISR (-6).
|
|
};
|
|
|
|
uint32_t set(uint32_t flags) const;
|
|
uint32_t clear(uint32_t flags) const;
|
|
uint32_t get() const;
|
|
uint32_t wait(
|
|
uint32_t flags,
|
|
uint32_t options = WaitAny,
|
|
uint32_t timeout = portMAX_DELAY
|
|
) const;
|
|
};
|
|
|
|
} // namespace
|