Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
9d197e2
Added queueing to send messages to router service via transport broke…
JulianKast Jun 14, 2023
4264345
update unit test
JulianKast Jun 14, 2023
e0346ac
Merge branch 'develop' into bugfix/issue_1850_remove_sleep
JulianKast Oct 19, 2023
f9bd62b
Remove old logic
JulianKast Oct 23, 2023
412de0e
Add new class to hold all task queue logic for the TransportBroker
JulianKast Oct 23, 2023
af50848
Refactor logic in TransportBroker to new class created
JulianKast Oct 23, 2023
2777d0c
fix comment
JulianKast Oct 23, 2023
3c0c9fc
Rename SendMessageToRouterService
joeygrover Oct 24, 2023
6c27991
Refactor SendToRouterServiceTaskMaster into base
joeygrover Oct 24, 2023
520b748
Update thread name for RouterServiceMessageEmitter
joeygrover Oct 24, 2023
3572ba4
Remove extra threadin queue object for RS emiiter
joeygrover Oct 24, 2023
12e75bc
Refctor emitter callback
joeygrover Oct 24, 2023
c447080
Remove extra emitter task class
joeygrover Oct 24, 2023
0476a3e
Merge adding to tail in emitter
joeygrover Oct 24, 2023
97122f0
Update method modifiers in emitter
joeygrover Oct 24, 2023
eb04d15
Remove extra method in emitter for polling
joeygrover Oct 24, 2023
f0d7ea6
Fix increment to retryCount in transportBroker
joeygrover Oct 24, 2023
e97a0ee
Remove custom linked list in favor of LinkedList
joeygrover Oct 24, 2023
675d884
Add null checks in emitter
joeygrover Oct 24, 2023
6015f47
Remove throwing NPE in emitter
joeygrover Oct 24, 2023
2485efc
Additional cleanup for #1871
joeygrover Oct 24, 2023
5cd4c1a
Add library scope annotation to emitter
joeygrover Oct 25, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -117,24 +117,24 @@ public void testSendMessageToRouterService() {
broker.routerServiceMessenger = null;
broker.isBound = true;

assertFalse(broker.sendMessageToRouterService(message));
assertFalse(broker.sendMessageToRouterService(message, 0));

broker.routerServiceMessenger = new Messenger(handler); //So it's not ambiguous

broker.isBound = false;

assertFalse(broker.sendMessageToRouterService(message));
assertFalse(broker.sendMessageToRouterService(message, 0));

broker.isBound = true;
broker.registeredWithRouterService = true;

message = null;

assertFalse(broker.sendMessageToRouterService(message));
assertFalse(broker.sendMessageToRouterService(message, 0));

message = new Message();

assertTrue(broker.sendMessageToRouterService(message));
assertTrue(broker.sendMessageToRouterService(message, 0));

}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,91 @@
package com.smartdevicelink.transport;

import android.os.Message;

import androidx.annotation.RestrictTo;

import java.util.LinkedList;
import java.util.Queue;

