Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Incorporate simgrid-java in simgrid-java/.
[simgrid.git] / simgrid-java / examples / bittorrent / Tracker.java
1 /*
2  * Copyright 2006-2012. The SimGrid Team. All rights reserved. 
3  *
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. 
6  */
7 package bittorrent;
8 import java.util.ArrayList;
9 import java.util.Iterator;
10
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;
17
18 import org.simgrid.msg.RngStream;
19 /**
20  * Tracker, handle requests from peers.
21  */
22 public class Tracker extends Process {
23         protected RngStream stream;
24         /**
25          * Peers list
26          */
27         protected ArrayList<Integer> peersList;
28         /**
29          * End time for the simulation
30          */
31         protected double deadline;
32         /**
33          * Current comm received
34          */
35         protected Comm commReceived = null;
36         
37         public Tracker(Host host, String name, String[]args) {
38                 super(host,name,args);
39         }
40         
41         @Override
42         public void main(String[] args) throws MsgException {
43                 if (args.length != 1) {
44                         Msg.info("Wrong number of arguments for the tracker.");
45                         return;
46                 }
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>();
53                 
54                 Msg.info("Tracker launched.");          
55                 while (Msg.getClock() < deadline) {
56                         if (commReceived == null) {
57                                 commReceived = Task.irecv(Common.TRACKER_MAILBOX);
58                         }
59                         try {
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
65                                                 int nbPeers = 0;
66                                                 while (nbPeers < Common.MAXIMUM_PEERS && nbPeers < peersList.size()) {
67                                                         int nextPeer;
68                                                         do {
69                                                                 nextPeer = stream.randInt(0, peersList.size() - 1);
70                                                         } while (tTask.peers.contains(nextPeer));
71                                                         tTask.peers.add(peersList.get(nextPeer));
72                                                         nbPeers++;
73                                                 }
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);
81                                         }
82                                         commReceived = null;
83                                 }
84                                 else {
85                                         waitFor(1);
86                                 }
87                         }
88                         catch (MsgException e) {
89                                 commReceived = null;                            
90                         }
91                 }
92                 Msg.info("Tracker is leaving");
93         }
94
95 }