From 21822f259cfa608c31a1a365ffc17398b3eef125 Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Sun, 2 Nov 2014 14:30:06 -0800 Subject: [PATCH] Significantly improve speed of PC list updates --- app/libs/limelight-common.jar | Bin 423963 -> 418419 bytes .../computers/ComputerManagerService.java | 206 ++++++++++-------- 2 files changed, 111 insertions(+), 95 deletions(-) diff --git a/app/libs/limelight-common.jar b/app/libs/limelight-common.jar index 14f5ebbb4c712206cf9e904c53b5458f1c1819bc..fe52a2357cade0ebcd8d137e8e8c29590ab27290 100644 GIT binary patch delta 10450 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 delta 16056 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 pollingThreads; private ComputerManagerListener listener = null; private AtomicInteger activePolls = new AtomicInteger(0); private boolean stopped; @@ -60,6 +59,85 @@ public class ComputerManagerService extends Service { discoveryBinder = null; } }; + + // Returns true if the details object was modified + private boolean runPoll(ComputerDetails details) + { + boolean newPc = (details.name == null); + + // This is called from addComputerManually() where we don't + // want to block the initial poll if polling is disabled, so + // we explicitly let this through if we've never seen this + // PC before. This path won't be triggered normally when polling + // is disabled because the mDNS discovery is stopped. + if (stopped && !newPc) { + return false; + } + + if (!getLocalDatabaseReference()) { + return false; + } + + activePolls.incrementAndGet(); + + // Poll the machine + if (!doPollMachine(details)) { + details.state = ComputerDetails.State.OFFLINE; + details.reachability = ComputerDetails.Reachability.OFFLINE; + } + + activePolls.decrementAndGet(); + + // If it's online, update our persistent state + if (details.state == ComputerDetails.State.ONLINE) { + if (!newPc) { + // Check if it's in the database because it could have been + // removed after this was issued + if (dbManager.getComputerByName(details.name) == null) { + // It's gone + releaseLocalDatabaseReference(); + return true; + } + } + + dbManager.updateComputer(details); + } + + // Don't call the listener if this is a failed lookup of a new PC + if ((!newPc || details.state == ComputerDetails.State.ONLINE) && listener != null) { + listener.notifyComputerUpdated(details); + } + + releaseLocalDatabaseReference(); + return true; + } + + private Thread createPollingThread(final ComputerDetails details) { + Thread t = new Thread() { + @Override + public void run() { + while (!isInterrupted()) { + ComputerDetails originalDetails = new ComputerDetails(); + originalDetails.update(details); + + // Check if this poll has modified the details + if (runPoll(details) && !originalDetails.equals(details)) { + // Replace our thread entry with the new one + synchronized (pollingThreads) { + pollingThreads.remove(originalDetails); + pollingThreads.put(details, this); + } + } + + // Wait until the next polling interval + try { + Thread.sleep(POLLING_PERIOD_MS); + } catch (InterruptedException e) {} + } + } + }; + return t; + } public class ComputerManagerBinder extends Binder { public void startPolling(ComputerManagerListener listener) { @@ -73,8 +151,19 @@ public class ComputerManagerService extends Service { discoveryBinder.startDiscovery(MDNS_QUERY_PERIOD_MS); // Start polling known machines - pollingTimer = new Timer(); - pollingTimer.schedule(getTimerTask(), 0, POLLING_PERIOD_MS); + if (!getLocalDatabaseReference()) { + return; + } + List computerList = dbManager.getAllComputers(); + releaseLocalDatabaseReference(); + + synchronized (pollingThreads) { + for (ComputerDetails computer : computerList) { + Thread t = createPollingThread(computer); + pollingThreads.put(computer, t); + t.start(); + } + } } public void waitForReady() { @@ -128,10 +217,11 @@ public class ComputerManagerService extends Service { discoveryBinder.stopDiscovery(); // Stop polling - if (pollingTimer != null) { - pollingTimer.cancel(); - pollingTimer = null; - } + synchronized (pollingThreads) { + for (Thread t : pollingThreads.values()) { + t.interrupt(); + } + } // Remove the listener listener = null; @@ -159,17 +249,21 @@ public class ComputerManagerService extends Service { } }; } - + public void addComputer(InetAddress addr) { // Setup a placeholder ComputerDetails fakeDetails = new ComputerDetails(); fakeDetails.localIp = addr; fakeDetails.remoteIp = addr; - - // Put it in the thread pool to process later - pollingPool.execute(getPollingRunnable(fakeDetails)); + + // Spawn a thread for this computer + synchronized (pollingThreads) { + Thread t = createPollingThread(fakeDetails); + pollingThreads.put(fakeDetails, t); + t.start(); + } } - + public boolean addComputerBlocking(InetAddress addr) { // Setup a placeholder ComputerDetails fakeDetails = new ComputerDetails(); @@ -177,7 +271,7 @@ public class ComputerManagerService extends Service { fakeDetails.remoteIp = addr; // Block while we try to fill the details - getPollingRunnable(fakeDetails).run(); + runPoll(fakeDetails); // If the machine is reachable, it was successful return fakeDetails.state == ComputerDetails.State.ONLINE; @@ -209,23 +303,6 @@ public class ComputerManagerService extends Service { } } - private TimerTask getTimerTask() { - return new TimerTask() { - @Override - public void run() { - if (!getLocalDatabaseReference()) { - return; - } - List computerList = dbManager.getAllComputers(); - releaseLocalDatabaseReference(); - - for (ComputerDetails computer : computerList) { - pollingPool.execute(getPollingRunnable(computer)); - } - } - }; - } - private ComputerDetails tryPollIp(InetAddress ipAddr) { try { NvHTTP http = new NvHTTP(ipAddr, idManager.getUniqueId(), @@ -281,71 +358,13 @@ public class ComputerManagerService extends Service { return pollComputer(details, true); } - private Runnable getPollingRunnable(final ComputerDetails details) { - return new Runnable() { - - @Override - public void run() { - boolean newPc = (details.name == null); - - // This is called from addComputerManually() where we don't - // want to block the initial poll if polling is disabled, so - // we explicitly let this through if we've never seen this - // PC before. This path won't be triggered normally when polling - // is disabled because the mDNS discovery is stopped. - if (stopped && !newPc) { - return; - } - - if (!getLocalDatabaseReference()) { - return; - } - - activePolls.incrementAndGet(); - - // Poll the machine - if (!doPollMachine(details)) { - details.state = ComputerDetails.State.OFFLINE; - details.reachability = ComputerDetails.Reachability.OFFLINE; - } - - activePolls.decrementAndGet(); - - // If it's online, update our persistent state - if (details.state == ComputerDetails.State.ONLINE) { - if (!newPc) { - // Check if it's in the database because it could have been - // removed after this was issued - if (dbManager.getComputerByName(details.name) == null) { - // It's gone - releaseLocalDatabaseReference(); - return; - } - } - - dbManager.updateComputer(details); - } - - // Don't call the listener if this is a failed lookup of a new PC - if ((!newPc || details.state == ComputerDetails.State.ONLINE) && listener != null) { - listener.notifyComputerUpdated(details); - } - - releaseLocalDatabaseReference(); - } - }; - } - @Override public void onCreate() { // Bind to the discovery service bindService(new Intent(this, DiscoveryService.class), discoveryServiceConnection, Service.BIND_AUTO_CREATE); - - // Create the thread pool for updating computer state - pollingPool = new ThreadPoolExecutor(MAX_CONCURRENT_REQUESTS, MAX_CONCURRENT_REQUESTS, - Long.MAX_VALUE, TimeUnit.DAYS, new LinkedBlockingQueue(), - new ThreadPoolExecutor.DiscardPolicy()); + + pollingThreads = new HashMap(); // Lookup or generate this device's UID idManager = new IdentityManager(this); @@ -362,9 +381,6 @@ public class ComputerManagerService extends Service { unbindService(discoveryServiceConnection); } - // Stop the thread pool - pollingPool.shutdownNow(); - // FIXME: Should await termination here but we have timeout issues in HttpURLConnection // Remove the initial DB reference