From 6b5a1fb8273468ce4825fe07941d483ba0f14559 Mon Sep 17 00:00:00 2001 From: Denny Sheirer Date: Fri, 9 Feb 2024 06:05:19 -0500 Subject: [PATCH] #1802 Traffic channels stuck in TEARDOWN. Resolves: (#1829) 1. Tuner channel processing runnables were being interruptibly shutdown, preventing the channel from clearing any owned locks (ie DMRTrafficChannelManager) causing thread deadlock and eventually causing out of memory situation or tying up all threads in the thread pool to the point that the application stopped processing any data. 2. DMR Traffic Channel Manager was erroneously processing non-owned traffic channel events. Co-authored-by: Dennis Sheirer --- .../channel/state/AbstractDecoderState.java | 75 ++++++++++--- .../state/AlwaysUnsquelchedDecoderState.java | 102 ------------------ .../dsheirer/channel/state/DecoderState.java | 3 +- .../channel/ChannelProcessingManager.java | 2 + .../decode/analog/AnalogDecoderState.java | 5 +- .../module/decode/dcs/DCSDecoderState.java | 7 +- .../module/decode/dmr/DMRDecoderState.java | 7 +- .../decode/dmr/DMRTrafficChannelManager.java | 11 +- .../fleetsync2/Fleetsync2DecoderState.java | 17 +-- .../decode/lj1200/LJ1200DecoderState.java | 19 +--- .../decode/ltrnet/LTRNetDecoderState.java | 16 +-- .../ltrstandard/LTRStandardDecoderState.java | 16 +-- .../decode/mdc1200/MDCDecoderState.java | 19 +--- .../decode/mpt1327/MPT1327DecoderState.java | 15 +-- .../mpt1327/MPT1327TrafficChannelManager.java | 9 +- .../decode/p25/P25TrafficChannelManager.java | 8 +- .../decode/p25/phase1/P25P1DecoderState.java | 4 +- .../decode/p25/phase2/P25P2DecoderState.java | 4 +- .../decode/passport/PassportDecoderState.java | 19 +--- .../decode/tait/Tait1200DecoderState.java | 19 +--- .../io/github/dsheirer/util/Dispatcher.java | 10 +- 21 files changed, 122 insertions(+), 265 deletions(-) delete mode 100644 src/main/java/io/github/dsheirer/channel/state/AlwaysUnsquelchedDecoderState.java diff --git a/src/main/java/io/github/dsheirer/channel/state/AbstractDecoderState.java b/src/main/java/io/github/dsheirer/channel/state/AbstractDecoderState.java index 2ec19bed..19842101 100644 --- a/src/main/java/io/github/dsheirer/channel/state/AbstractDecoderState.java +++ b/src/main/java/io/github/dsheirer/channel/state/AbstractDecoderState.java @@ -1,23 +1,20 @@ /* + * ***************************************************************************** + * Copyright (C) 2014-2024 Dennis Sheirer * - * * ****************************************************************************** - * * Copyright (C) 2014-2019 Dennis Sheirer - * * - * * This program is free software: you can redistribute it and/or modify - * * it under the terms of the GNU General Public License as published by - * * the Free Software Foundation, either version 3 of the License, or - * * (at your option) any later version. - * * - * * This program is distributed in the hope that it will be useful, - * * but WITHOUT ANY WARRANTY; without even the implied warranty of - * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * * GNU General Public License for more details. - * * - * * You should have received a copy of the GNU General Public License - * * along with this program. If not, see - * * ***************************************************************************** + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see + * **************************************************************************** */ package io.github.dsheirer.channel.state; @@ -47,9 +44,37 @@ public abstract class AbstractDecoderState extends Module implements ActivitySum protected Broadcaster mDecodeEventBroadcaster = new Broadcaster<>(); protected Listener mDecoderStateListener; private DecoderStateEventListener mDecoderStateEventListener = new DecoderStateEventListener(); + private boolean mRunning; public abstract DecoderType getDecoderType(); + /** + * Implements module start and sets the mRunning flag to true so that messages can be processed. + */ + @Override + public void start() + { + mRunning = true; + } + + /** + * Implements the module stop and sets the mRunning flag to false to stop message processing + */ + @Override + public void stop() + { + mRunning = false; + } + + /** + * Indicates if this module is running and can process/pass messages down to sub-class implementations. + * @return true if running + */ + public boolean isRunning() + { + return mRunning; + } + /** * Provides subclass reference to the decode event broadcaster */ @@ -145,4 +170,22 @@ public abstract class AbstractDecoderState extends Module implements ActivitySum } } + /** + * Message listener that only passes messages while we're running. This is important because each of the decoders + * can process blocks of samples and that can result in additional messages being generated even after shutdown + * and so we shut off the processing of decoded messages when we're commanded to stop. The sample processing thread + * cannot be shutdown or forcefully interrupted because downstream decoder and channel states may have acquired + * locks that have to be properly released. + */ + private class MessageListener implements Listener + { + @Override + public void receive(IMessage message) + { + if(isRunning()) + { + receive(message); + } + } + } } diff --git a/src/main/java/io/github/dsheirer/channel/state/AlwaysUnsquelchedDecoderState.java b/src/main/java/io/github/dsheirer/channel/state/AlwaysUnsquelchedDecoderState.java deleted file mode 100644 index 4a0f933c..00000000 --- a/src/main/java/io/github/dsheirer/channel/state/AlwaysUnsquelchedDecoderState.java +++ /dev/null @@ -1,102 +0,0 @@ -/* - * ***************************************************************************** - * Copyright (C) 2014-2020 Dennis Sheirer - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see - * **************************************************************************** - */ -package io.github.dsheirer.channel.state; - -import io.github.dsheirer.channel.state.DecoderStateEvent.Event; -import io.github.dsheirer.identifier.Form; -import io.github.dsheirer.identifier.Identifier; -import io.github.dsheirer.identifier.IdentifierClass; -import io.github.dsheirer.identifier.Role; -import io.github.dsheirer.identifier.string.SimpleStringIdentifier; -import io.github.dsheirer.message.IMessage; -import io.github.dsheirer.module.decode.DecoderType; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * Basic decoder channel state - provides the minimum channel state functionality - * to support an always un-squelched audio decoder. - */ -public class AlwaysUnsquelchedDecoderState extends DecoderState -{ - private final static Logger mLog = LoggerFactory.getLogger(AlwaysUnsquelchedDecoderState.class); - private static final String NO_SQUELCH = "No Squelch"; - private Identifier mChannelNameIdentifier; - - private DecoderType mDecoderType; - private String mChannelName; - - public AlwaysUnsquelchedDecoderState(DecoderType decoderType, String channelName) - { - mDecoderType = decoderType; - mChannelName = (channelName != null && !channelName.isEmpty()) ? channelName : decoderType.name() + " CHANNEL"; - mChannelNameIdentifier = new SimpleStringIdentifier(mChannelName, IdentifierClass.USER, Form.CHANNEL_NAME, Role.TO); - } - - @Override - public void init() - { - } - - @Override - public String getActivitySummary() - { - StringBuilder sb = new StringBuilder(); - - sb.append("Activity Summary\n"); - sb.append("\tDecoder:\t"); - sb.append(mDecoderType); - sb.append("\n\n"); - - return sb.toString(); - } - - @Override - public void receive(IMessage t) - { - /* Not implemented */ - } - - @Override - public void receiveDecoderStateEvent(DecoderStateEvent event) - { - if(event.getEvent() == Event.REQUEST_RESET) - { - getIdentifierCollection().update(mChannelNameIdentifier); - } - } - - @Override - public DecoderType getDecoderType() - { - return mDecoderType; - } - - @Override - public void start() - { - broadcast(new DecoderStateEvent(this, Event.REQUEST_ALWAYS_UNSQUELCH, State.IDLE)); - getIdentifierCollection().update(mChannelNameIdentifier); - } - - @Override - public void stop() - { - } -} diff --git a/src/main/java/io/github/dsheirer/channel/state/DecoderState.java b/src/main/java/io/github/dsheirer/channel/state/DecoderState.java index dfae0cfa..f6fe14a6 100644 --- a/src/main/java/io/github/dsheirer/channel/state/DecoderState.java +++ b/src/main/java/io/github/dsheirer/channel/state/DecoderState.java @@ -1,6 +1,6 @@ /* * ***************************************************************************** - * Copyright (C) 2014-2022 Dennis Sheirer + * Copyright (C) 2014-2024 Dennis Sheirer * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -54,6 +54,7 @@ public abstract class DecoderState extends AbstractDecoderState @Override public void start() { + super.start(); //Broadcast the existing identifiers (as add events) so that they can be received by external listeners mIdentifierCollection.broadcastIdentifiers(); } diff --git a/src/main/java/io/github/dsheirer/controller/channel/ChannelProcessingManager.java b/src/main/java/io/github/dsheirer/controller/channel/ChannelProcessingManager.java index 166abf9b..55038969 100644 --- a/src/main/java/io/github/dsheirer/controller/channel/ChannelProcessingManager.java +++ b/src/main/java/io/github/dsheirer/controller/channel/ChannelProcessingManager.java @@ -636,6 +636,8 @@ public class ChannelProcessingManager implements Listener processingChain.removeFrequencyChangeListener(channel); channel.resetFrequencyCorrection(); + //Notify all processing chains that this channel is shutting down so that if this is a traffic channel, + //the owning parent channel's traffic channel manager can cleanup it's accounting. mChannelEventBroadcaster.broadcast(new ChannelEvent(channel, ChannelEvent.Event.NOTIFICATION_PROCESSING_STOP)); mChannelEventBroadcaster.removeListener(processingChain); diff --git a/src/main/java/io/github/dsheirer/module/decode/analog/AnalogDecoderState.java b/src/main/java/io/github/dsheirer/module/decode/analog/AnalogDecoderState.java index c2bb750a..b1d579c8 100644 --- a/src/main/java/io/github/dsheirer/module/decode/analog/AnalogDecoderState.java +++ b/src/main/java/io/github/dsheirer/module/decode/analog/AnalogDecoderState.java @@ -1,6 +1,6 @@ /* * ***************************************************************************** - * Copyright (C) 2014-2023 Dennis Sheirer + * Copyright (C) 2014-2024 Dennis Sheirer * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -145,11 +145,10 @@ public abstract class AnalogDecoderState extends DecoderState implements ISource @Override public void start() { + super.start(); getIdentifierCollection().update(getChannelNameIdentifier()); } - @Override - public void stop() {} @Override public void init() {} @Override diff --git a/src/main/java/io/github/dsheirer/module/decode/dcs/DCSDecoderState.java b/src/main/java/io/github/dsheirer/module/decode/dcs/DCSDecoderState.java index 763fca01..0fe3e639 100644 --- a/src/main/java/io/github/dsheirer/module/decode/dcs/DCSDecoderState.java +++ b/src/main/java/io/github/dsheirer/module/decode/dcs/DCSDecoderState.java @@ -1,6 +1,6 @@ /* * ***************************************************************************** - * Copyright (C) 2014-2023 Dennis Sheirer + * Copyright (C) 2014-2024 Dennis Sheirer * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -115,9 +115,4 @@ public class DCSDecoderState extends DecoderState public void init() { } - - @Override - public void stop() - { - } } diff --git a/src/main/java/io/github/dsheirer/module/decode/dmr/DMRDecoderState.java b/src/main/java/io/github/dsheirer/module/decode/dmr/DMRDecoderState.java index 73e0b328..dd088695 100644 --- a/src/main/java/io/github/dsheirer/module/decode/dmr/DMRDecoderState.java +++ b/src/main/java/io/github/dsheirer/module/decode/dmr/DMRDecoderState.java @@ -1472,6 +1472,8 @@ public class DMRDecoderState extends TimeslotDecoderState @Override public void start() { + super.start(); + //Change the default (45-second) traffic channel timeout to 1 second if(mChannel.isTrafficChannel()) { @@ -1483,9 +1485,4 @@ public class DMRDecoderState extends TimeslotDecoderState public void init() { } - - @Override - public void stop() - { - } } diff --git a/src/main/java/io/github/dsheirer/module/decode/dmr/DMRTrafficChannelManager.java b/src/main/java/io/github/dsheirer/module/decode/dmr/DMRTrafficChannelManager.java index c620952c..6b35a01c 100644 --- a/src/main/java/io/github/dsheirer/module/decode/dmr/DMRTrafficChannelManager.java +++ b/src/main/java/io/github/dsheirer/module/decode/dmr/DMRTrafficChannelManager.java @@ -201,6 +201,9 @@ public class DMRTrafficChannelManager extends TrafficChannelManager implements I } mAvailableTrafficChannels.addAll(trafficChannelList); + + //Keep track of the complete list so that we can check channel events to determine if the channel event + //is for a traffic channel owned by this traffic channel manager. mAllocatedTrafficChannels = Collections.unmodifiableList(trafficChannelList); } } @@ -795,7 +798,10 @@ public class DMRTrafficChannelManager extends TrafficChannelManager implements I } /** - * Process traffic channel processing stop or processing start rejected events. + /** + * Process channel events from the ChannelProcessingManager to account for owned child traffic channels. + * Note: this method sees events for ALL channels and not just DMR channels managed by this instance. + * * @param channelEvent to process */ @Override @@ -803,7 +809,8 @@ public class DMRTrafficChannelManager extends TrafficChannelManager implements I { Channel channel = channelEvent.getChannel(); - if(channel.isTrafficChannel()) + //Only process the event if it's one of the traffic channels managed by this instance. + if(mAllocatedTrafficChannels.contains(channel)) { switch(channelEvent.getEvent()) { diff --git a/src/main/java/io/github/dsheirer/module/decode/fleetsync2/Fleetsync2DecoderState.java b/src/main/java/io/github/dsheirer/module/decode/fleetsync2/Fleetsync2DecoderState.java index 70817ff1..ba4fb8ee 100644 --- a/src/main/java/io/github/dsheirer/module/decode/fleetsync2/Fleetsync2DecoderState.java +++ b/src/main/java/io/github/dsheirer/module/decode/fleetsync2/Fleetsync2DecoderState.java @@ -1,6 +1,6 @@ /* * ***************************************************************************** - * Copyright (C) 2014-2023 Dennis Sheirer + * Copyright (C) 2014-2024 Dennis Sheirer * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -53,20 +53,7 @@ public class Fleetsync2DecoderState extends DecoderState } @Override - public void start() - { - } - - @Override - public void stop() - { - } - - @Override - public void init() - { - - } + public void init() {} @Override public void receive(IMessage message) diff --git a/src/main/java/io/github/dsheirer/module/decode/lj1200/LJ1200DecoderState.java b/src/main/java/io/github/dsheirer/module/decode/lj1200/LJ1200DecoderState.java index bc54188e..8a945a91 100644 --- a/src/main/java/io/github/dsheirer/module/decode/lj1200/LJ1200DecoderState.java +++ b/src/main/java/io/github/dsheirer/module/decode/lj1200/LJ1200DecoderState.java @@ -1,6 +1,6 @@ /* * ***************************************************************************** - * Copyright (C) 2014-2023 Dennis Sheirer + * Copyright (C) 2014-2024 Dennis Sheirer * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -150,20 +150,5 @@ public class LJ1200DecoderState extends DecoderState } @Override - public void start() - { - - } - - @Override - public void stop() - { - - } - - @Override - public void init() - { - - } + public void init() {} } diff --git a/src/main/java/io/github/dsheirer/module/decode/ltrnet/LTRNetDecoderState.java b/src/main/java/io/github/dsheirer/module/decode/ltrnet/LTRNetDecoderState.java index e3bba893..dff9f521 100644 --- a/src/main/java/io/github/dsheirer/module/decode/ltrnet/LTRNetDecoderState.java +++ b/src/main/java/io/github/dsheirer/module/decode/ltrnet/LTRNetDecoderState.java @@ -1,6 +1,6 @@ /* * ***************************************************************************** - * Copyright (C) 2014-2023 Dennis Sheirer + * Copyright (C) 2014-2024 Dennis Sheirer * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -586,19 +586,7 @@ public class LTRNetDecoderState extends DecoderState } @Override - public void start() - { - } - - @Override - public void stop() - { - } - - @Override - public void init() - { - } + public void init() {} /** * Resets the decoder state after a call or other decode event diff --git a/src/main/java/io/github/dsheirer/module/decode/ltrstandard/LTRStandardDecoderState.java b/src/main/java/io/github/dsheirer/module/decode/ltrstandard/LTRStandardDecoderState.java index a28aa6da..2664735e 100644 --- a/src/main/java/io/github/dsheirer/module/decode/ltrstandard/LTRStandardDecoderState.java +++ b/src/main/java/io/github/dsheirer/module/decode/ltrstandard/LTRStandardDecoderState.java @@ -1,6 +1,6 @@ /* * ***************************************************************************** - * Copyright (C) 2014-2023 Dennis Sheirer + * Copyright (C) 2014-2024 Dennis Sheirer * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -153,19 +153,7 @@ public class LTRStandardDecoderState extends DecoderState } @Override - public void start() - { - } - - @Override - public void stop() - { - } - - @Override - public void init() - { - } + public void init() {} /** * Performs a temporal reset following a call or other decode event diff --git a/src/main/java/io/github/dsheirer/module/decode/mdc1200/MDCDecoderState.java b/src/main/java/io/github/dsheirer/module/decode/mdc1200/MDCDecoderState.java index f9a07905..db1c678d 100644 --- a/src/main/java/io/github/dsheirer/module/decode/mdc1200/MDCDecoderState.java +++ b/src/main/java/io/github/dsheirer/module/decode/mdc1200/MDCDecoderState.java @@ -1,6 +1,6 @@ /* * ***************************************************************************** - * Copyright (C) 2014-2023 Dennis Sheirer + * Copyright (C) 2014-2024 Dennis Sheirer * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -58,22 +58,7 @@ public class MDCDecoderState extends DecoderState } @Override - public void start() - { - - } - - @Override - public void stop() - { - - } - - @Override - public void init() - { - - } + public void init() {} @Override public void receive(IMessage message) diff --git a/src/main/java/io/github/dsheirer/module/decode/mpt1327/MPT1327DecoderState.java b/src/main/java/io/github/dsheirer/module/decode/mpt1327/MPT1327DecoderState.java index 95b1fc63..67fa409b 100644 --- a/src/main/java/io/github/dsheirer/module/decode/mpt1327/MPT1327DecoderState.java +++ b/src/main/java/io/github/dsheirer/module/decode/mpt1327/MPT1327DecoderState.java @@ -1,6 +1,6 @@ /* * ***************************************************************************** - * Copyright (C) 2014-2023 Dennis Sheirer + * Copyright (C) 2014-2024 Dennis Sheirer * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -220,6 +220,7 @@ public class MPT1327DecoderState extends DecoderState @Override public void start() { + super.start(); //Send call start event for traffic channels to unsquelch the audio. Decoded return to channel message //or fade timeout expire will end the call event. if(mChannelType == ChannelType.TRAFFIC) @@ -228,18 +229,8 @@ public class MPT1327DecoderState extends DecoderState broadcast(new DecoderStateEvent(this, Event.START, State.CALL)); } } - @Override - public void stop() - { - - } - - @Override - public void init() - { - - } + public void init() {} protected void resetState() { diff --git a/src/main/java/io/github/dsheirer/module/decode/mpt1327/MPT1327TrafficChannelManager.java b/src/main/java/io/github/dsheirer/module/decode/mpt1327/MPT1327TrafficChannelManager.java index 9e1f45ce..a810f814 100644 --- a/src/main/java/io/github/dsheirer/module/decode/mpt1327/MPT1327TrafficChannelManager.java +++ b/src/main/java/io/github/dsheirer/module/decode/mpt1327/MPT1327TrafficChannelManager.java @@ -1,6 +1,6 @@ /* * ***************************************************************************** - * Copyright (C) 2014-2023 Dennis Sheirer + * Copyright (C) 2014-2024 Dennis Sheirer * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -301,6 +301,13 @@ public class MPT1327TrafficChannelManager extends TrafficChannelManager implemen */ public class TrafficChannelTeardownMonitor implements Listener { + + /** + * Process channel events from the ChannelProcessingManager to account for owned child traffic channels. + * Note: this method sees events for ALL channels and not just MPT1327 channels managed by this instance. + * + * @param channelEvent to process + */ @Override public synchronized void receive(ChannelEvent channelEvent) { diff --git a/src/main/java/io/github/dsheirer/module/decode/p25/P25TrafficChannelManager.java b/src/main/java/io/github/dsheirer/module/decode/p25/P25TrafficChannelManager.java index 6e668be7..699d2b8b 100644 --- a/src/main/java/io/github/dsheirer/module/decode/p25/P25TrafficChannelManager.java +++ b/src/main/java/io/github/dsheirer/module/decode/p25/P25TrafficChannelManager.java @@ -1,6 +1,6 @@ /* * ***************************************************************************** - * Copyright (C) 2014-2023 Dennis Sheirer + * Copyright (C) 2014-2024 Dennis Sheirer * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -794,6 +794,12 @@ public class P25TrafficChannelManager extends TrafficChannelManager implements I } } + /** + * Process channel events from the ChannelProcessingManager to account for owned child traffic channels. + * Note: this method sees events for ALL channels and not just P25 channels managed by this instance. + * + * @param channelEvent to process + */ @Override public synchronized void receive(ChannelEvent channelEvent) { diff --git a/src/main/java/io/github/dsheirer/module/decode/p25/phase1/P25P1DecoderState.java b/src/main/java/io/github/dsheirer/module/decode/p25/phase1/P25P1DecoderState.java index 4587c3b9..5a53fd27 100644 --- a/src/main/java/io/github/dsheirer/module/decode/p25/phase1/P25P1DecoderState.java +++ b/src/main/java/io/github/dsheirer/module/decode/p25/phase1/P25P1DecoderState.java @@ -1,6 +1,6 @@ /* * ***************************************************************************** - * Copyright (C) 2014-2023 Dennis Sheirer + * Copyright (C) 2014-2024 Dennis Sheirer * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -1948,6 +1948,7 @@ public class P25P1DecoderState extends DecoderState implements IChannelEventList @Override public void start() { + super.start(); mPatchGroupManager.clear(); //Change the default (45-second) traffic channel timeout to 1 second @@ -1965,6 +1966,7 @@ public class P25P1DecoderState extends DecoderState implements IChannelEventList @Override public void stop() { + super.stop(); mPatchGroupManager.clear(); } } diff --git a/src/main/java/io/github/dsheirer/module/decode/p25/phase2/P25P2DecoderState.java b/src/main/java/io/github/dsheirer/module/decode/p25/phase2/P25P2DecoderState.java index d1b88213..8c47c113 100644 --- a/src/main/java/io/github/dsheirer/module/decode/p25/phase2/P25P2DecoderState.java +++ b/src/main/java/io/github/dsheirer/module/decode/p25/phase2/P25P2DecoderState.java @@ -1,6 +1,6 @@ /* * ***************************************************************************** - * Copyright (C) 2014-2023 Dennis Sheirer + * Copyright (C) 2014-2024 Dennis Sheirer * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -1161,6 +1161,7 @@ public class P25P2DecoderState extends TimeslotDecoderState implements Identifie @Override public void start() { + super.start(); mPatchGroupManager.clear(); //Change the default (45-second) traffic channel timeout to 1 second @@ -1178,6 +1179,7 @@ public class P25P2DecoderState extends TimeslotDecoderState implements Identifie @Override public void stop() { + super.stop(); mPatchGroupManager.clear(); } } diff --git a/src/main/java/io/github/dsheirer/module/decode/passport/PassportDecoderState.java b/src/main/java/io/github/dsheirer/module/decode/passport/PassportDecoderState.java index d792d398..346e73de 100644 --- a/src/main/java/io/github/dsheirer/module/decode/passport/PassportDecoderState.java +++ b/src/main/java/io/github/dsheirer/module/decode/passport/PassportDecoderState.java @@ -1,6 +1,6 @@ /* * ***************************************************************************** - * Copyright (C) 2014-2023 Dennis Sheirer + * Copyright (C) 2014-2024 Dennis Sheirer * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -327,22 +327,7 @@ public class PassportDecoderState extends DecoderState } @Override - public void start() - { - - } - - @Override - public void stop() - { - - } - - @Override - public void init() - { - - } + public void init() {} protected void resetState() { diff --git a/src/main/java/io/github/dsheirer/module/decode/tait/Tait1200DecoderState.java b/src/main/java/io/github/dsheirer/module/decode/tait/Tait1200DecoderState.java index 6bdddec0..dedfb343 100644 --- a/src/main/java/io/github/dsheirer/module/decode/tait/Tait1200DecoderState.java +++ b/src/main/java/io/github/dsheirer/module/decode/tait/Tait1200DecoderState.java @@ -1,6 +1,6 @@ /* * ***************************************************************************** - * Copyright (C) 2014-2023 Dennis Sheirer + * Copyright (C) 2014-2024 Dennis Sheirer * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -58,22 +58,7 @@ public class Tait1200DecoderState extends DecoderState } @Override - public void start() - { - - } - - @Override - public void stop() - { - - } - - @Override - public void init() - { - - } + public void init() {} @Override public void receive(IMessage message) diff --git a/src/main/java/io/github/dsheirer/util/Dispatcher.java b/src/main/java/io/github/dsheirer/util/Dispatcher.java index f26cb783..295984ac 100644 --- a/src/main/java/io/github/dsheirer/util/Dispatcher.java +++ b/src/main/java/io/github/dsheirer/util/Dispatcher.java @@ -1,6 +1,6 @@ /* * ***************************************************************************** - * Copyright (C) 2014-2023 Dennis Sheirer + * Copyright (C) 2014-2024 Dennis Sheirer * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -106,7 +106,9 @@ public class Dispatcher implements Listener { if(mScheduledFuture != null) { - mScheduledFuture.cancel(true); + //Note: this has to be false because downstream implementations may have acquired locks and they must + //be able to release those locks or we'll get a deadlock situation. + mScheduledFuture.cancel(false); } if(mExecutorService != null) @@ -132,7 +134,9 @@ public class Dispatcher implements Listener { if(mScheduledFuture != null) { - mScheduledFuture.cancel(true); + //Note: this has to be false because downstream implementations may have acquired locks and they must + //be able to release those locks or we'll get a deadlock situation. + mScheduledFuture.cancel(false); mScheduledFuture = null; mQueue.clear(); }