/* * Copyright 2012, 2013 Hannes Janetzek * * This file is part of the OpenScienceMap project (http://www.opensciencemap.org). * * This program is free software: you can redistribute it and/or modify it under the * terms of the GNU Lesser General Public License as published by the Free Software * Foundation, either version 3 of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but WITHOUT ANY * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A * PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License along with * this program. If not, see <http://www.gnu.org/licenses/>. */ package org.oscim.layers.tile; import static org.oscim.layers.tile.MapTile.State.CANCEL; import static org.oscim.layers.tile.MapTile.State.LOADING; import static org.oscim.layers.tile.MapTile.State.NONE; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * A JobQueue keeps the list of pending jobs for a MapView and prioritizes them. */ public class JobQueue { static final Logger log = LoggerFactory.getLogger(JobQueue.class); private int mCurrentJob = 0; private MapTile[] mJobs; /** * @param tiles * the jobs to be added to this queue. */ public synchronized void setJobs(MapTile[] tiles) { mJobs = tiles; mCurrentJob = 0; } /** * Removes all jobs from this queue. */ public synchronized void clear() { if (mJobs == null) { mCurrentJob = 0; return; } MapTile[] tiles = mJobs; for (int i = mCurrentJob, n = mJobs.length; i < n; i++) { MapTile t = tiles[i]; if (t.state(LOADING | CANCEL)) { t.setState(NONE); } else { log.error("Wrong tile in queue {} {}", t, t.state()); } tiles[i] = null; } mCurrentJob = 0; mJobs = null; } /** * @return true if this queue contains no jobs, false otherwise. */ public synchronized boolean isEmpty() { return (mJobs == null); } /** * @return the most important job from this queue or null, if empty. */ public synchronized MapTile poll() { if (mJobs == null) return null; if (mCurrentJob == 0) { int len = mJobs.length; if (len > 1) TileDistanceSort.sort(mJobs, 0, len); } MapTile t = mJobs[mCurrentJob]; mJobs[mCurrentJob] = null; if (++mCurrentJob == mJobs.length) mJobs = null; return t; } }