From 0029753c361090fcb6985d7a083fce9b359e4c08 Mon Sep 17 00:00:00 2001 From: Aaron Griffith Date: Mon, 19 Dec 2011 23:20:10 -0500 Subject: [PATCH] first version of single-process dispatcher tracker: Issue #564 --- overviewer_core/dispatcher.py | 47 +++++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100644 overviewer_core/dispatcher.py diff --git a/overviewer_core/dispatcher.py b/overviewer_core/dispatcher.py new file mode 100644 index 0000000..8a4e19c --- /dev/null +++ b/overviewer_core/dispatcher.py @@ -0,0 +1,47 @@ +# This file is part of the Minecraft Overviewer. +# +# Minecraft Overviewer is free software: you can redistribute it and/or +# modify it under the terms of the GNU General Public License as published +# by the Free Software Foundation, either version 3 of the License, or (at +# your option) any later version. +# +# Minecraft Overviewer 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 General +# Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with the Overviewer. If not, see . + +import util + +class Dispatcher(object): + def render_all(self, tilesetlist, status_callback): + # TODO use status callback + + # preprocessing + for tileset in tilesetlist: + tileset.do_preprocessing() + + # iterate through all possible phases + num_phases = [tileset.get_num_phases() for tileset in tilesetlist] + for phase in xrange(max(num_phases)): + # construct a list of iterators to use for this phase + work_iterators = [] + for i, tileset in enumerate(tilesetlist): + if phase < num_phases[i]: + def make_work_iterator(tset, p): + return ((tset, workitem) for workitem in tset.iterate_work_items(p)) + work_iterators.append(make_work_iterator(tileset, phase)) + + # go through these iterators round-robin style + for tileset, workitem in util.roundrobin(work_iterators): + self.dispatch(tileset, workitem) + + # after each phase, wait for the jobs to finish + self.finish_jobs() + + def dispatch(self, tileset, workitem): + tileset.do_work(workitem) + def finish_jobs(self): + pass