Allow ClientThread to re-run invokeLater-ed methods

This commit is contained in:
Max Weber
2018-04-11 03:19:36 -06:00
parent 5054caffa1
commit d680c91c19

View File

@@ -27,6 +27,7 @@ package net.runelite.client.callback;
import com.google.inject.Inject; import com.google.inject.Inject;
import java.util.Iterator; import java.util.Iterator;
import java.util.concurrent.ConcurrentLinkedQueue; import java.util.concurrent.ConcurrentLinkedQueue;
import java.util.function.BooleanSupplier;
import javax.inject.Singleton; import javax.inject.Singleton;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import net.runelite.api.Client; import net.runelite.api.Client;
@@ -35,16 +36,32 @@ import net.runelite.api.Client;
@Slf4j @Slf4j
public class ClientThread public class ClientThread
{ {
private ConcurrentLinkedQueue<Runnable> invokes = new ConcurrentLinkedQueue<>(); private ConcurrentLinkedQueue<BooleanSupplier> invokes = new ConcurrentLinkedQueue<>();
@Inject @Inject
private Client client; private Client client;
public void invokeLater(Runnable r) public void invokeLater(Runnable r)
{ {
if (client.isClientThread()) invokeLater(() ->
{ {
r.run(); r.run();
return true;
});
}
/**
* Will run r on the game thread, at a unspecified point in the future.
* If r returns false, r will be ran again, at a later point
*/
public void invokeLater(BooleanSupplier r)
{
if (client.isClientThread())
{
if (r.getAsBoolean())
{
invokes.add(r);
}
return; return;
} }
invokes.add(r); invokes.add(r);
@@ -53,14 +70,14 @@ public class ClientThread
void invoke() void invoke()
{ {
assert client.isClientThread(); assert client.isClientThread();
Iterator<Runnable> ir = invokes.iterator(); Iterator<BooleanSupplier> ir = invokes.iterator();
for (; ir.hasNext(); ) for (; ir.hasNext(); )
{ {
Runnable r = ir.next(); BooleanSupplier r = ir.next();
ir.remove(); boolean remove = true;
try try
{ {
r.run(); remove = r.getAsBoolean();
} }
catch (ThreadDeath d) catch (ThreadDeath d)
{ {
@@ -70,6 +87,10 @@ public class ClientThread
{ {
log.warn("Exception in invokeLater", e); log.warn("Exception in invokeLater", e);
} }
if (remove)
{
ir.remove();
}
} }
} }
} }