2 * Copyright 2006-2012. The SimGrid Team. All rights reserved.
4 * This program is free software; you can redistribute it and/or modify it
5 * under the terms of the license (GNU LGPL) which comes with this package.
8 import java.util.ArrayList;
9 import java.util.Iterator;
11 import org.simgrid.msg.Comm;
12 import org.simgrid.msg.Host;
13 import org.simgrid.msg.Process;
14 import org.simgrid.msg.Msg;
15 import org.simgrid.msg.MsgException;
16 import org.simgrid.msg.Task;
18 import org.simgrid.msg.RngStream;
20 * Tracker, handle requests from peers.
22 public class Tracker extends Process {
23 protected RngStream stream;
27 protected ArrayList<Integer> peersList;
29 * End time for the simulation
31 protected double deadline;
33 * Current comm received
35 protected Comm commReceived = null;
37 public Tracker(Host host, String name, String[]args) {
38 super(host,name,args);
42 public void main(String[] args) throws MsgException {
43 if (args.length != 1) {
44 Msg.info("Wrong number of arguments for the tracker.");
47 //Build the RngStream object for randomness
48 stream = new RngStream("tracker");
49 //Retrieve the end time
50 deadline = Double.valueOf(args[0]);
51 //Building peers array
52 peersList = new ArrayList<Integer>();
54 Msg.info("Tracker launched.");
55 while (Msg.getClock() < deadline) {
56 if (commReceived == null) {
57 commReceived = Task.irecv(Common.TRACKER_MAILBOX);
60 if (commReceived.test()) {
61 Task task = commReceived.getTask();
62 if (task instanceof TrackerTask) {
63 TrackerTask tTask = (TrackerTask)task;
64 //Sending peers to the peer
66 while (nbPeers < Common.MAXIMUM_PEERS && nbPeers < peersList.size()) {
69 nextPeer = stream.randInt(0, peersList.size() - 1);
70 } while (tTask.peers.contains(nextPeer));
71 tTask.peers.add(peersList.get(nextPeer));
74 //Adding the peer to our list
75 peersList.add(tTask.peerId);
76 tTask.type = TrackerTask.Type.ANSWER;
77 //Setting the interval
78 tTask.interval = Common.TRACKER_QUERY_INTERVAL;
79 //Sending the task back to the peer
80 tTask.dsend(tTask.mailbox);
88 catch (MsgException e) {
92 Msg.info("Tracker is leaving");