From c2eb7b05b373de251433745ead8cbc319bc18d61 Mon Sep 17 00:00:00 2001 From: snowleo Date: Mon, 22 Apr 2013 01:23:21 +0300 Subject: [PATCH] Restrict EssentialsTimer to 10ms execution time --- .../earth2me/essentials/EssentialsTimer.java | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/Essentials/src/com/earth2me/essentials/EssentialsTimer.java b/Essentials/src/com/earth2me/essentials/EssentialsTimer.java index 95cf77521..f06db1c5e 100644 --- a/Essentials/src/com/earth2me/essentials/EssentialsTimer.java +++ b/Essentials/src/com/earth2me/essentials/EssentialsTimer.java @@ -14,6 +14,9 @@ public class EssentialsTimer implements Runnable private final transient Set onlineUsers = new HashSet(); private transient long lastPoll = System.currentTimeMillis(); private final transient LinkedList history = new LinkedList(); + private final int skip1 = 0; + private final int skip2 = 0; + private final long maxTime = 10 * 1000000; EssentialsTimer(final IEssentials ess) { @@ -23,6 +26,7 @@ public class EssentialsTimer implements Runnable @Override public void run() { + final long startTime = System.nanoTime(); final long currentTime = System.currentTimeMillis(); long timeSpent = (currentTime - lastPoll) / 1000; if (timeSpent == 0) @@ -39,8 +43,21 @@ public class EssentialsTimer implements Runnable history.add(tps); } lastPoll = currentTime; + int count = 0; for (Player player : ess.getServer().getOnlinePlayers()) { + count++; + if (skip1 > 0) + { + skip1--; + continue; + } + if (count % 10 == 0) { + if (System.nanoTime() - startTime > maxTime / 2) { + skip1 = count - 1; + break; + } + } try { final User user = ess.getUser(player); @@ -54,9 +71,22 @@ public class EssentialsTimer implements Runnable } } + count = 0; final Iterator iterator = onlineUsers.iterator(); while (iterator.hasNext()) { + count++; + if (skip2 > 0) + { + skip2--; + continue; + } + if (count % 10 == 0) { + if (System.nanoTime() - startTime > maxTime) { + skip2 = count - 1; + break; + } + } final User user = iterator.next(); if (user.getLastOnlineActivity() < currentTime && user.getLastOnlineActivity() > user.getLastLogout()) {