diff --git a/src/main/java/com/aparapi/internal/kernel/KernelPreferences.java b/src/main/java/com/aparapi/internal/kernel/KernelPreferences.java index 3a82d67cb8ff3962de8b6844cf4ed86cacbedd5b..7b9922cdb369812798c3494a1a6155b4170d67bd 100644 --- a/src/main/java/com/aparapi/internal/kernel/KernelPreferences.java +++ b/src/main/java/com/aparapi/internal/kernel/KernelPreferences.java @@ -1,12 +1,12 @@ /** * Copyright (c) 2016 - 2017 Syncleus, Inc. - * + * <p> * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * + * <p> + * http://www.apache.org/licenses/LICENSE-2.0 + * <p> * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. @@ -22,70 +22,69 @@ import java.util.*; import java.util.concurrent.CopyOnWriteArrayList; public class KernelPreferences { - private final Class<? extends Kernel> kernelClass; - private final KernelManager manager; - private final List<Device> preferredDevices = new CopyOnWriteArrayList<>(); - private final LinkedHashSet<Device> failedDevices = new LinkedHashSet<>(); - - public KernelPreferences(KernelManager manager, Class<? extends Kernel> kernelClass) { - this.kernelClass = kernelClass; - this.manager = manager; - } - - /** What Kernel subclass is this the preferences for? */ - public Class<? extends Kernel> getKernelClass() { - return kernelClass; - } - - public List<Device> getPreferredDevices(Kernel kernel) { - maybeSetUpDefaultPreferredDevices(); - - if (kernel == null) { - return Collections.unmodifiableList(preferredDevices); - } - List<Device> localPreferredDevices = new ArrayList<>(); - ArrayList<Device> copy; - synchronized (preferredDevices) { - copy = new ArrayList(preferredDevices); - } - for (Device device : copy) { - if (kernel.isAllowDevice(device)) { - localPreferredDevices.add(device); - } - } - return Collections.unmodifiableList(localPreferredDevices); - } - - synchronized void setPreferredDevices(Collection<Device> _preferredDevices) { - //if (preferredDevices != null) { - preferredDevices.clear(); - preferredDevices.addAll(_preferredDevices); + public final Class<? extends Kernel> kernelClass; + private final KernelManager manager; + private final List<Device> preferredDevices = new CopyOnWriteArrayList<>(); + private final LinkedHashSet<Device> failedDevices = new LinkedHashSet<>(); + + public KernelPreferences(KernelManager manager, Class<? extends Kernel> kernelClass) { + this.kernelClass = kernelClass; + this.manager = manager; + } + + public List<Device> getPreferredDevices(Kernel kernel) { + + List<Device> p = this.preferredDevices; + + if (p.isEmpty()) { + p = setPreferredDevices(manager.getDefaultPreferences().getPreferredDevices(null)); + } + + if (kernel == null) { + return Collections.unmodifiableList(p); + } else { + + List<Device> localPreferredDevices = new ArrayList<>(); + for (int i = 0, pSize = p.size(); i < pSize; i++) { + Device device = p.get(i); + if (kernel.isAllowDevice(device)) { + localPreferredDevices.add(device); + } + } + return Collections.unmodifiableList(localPreferredDevices); + } + } + + List<Device> setPreferredDevices(Collection<Device> _preferredDevices) { + + synchronized (preferredDevices) { + preferredDevices.clear(); + preferredDevices.addAll(_preferredDevices); + failedDevices.clear(); + } + + return preferredDevices; + /*} else { preferredDevices = new LinkedList<>(_preferredDevices); }*/ - failedDevices.clear(); - } - - public Device getPreferredDevice(Kernel kernel) { - List<Device> localPreferredDevices = getPreferredDevices(kernel); - return localPreferredDevices.isEmpty() ? null : localPreferredDevices.get(0); - } - - synchronized void markPreferredDeviceFailed() { - if (preferredDevices.size() > 0) { - failedDevices.add(preferredDevices.remove(0)); - } - } - - private void maybeSetUpDefaultPreferredDevices() { - synchronized (this) { - if (preferredDevices.isEmpty()) - setPreferredDevices(manager.getDefaultPreferences().getPreferredDevices(null)); - } - } - - List<Device> getFailedDevices() { - return new ArrayList<>(failedDevices); - } + } + + public Device getPreferredDevice(Kernel kernel) { + List<Device> localPreferredDevices = getPreferredDevices(kernel); + return localPreferredDevices.isEmpty() ? null : localPreferredDevices.get(0); + } + + synchronized void markPreferredDeviceFailed() { + synchronized (preferredDevices) { + if (!preferredDevices.isEmpty()) { + failedDevices.add(preferredDevices.remove(0)); + } + } + } + + List<Device> getFailedDevices() { + return new ArrayList<>(failedDevices); + } }