From 939c36bfa9fda11e14101a3552400f0137ced60c Mon Sep 17 00:00:00 2001 From: Jan Belle Date: Fri, 31 Aug 2018 12:58:10 +0200 Subject: Bug 538485 [runtime.java] Fix race condition in message service Change-Id: Iab3011b0415fb7b50a443c39ba3c82ec1857b4cf --- .../runtime/java/messaging/MessageSeQueue.java | 6 +++- .../runtime/java/messaging/MessageService.java | 37 +++++++++++----------- 2 files changed, 23 insertions(+), 20 deletions(-) diff --git a/runtime/org.eclipse.etrice.runtime.java/src/org/eclipse/etrice/runtime/java/messaging/MessageSeQueue.java b/runtime/org.eclipse.etrice.runtime.java/src/org/eclipse/etrice/runtime/java/messaging/MessageSeQueue.java index 4496dd928..d33c4a63a 100644 --- a/runtime/org.eclipse.etrice.runtime.java/src/org/eclipse/etrice/runtime/java/messaging/MessageSeQueue.java +++ b/runtime/org.eclipse.etrice.runtime.java/src/org/eclipse/etrice/runtime/java/messaging/MessageSeQueue.java @@ -74,8 +74,12 @@ public class MessageSeQueue extends RTObject{ return last; } + public boolean isEmpty() { + return last == null; + } + public boolean isNotEmpty(){ - return last != null; + return !isEmpty(); } public long getHightWaterMark() { diff --git a/runtime/org.eclipse.etrice.runtime.java/src/org/eclipse/etrice/runtime/java/messaging/MessageService.java b/runtime/org.eclipse.etrice.runtime.java/src/org/eclipse/etrice/runtime/java/messaging/MessageService.java index 84a9bf98c..d8b5b58e1 100644 --- a/runtime/org.eclipse.etrice.runtime.java/src/org/eclipse/etrice/runtime/java/messaging/MessageService.java +++ b/runtime/org.eclipse.etrice.runtime.java/src/org/eclipse/etrice/runtime/java/messaging/MessageService.java @@ -70,34 +70,33 @@ public class MessageService extends AbstractMessageService { public void run() { running = true; - if(pollingScheduler != null) + if(pollingScheduler != null) { pollingScheduler.scheduleAtFixedRate(new PollingTask(), pollingInterval, pollingInterval, TimeUnit.NANOSECONDS); + } - while (running) { + while(true) { Message msg = null; - - // get next Message from Queue + synchronized(this) { - msg = getMessageQueue().pop(); - } - - if (msg == null) { - // no message in queue -> wait until Thread is notified - try { - synchronized(this) { - if (!running) - return; + while(getMessageQueue().isEmpty() && running) { + // no message in queue -> wait until Thread is notified + try { wait(); } + catch (InterruptedException e) {} } - catch (InterruptedException e) { + if(!running) { + return; + } + else { + // get next Message from Queue + msg = getMessageQueue().pop(); } } - else { - // process message - lastMessageTimestamp = System.currentTimeMillis(); - getMessageDispatcher().receive(msg); - } + + // process message + lastMessageTimestamp = System.currentTimeMillis(); + getMessageDispatcher().receive(msg); } } -- cgit v1.2.3