diff --git a/rosjava/src/main/java/org/ros/concurrent/EventDispatcher.java b/rosjava/src/main/java/org/ros/concurrent/EventDispatcher.java index 428d92569f663b17eecd4533a875c41b840d58f6..83985f6f56c300f3d577660edd4163c6c527eded 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 class EventDispatcher<T> extends CancellableLoop { SignalRunnable<T> 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 ae7deb385398680b35b8226edc22f48d40683d1d..29a8ccb2ca79807dd03913549ae2adc34dae7d81 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 class ListenerGroup<T> { 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<T> 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 class ListenerGroup<T> { for (EventDispatcher<T> 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 ec36395577c02387a108e9857e367d30f0b822b4..81386cebdce2df3b5b4010a2295c7b1894906e83 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 class DefaultNode implements ConnectedNode { }); } + @Override + public void removeListeners() { + nodeListeners.shutdown(); + } + /** * SignalRunnable all {@link NodeListener}s that the {@link Node} has started. * <p> diff --git a/rosjava/src/main/java/org/ros/node/DefaultNodeMainExecutor.java b/rosjava/src/main/java/org/ros/node/DefaultNodeMainExecutor.java index 96d75754fca8c853c50b83a82f10a0671cdf9982..7ae607469d43dcbcd46cf5f3045746a87dec707d 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 @@ public class DefaultNodeMainExecutor implements NodeMainExecutor { * 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 ea88d76816737c8723466d77be342eebe2024e1f..9e47943c40a0dba91ea2896c4268b4f9cb81dd3d 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(); }