@RestrictTo(RestrictTo.Scope.LIBRARY)
public class RouterServiceMessageEmitter extends Thread {

protected final Object QUEUE_LOCK = new Object();
private boolean isHalted = false, isWaiting = false;
private final Callback callback;
private final Queue<Message> queue = new LinkedList<>();

public RouterServiceMessageEmitter(Callback callback) {
this.setName("RouterServiceMessageEmitter");
this.setDaemon(true);
this.callback = callback;
}

@Override
public void run() {
while (!isHalted) {
try {
Message message;
synchronized (QUEUE_LOCK) {
message = getNextTask();
if (message != null && callback != null) {
callback.onMessageToSend(message);
} else {
isWaiting = true;
QUEUE_LOCK.wait();
isWaiting = false;
}
}
} catch (InterruptedException e) {
break;
}
}
}

protected void alert() {
if (isWaiting) {
synchronized (QUEUE_LOCK) {
QUEUE_LOCK.notify();
}
}
}

protected void close() {
this.isHalted = true;
if (queue != null) {
queue.clear();
}
}

/**
* Insert the task in the queue where it belongs
*
* @param message the new Message that needs to be added to the queue to be handled
*/
public void add(Message message) {
synchronized (this) {
if (message != null && queue != null) {
queue.add(message);
}
}
}

/**
* Remove the head of the queue
*
* @return the old head of the queue
*/
private Message getNextTask() {
synchronized (this) {
if (queue != null) {
return queue.poll();
} else {
return null;
}
}
}

protected interface Callback {
boolean onMessageToSend(Message message);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -91,6 +91,7 @@ public class TransportBroker {

Messenger routerServiceMessenger = null;
final Messenger clientMessenger;
private RouterServiceMessageEmitter routerServiceMessageEmitter;

boolean isBound = false, registeredWithRouterService = false;
private String routerPackage = null, routerClassName = null;
Expand All @@ -109,6 +110,13 @@ private void initRouterConnection() {

public void onServiceConnected(ComponentName className, IBinder service) {
DebugTool.logInfo(TAG, "Bound to service " + className.toString());
routerServiceMessageEmitter = new RouterServiceMessageEmitter(new RouterServiceMessageEmitter.Callback() {
@Override
public boolean onMessageToSend(Message message) {
return sendMessageToRouterService(message, 0);
}
});
routerServiceMessageEmitter.start();
routerServiceMessenger = new Messenger(service);
isBound = true;
//So we just established our connection
Expand All @@ -118,7 +126,7 @@ public void onServiceConnected(ComponentName className, IBinder service) {

public void onServiceDisconnected(ComponentName className) {
DebugTool.logInfo(TAG, "Unbound from service " + className.getClassName());
routerServiceMessenger = null;
shutDownRouterServiceMessenger();
registeredWithRouterService = false;
isBound = false;
onHardwareDisconnected(null, null);
Expand All @@ -127,7 +135,12 @@ public void onServiceDisconnected(ComponentName className) {
}

protected boolean sendMessageToRouterService(Message message) {
return sendMessageToRouterService(message, 0);
if (routerServiceMessageEmitter != null) {
routerServiceMessageEmitter.add(message);
routerServiceMessageEmitter.alert();
}
// Updated to only return true as we have added sending messages to SdlRouterService to be on a different thread.
return true;
}

protected boolean sendMessageToRouterService(Message message, int retryCount) {
Expand All @@ -152,7 +165,7 @@ protected boolean sendMessageToRouterService(Message message, int retryCount) {
} catch (InterruptedException e1) {
e1.printStackTrace();
}
return sendMessageToRouterService(message, retryCount++);
return sendMessageToRouterService(message, ++retryCount);
} else {
//DeadObject, time to kill our connection
DebugTool.logInfo(TAG, "Dead object while attempting to send packet");
Expand Down Expand Up @@ -431,7 +444,7 @@ public boolean start() {
public void resetSession() {
synchronized (INIT_LOCK) {
unregisterWithRouterService();
routerServiceMessenger = null;
shutDownRouterServiceMessenger();
unBindFromRouterService();
isBound = false;
}
Expand All @@ -445,7 +458,7 @@ public void stop() {
synchronized (INIT_LOCK) {
unregisterWithRouterService();
unBindFromRouterService();
routerServiceMessenger = null;
shutDownRouterServiceMessenger();
currentContext = null;

}
Expand Down Expand Up @@ -629,8 +642,7 @@ private void unregisterWithRouterService() {
} else {
DebugTool.logWarning(TAG, "Unable to unregister, not bound to router service");
}

routerServiceMessenger = null;
shutDownRouterServiceMessenger();
}

protected ComponentName getRouterService() {
Expand Down Expand Up @@ -747,4 +759,15 @@ public void removeSession(long sessionId) {
msg.setData(bundle);
this.sendMessageToRouterService(msg);
}

/**
* Method to shut down RouterServiceMessenger
*/
private void shutDownRouterServiceMessenger() {
routerServiceMessenger = null;
if (routerServiceMessageEmitter != null) {
routerServiceMessageEmitter.close();
}
routerServiceMessageEmitter = null;
}
}