1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80
|
/* Copyright (c) 2006-2018. The SimGrid Team.
* All rights reserved. */
/* This program is free software; you can redistribute it and/or modify it
* under the terms of the license (GNU LGPL) which comes with this package. */
package app.bittorrent;
import java.util.ArrayList;
import org.simgrid.msg.Msg;
import org.simgrid.msg.Comm;
import org.simgrid.msg.Host;
import org.simgrid.msg.Task;
import org.simgrid.msg.Process;
import org.simgrid.msg.RngStream;
import org.simgrid.msg.MsgException;
public class Tracker extends Process {
protected RngStream stream;
protected ArrayList<Integer> peersList;
protected double deadline;
protected Comm commReceived = null;
public Tracker(Host host, String name, String[]args) {
super(host,name,args);
}
@Override
public void main(String[] args) throws MsgException {
if (args.length != 1) {
Msg.info("Wrong number of arguments for the tracker.");
return;
}
//Build the RngStream object for randomness
stream = new RngStream("tracker");
//Retrieve the end time
deadline = Double.parseDouble(args[0]);
//Building peers array
peersList = new ArrayList<>();
Msg.info("Tracker launched.");
while (Msg.getClock() < deadline) {
if (commReceived == null) {
commReceived = Task.irecv(Common.TRACKER_MAILBOX);
}
try {
if (commReceived.test()) {
Task task = commReceived.getTask();
if (task instanceof TrackerTask) {
TrackerTask tTask = (TrackerTask)task;
//Sending peers to the peer
int nbPeers = 0;
while (nbPeers < Common.MAXIMUM_PEERS && nbPeers < peersList.size()) {
int nextPeer;
do {
nextPeer = stream.randInt(0, peersList.size() - 1);
} while (tTask.peers.contains(peersList.get(nextPeer)));
tTask.peers.add(peersList.get(nextPeer));
nbPeers++;
}
//Adding the peer to our list
peersList.add(tTask.peerId);
tTask.type = TrackerTask.Type.ANSWER;
//Setting the interval
tTask.interval = Common.TRACKER_QUERY_INTERVAL;
//Sending the task back to the peer
tTask.dsend(tTask.mailbox);
}
commReceived = null;
} else {
waitFor(1);
}
}
catch (MsgException e) {
commReceived = null;
}
}
Msg.info("Tracker is leaving");
}
}
|