package edu.cmu.graphchi.walks;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicLong;
public class IntDumperThread extends DumperThread {
private final DrunkardJob job;
private int[] walks = new int[256 * 1024];
private int[] vertices = new int[256 * 1024];
private int idx = 0;
public IntDumperThread(LinkedBlockingQueue<BucketsToSend> bucketQueue,
AtomicLong pendingWalksToSubmit,
AtomicBoolean finished,
DrunkardJob job) {
super(bucketQueue, pendingWalksToSubmit, finished);
this.job = job;
}
@Override
protected void processWalks(BucketsToSend bucket, int i) {
IntWalkManager manager = (IntWalkManager) job.getWalkManager();
IntWalkArray bucketWalks = (IntWalkArray) bucket.walks;
int w = bucketWalks.getArray()[i];
int v = manager.off(w) + bucket.firstVertex;
// Skip walks with the track-bit (hop-bit) not set
boolean trackBit = manager.trackBit(w);
if (!trackBit) {
return;
}
walks[idx] = w;
vertices[idx] = v;
idx++;
if (idx >= walks.length) {
try {
job.getCompanion().processWalks(new IntWalkArray(walks), vertices);
} catch (Exception err) {
err.printStackTrace();
}
idx = 0;
}
}
@Override
protected void sendRest() {
// Send rest
try {
int[] tmpWalks = new int[idx];
int[] tmpVertices = new int[idx];
System.arraycopy(walks, 0, tmpWalks, 0, idx);
System.arraycopy(vertices, 0, tmpVertices, 0, idx);
job.getCompanion().processWalks(new IntWalkArray(tmpWalks), tmpVertices);
} catch (Exception err) {
err.printStackTrace();
}
}
}