FreeRTOScpp
|
Read/Write Lock control. More...
#include <ReadWrite.h>
Public Member Functions | |
ReadWriteLock () | |
~ReadWriteLock () | |
bool | give () override |
bool | give () override |
bool | readLock (TickType_t wait=portMAX_DELAY) |
ReadLock. More... | |
bool | readLock (Time_ms delay_ms) |
bool | readUnlock () |
Remove our lock. More... | |
bool | releaseReserved () |
If we have a reserved lock, down grade to just a read lock. More... | |
bool | requestReserved () |
Task with a Read Lock request upgrade to a reserved lock. More... | |
bool | reservedLock (TickType_t wait=portMAX_DELAY) |
Get an upgradable Read Lock. More... | |
bool | reservedLock (Time_ms delay_ms) |
Reader & | rlock () |
Get Read Lockable. More... | |
bool | take (TickType_t wait) override |
bool | take (Time_ms ms) |
bool | take (Time_ms ms) |
bool | take (TickType_t wait) override |
Writer & | wlock () |
Get Write Lockable. More... | |
bool | writeLock (TickType_t wait=portMAX_DELAY) |
Take the write lock, requires readCount to be 0, or 1 if we reserved the upgrade. More... | |
bool | writeLock (Time_ms delay_ms) |
bool | writeUnlock () |
Release the write lock. More... | |
Protected Attributes | |
EventGroup | event |
int | readCount = 0 |
Count of Read Locks. More... | |
TaskHandle_t | reserved = nullptr |
Reserved Lock indicator. More... | |
int | writeReq = -1 |
Write Request Pending Priority. More... | |
Read/Write Lock control.
States:
FreeRTOScpp::ReadWriteLock::ReadWriteLock | ( | ) |
FreeRTOScpp::ReadWriteLock::~ReadWriteLock | ( | ) |
|
overridevirtualinherited |
Implements FreeRTOScpp::Lockable.
Referenced by FreeRTOScpp::Reader::Reader(), and FreeRTOScpp::Writer::Writer().
|
overridevirtualinherited |
Implements FreeRTOScpp::Lockable.
bool FreeRTOScpp::ReadWriteLock::readLock | ( | TickType_t | wait = portMAX_DELAY | ) |
ReadLock.
Get a read lock.
wait | The maximum number of ticks to wait to get the lock |
Algorithm:
|
inline |
References FreeRTOScpp::ms2ticks(), and readLock().
Referenced by readLock().
bool FreeRTOScpp::ReadWriteLock::readUnlock | ( | ) |
Remove our lock.
If we reserved the upgrade, release that.
bool FreeRTOScpp::ReadWriteLock::releaseReserved | ( | ) |
If we have a reserved lock, down grade to just a read lock.
bool FreeRTOScpp::ReadWriteLock::requestReserved | ( | ) |
Task with a Read Lock request upgrade to a reserved lock.
If no reservation current, will be granted, if reservation present, will be rejected.
Does not check if this task has a read lock, but that is assumed.
bool FreeRTOScpp::ReadWriteLock::reservedLock | ( | TickType_t | wait = portMAX_DELAY | ) |
Get an upgradable Read Lock.
like readLock, but add reserved == nullptr to the conditions. On success will set reserved to our task handle.
Only one task can reserve this, as if two are in this state they will deadlock when they both try to upgrade
|
inline |
References FreeRTOScpp::ms2ticks(), and reservedLock().
Referenced by reservedLock().
|
inline |
Get Read Lockable.
|
overridevirtualinherited |
Implements FreeRTOScpp::Lockable.
Referenced by FreeRTOScpp::Reader::Reader(), and FreeRTOScpp::Writer::Writer().
|
inlineinherited |
References FreeRTOScpp::Lockable::give(), FreeRTOScpp::Lockable::Lockable(), FreeRTOScpp::ms2ticks(), FreeRTOScpp::Lockable::operator=(), and FreeRTOScpp::Lockable::take().
Referenced by FreeRTOScpp::Lockable::take().
|
inlineinherited |
References FreeRTOScpp::Lockable::give(), FreeRTOScpp::Lockable::Lockable(), FreeRTOScpp::ms2ticks(), FreeRTOScpp::Lockable::operator=(), and FreeRTOScpp::Lockable::take().
Referenced by FreeRTOScpp::Lockable::take().
|
overridevirtualinherited |
Implements FreeRTOScpp::Lockable.
|
inline |
Get Write Lockable.
bool FreeRTOScpp::ReadWriteLock::writeLock | ( | TickType_t | wait = portMAX_DELAY | ) |
Take the write lock, requires readCount to be 0, or 1 if we reserved the upgrade.
|
inline |
References FreeRTOScpp::ms2ticks(), and writeLock().
Referenced by writeLock().
bool FreeRTOScpp::ReadWriteLock::writeUnlock | ( | ) |
Release the write lock.
If we upgraded go back to a reserved lock which will need to be unlocked.
|
protected |
|
protected |
Count of Read Locks.
If 0, then lock is free if >0, lock is in read mode and is the count of the number of read locks granted if <0, loci is in write mode.
|
protected |
Reserved Lock indicator.
If nullptr, then no reservedLock are currently in existence, so a reservedLock can be granted
Else, TaskHandle of the task that has reserved the right to upgrade to a write lock.
|
protected |
Write Request Pending Priority.
If in Read mode, and a task with priority below writeReq