Allow ClientThread to re-run invokeLater-ed methods
This commit is contained in:
@@ -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();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user