More robust method to unload classes.

In some situations there can be a concurrent modification error that
occurs when unloading the classes.
This commit is contained in:
tastybento 2020-03-13 19:47:26 -07:00
parent 0a86ddd0ab
commit b67dbf0cb9

View File

@ -6,6 +6,7 @@ import java.io.IOException;
import java.io.InputStreamReader; import java.io.InputStreamReader;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap; import java.util.HashMap;
import java.util.Iterator; import java.util.Iterator;
import java.util.LinkedHashMap; import java.util.LinkedHashMap;
@ -13,6 +14,7 @@ import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Objects; import java.util.Objects;
import java.util.Optional; import java.util.Optional;
import java.util.Set;
import java.util.jar.JarEntry; import java.util.jar.JarEntry;
import java.util.jar.JarFile; import java.util.jar.JarFile;
import java.util.logging.Level; import java.util.logging.Level;
@ -475,7 +477,10 @@ public class AddonsManager {
} }
// Clear loaders // Clear loaders
if (loaders.containsKey(addon)) { if (loaders.containsKey(addon)) {
loaders.get(addon).getClasses().forEach(classes::remove); Set<String> unmodifiableSet = Collections.unmodifiableSet(loaders.get(addon).getClasses());
for (String className : unmodifiableSet) {
classes.remove(className);
}
addon.setState(State.DISABLED); addon.setState(State.DISABLED);
loaders.remove(addon); loaders.remove(addon);
} }