diff --git a/rosjava/src/main/java/org/ros/concurrent/EventDispatcher.java b/rosjava/src/main/java/org/ros/concurrent/EventDispatcher.java index 428d92569..83985f6f5 100644 --- a/rosjava/src/main/java/org/ros/concurrent/EventDispatcher.java +++ b/rosjava/src/main/java/org/ros/concurrent/EventDispatcher.java @@ -42,4 +42,9 @@ public void loop() throws InterruptedException { SignalRunnable signalRunnable = events.takeFirst(); signalRunnable.run(listener); } + + public T getListener() + { + return listener; + } } \ No newline at end of file diff --git a/rosjava/src/main/java/org/ros/concurrent/ListenerGroup.java b/rosjava/src/main/java/org/ros/concurrent/ListenerGroup.java index ae7deb385..29a8ccb2c 100644 --- a/rosjava/src/main/java/org/ros/concurrent/ListenerGroup.java +++ b/rosjava/src/main/java/org/ros/concurrent/ListenerGroup.java @@ -101,6 +101,25 @@ public Collection> addAll(Collection listeners) { return addAll(listeners, DEFAULT_QUEUE_CAPACITY); } + /** + * Removes and cancels the {@EventDispatcher} specified by the listener + * from the {@link ListenerGroup}. + * @param listener the listener to remove + * @return flag indicating successful removal + */ + public boolean remove(T listener) + { + for (EventDispatcher eventDispatcher : eventDispatchers) { + if(listener.equals(eventDispatcher.getListener())) + { + eventDispatcher.cancel(); + eventDispatchers.remove(eventDispatcher); + return true; + } + } + return false; + } + /** * @return the number of listeners in the group */ @@ -151,5 +170,6 @@ public void shutdown() { for (EventDispatcher eventDispatcher : eventDispatchers) { eventDispatcher.cancel(); } + eventDispatchers.clear(); } } diff --git a/rosjava/src/main/java/org/ros/internal/node/DefaultNode.java b/rosjava/src/main/java/org/ros/internal/node/DefaultNode.java index ec3639557..81386cebd 100644 --- a/rosjava/src/main/java/org/ros/internal/node/DefaultNode.java +++ b/rosjava/src/main/java/org/ros/internal/node/DefaultNode.java @@ -493,6 +493,11 @@ public void run(NodeListener listener) { }); } + @Override + public void removeListeners() { + nodeListeners.shutdown(); + } + /** * SignalRunnable all {@link NodeListener}s that the {@link Node} has started. *

diff --git a/rosjava/src/main/java/org/ros/node/DefaultNodeMainExecutor.java b/rosjava/src/main/java/org/ros/node/DefaultNodeMainExecutor.java index 96d75754f..7ae607469 100644 --- a/rosjava/src/main/java/org/ros/node/DefaultNodeMainExecutor.java +++ b/rosjava/src/main/java/org/ros/node/DefaultNodeMainExecutor.java @@ -213,6 +213,7 @@ private void registerNode(ConnectedNode connectedNode) { * the {@link Node} to unregister */ private void unregisterNode(Node node) { + node.removeListeners(); connectedNodes.get(node.getName()).remove(node); nodeMains.remove(node); } diff --git a/rosjava/src/main/java/org/ros/node/Node.java b/rosjava/src/main/java/org/ros/node/Node.java index ea88d7681..9e47943c4 100644 --- a/rosjava/src/main/java/org/ros/node/Node.java +++ b/rosjava/src/main/java/org/ros/node/Node.java @@ -126,4 +126,10 @@ public interface Node { * Shut the node down. */ void shutdown(); + + /** + * Stops and Clears node listeners. + */ + + void removeListeners(); }