From 3fcfc8ea72096cc378f38ab892cbfdbedce152f0 Mon Sep 17 00:00:00 2001 From: Thad House Date: Mon, 25 Nov 2019 21:43:58 -0800 Subject: [PATCH] Fix double disable segfaulting interrupts (#2132) Also fixes DigitalOutput not closing correctly. --- hal/src/main/native/athena/Interrupts.cpp | 15 ++++++++++++--- .../java/edu/wpi/first/wpilibj/DigitalOutput.java | 1 + 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/hal/src/main/native/athena/Interrupts.cpp b/hal/src/main/native/athena/Interrupts.cpp index 8ce55b26ce..78d518c38c 100644 --- a/hal/src/main/native/athena/Interrupts.cpp +++ b/hal/src/main/native/athena/Interrupts.cpp @@ -118,7 +118,11 @@ void* HAL_CleanInterrupts(HAL_InterruptHandle interruptHandle, if (anInterrupt == nullptr) { return nullptr; } - anInterrupt->manager->disable(status); + + if (anInterrupt->manager->isEnabled(status)) { + anInterrupt->manager->disable(status); + } + void* param = anInterrupt->param; return param; } @@ -152,7 +156,10 @@ void HAL_EnableInterrupts(HAL_InterruptHandle interruptHandle, *status = HAL_HANDLE_ERROR; return; } - anInterrupt->manager->enable(status); + + if (!anInterrupt->manager->isEnabled(status)) { + anInterrupt->manager->enable(status); + } } void HAL_DisableInterrupts(HAL_InterruptHandle interruptHandle, @@ -162,7 +169,9 @@ void HAL_DisableInterrupts(HAL_InterruptHandle interruptHandle, *status = HAL_HANDLE_ERROR; return; } - anInterrupt->manager->disable(status); + if (anInterrupt->manager->isEnabled(status)) { + anInterrupt->manager->disable(status); + } } int64_t HAL_ReadInterruptRisingTimestamp(HAL_InterruptHandle interruptHandle, diff --git a/wpilibj/src/main/java/edu/wpi/first/wpilibj/DigitalOutput.java b/wpilibj/src/main/java/edu/wpi/first/wpilibj/DigitalOutput.java index b42a566e75..ec1a44c6db 100644 --- a/wpilibj/src/main/java/edu/wpi/first/wpilibj/DigitalOutput.java +++ b/wpilibj/src/main/java/edu/wpi/first/wpilibj/DigitalOutput.java @@ -44,6 +44,7 @@ public class DigitalOutput extends DigitalSource implements Sendable, AutoClosea @Override public void close() { + super.close(); SendableRegistry.remove(this); // Disable the pwm only if we have allocated it if (m_pwmGenerator != invalidPwmGenerator) {