com.cloudbees.groovy.cps.green.GreenWorld Maven / Gradle / Ivy
package com.cloudbees.groovy.cps.green;
import com.cloudbees.groovy.cps.Block;
import com.cloudbees.groovy.cps.Continuable;
import com.cloudbees.groovy.cps.Continuation;
import com.cloudbees.groovy.cps.Env;
import com.cloudbees.groovy.cps.Next;
import com.cloudbees.groovy.cps.Outcome;
import com.cloudbees.groovy.cps.impl.ProxyEnv;
import java.io.Serializable;
/**
* Immutable representation of the combined states of all {@link GreenThreadState}s.
*
* The whole thing has to be immutable because cloning {@link Continuable} is just shallow-copying its variables.
*
* @author Kohsuke Kawaguchi
*/
class GreenWorld implements Serializable {
final GreenThreadState[] threads;
private final int cur;
private final Env e;
public GreenWorld(int cur, GreenThreadState... threads) {
this.threads = threads;
this.cur = cur;
this.e = new ProxyEnv(currentThread().n.e);
}
GreenThreadState currentThread() {
return threads[cur];
}
GreenWorld withNewThread(GreenThreadState s) {
GreenThreadState[] a = new GreenThreadState[threads.length+1];
System.arraycopy(threads,0,a,0, threads.length);
a[threads.length] = s;
return new GreenWorld(cur,a);
}
/**
* Updates the thread state. If the thread is dead, it'll be removed.
*/
GreenWorld with(GreenThreadState s) {
int idx = -1;
for (int i = 0; i < threads.length; i++) {
if (threads[i].g==s.g) {
threads[i] = s;
idx = i;
break;
}
}
if (idx==-1)
throw new IllegalStateException("No such thread: "+s.g);
GreenWorld d;
if (s.isDead()) {
GreenThreadState[] a = new GreenThreadState[threads.length-1];
System.arraycopy(threads,0,a,0,idx);
System.arraycopy(threads,idx+1,a,cur, threads.length-idx);
d = new GreenWorld(idx