--- /dev/null
+-- A SimGrid Lua implementation of the Bittorrent protocol.
+
+require("simgrid")
+
+common_tracker = {
+ MAXIMUM_PEERS = 50
+}
+
+
+
+function tracker(...)
+ tracker_data = {
+ peers_list = {},
+ deadline = 0,
+ comm_received = nil
+ }
+ -- Check the arguments
+ local args = {...}
+ if #args ~= 1 then
+ simgrid.info("Wrong number of arguments for the tracker")
+ end
+ -- Initialization of the random generator
+ math.randomseed(42)
+ -- Retrieve the end time
+ tracker_data.deadline = tonumber(args[1])
+
+ simgrid.info("Tracker launched")
+
+ local now = simgrid.get_clock()
+
+ tracker_data.comm_received = simgrid.task.irecv("tracker")
+ while now < tracker_data.deadline do
+ task, err = tracker_data.comm_received:test()
+ if task then
+ simgrid.debug("Received a request from " .. task.mailbox)
+ tracker_data.comm_received = simgrid.task.irecv("tracker")
+ -- Sending peers to the peer
+ local peers = {}
+ local i = 0
+ if #tracker_data.peers_list > 0 then
+ i = math.random(1,#tracker_data.peers_list)
+ end
+ while #peers < #tracker_data.peers_list and #peers < common_tracker.MAXIMUM_PEERS do
+ table.insert(peers,tracker_data.peers_list[i])
+ i = (i + 1) % #tracker_data.peers_list
+ end
+ task.type = "ANSWER"
+ task.peers = peers
+ -- Add the peer to our peer list
+ table.insert(tracker_data.peers_list,task.peer_id)
+ -- Setting the interval
+ task.interval = TRACKER_QUERY_INTERVAL
+ -- Sending the task back to the peer
+ task:dsend(task.mailbox)
+ else
+ simgrid.process.sleep(1)
+ now = simgrid.get_clock()
+ end
+ end
+
+ simgrid.info("Tracker is leaving")
+end