InterruptableSensorBase: Fix callback function deletion (#1807)

Save the callback function into a unique_ptr member instead.
This commit is contained in:
Thad House
2019-08-04 20:25:25 -07:00
committed by Peter Johnson
parent 810e58ea85
commit 6411bd79c6
3 changed files with 17 additions and 17 deletions

View File

@@ -17,25 +17,26 @@ using namespace frc;
InterruptableSensorBase::~InterruptableSensorBase() {
if (m_interrupt == HAL_kInvalidHandle) return;
int32_t status = 0;
auto param = HAL_CleanInterrupts(m_interrupt, &status);
if (param) {
delete reinterpret_cast<InterruptEventHandler*>(param);
}
HAL_CleanInterrupts(m_interrupt, &status);
// Ignore status, as an invalid handle just needs to be ignored.
m_interrupt = HAL_kInvalidHandle;
}
InterruptableSensorBase::InterruptableSensorBase(InterruptableSensorBase&& rhs)
: ErrorBase(std::move(rhs)),
m_interrupt(rhs.m_interrupt.exchange(HAL_kInvalidHandle)) {
m_interrupt(rhs.m_interrupt),
m_interruptHandler{std::move(rhs.m_interruptHandler)} {
rhs.m_interrupt = HAL_kInvalidHandle;
rhs.m_interruptHandler = nullptr;
}
InterruptableSensorBase& InterruptableSensorBase::operator=(
InterruptableSensorBase&& rhs) {
ErrorBase::operator=(std::move(rhs));
m_interrupt = rhs.m_interrupt.exchange(HAL_kInvalidHandle);
m_interrupt = rhs.m_interrupt;
m_interruptHandler = std::move(rhs.m_interruptHandler);
rhs.m_interrupt = HAL_kInvalidHandle;
rhs.m_interruptHandler = nullptr;
return *this;
}
@@ -65,7 +66,8 @@ void InterruptableSensorBase::RequestInterrupts(InterruptEventHandler handler) {
AllocateInterrupts(false);
if (StatusIsFatal()) return; // if allocate failed, out of interrupts
auto handlerPtr = new InterruptEventHandler(std::move(handler));
m_interruptHandler =
std::make_unique<InterruptEventHandler>(std::move(handler));
int32_t status = 0;
HAL_RequestInterrupts(
@@ -86,7 +88,7 @@ void InterruptableSensorBase::RequestInterrupts(InterruptEventHandler handler) {
WaitResult res = static_cast<WaitResult>(falling | rising);
(*self)(res);
},
handlerPtr, &status);
m_interruptHandler.get(), &status);
wpi_setErrorWithContext(status, HAL_GetErrorMessage(status));
}
@@ -110,12 +112,10 @@ void InterruptableSensorBase::CancelInterrupts() {
if (StatusIsFatal()) return;
wpi_assert(m_interrupt != HAL_kInvalidHandle);
int32_t status = 0;
auto param = HAL_CleanInterrupts(m_interrupt, &status);
if (param) {
delete reinterpret_cast<InterruptEventHandler*>(param);
}
HAL_CleanInterrupts(m_interrupt, &status);
// Ignore status, as an invalid handle just needs to be ignored.
m_interrupt = HAL_kInvalidHandle;
m_interruptHandler = nullptr;
}
InterruptableSensorBase::WaitResult InterruptableSensorBase::WaitForInterrupt(