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 e5a4b7c098ee622edbe6331862b1b1df0526f9da..9f1a1bdc1278b79e0216c11ded4adc3417f52c6c 100644 --- a/rosjava/src/main/java/org/ros/internal/node/DefaultNode.java +++ b/rosjava/src/main/java/org/ros/internal/node/DefaultNode.java @@ -180,17 +180,26 @@ public class DefaultNode implements ConnectedNode { // possible during startup. registrar.start(slaveServer.toNodeIdentifier()); - // During startup, we wait for 1) the RosoutLogger and 2) the TimeProvider. - final CountDownLatch latch = new CountDownLatch(2); + // Wait for the logger to register with the master. This ensures the master is running before + // requesting the use_sim_time parameter. + final CountDownLatch rosoutLatch = new CountDownLatch(1); log = new RosoutLogger(this); log.getPublisher().addListener(new DefaultPublisherListener<rosgraph_msgs.Log>() { @Override public void onMasterRegistrationSuccess(Publisher<rosgraph_msgs.Log> registrant) { - latch.countDown(); + rosoutLatch.countDown(); } }); + try { + rosoutLatch.await(); + } catch (InterruptedException e) { + signalOnError(e); + shutdown(); + return; + } + boolean useSimTime = false; try { useSimTime = @@ -198,24 +207,28 @@ public class DefaultNode implements ConnectedNode { && parameterTree.getBoolean(Parameters.USE_SIM_TIME); } catch (Exception e) { signalOnError(e); + shutdown(); + return; } + + final CountDownLatch timeLatch = new CountDownLatch(1); if (useSimTime) { ClockTopicTimeProvider clockTopicTimeProvider = new ClockTopicTimeProvider(this); clockTopicTimeProvider.getSubscriber().addSubscriberListener( new DefaultSubscriberListener<rosgraph_msgs.Clock>() { @Override public void onMasterRegistrationSuccess(Subscriber<rosgraph_msgs.Clock> subscriber) { - latch.countDown(); + timeLatch.countDown(); } }); timeProvider = clockTopicTimeProvider; } else { timeProvider = nodeConfiguration.getTimeProvider(); - latch.countDown(); + timeLatch.countDown(); } try { - latch.await(); + timeLatch.await(); } catch (InterruptedException e) { signalOnError(e); shutdown();