16224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala/*
26224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala * Copyright 2013 AndroidPlot.com
36224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala *
46224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala *    Licensed under the Apache License, Version 2.0 (the "License");
56224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala *    you may not use this file except in compliance with the License.
66224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala *    You may obtain a copy of the License at
76224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala *
86224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala *        http://www.apache.org/licenses/LICENSE-2.0
96224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala *
106224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala *    Unless required by applicable law or agreed to in writing, software
116224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala *    distributed under the License is distributed on an "AS IS" BASIS,
126224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
136224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala *    See the License for the specific language governing permissions and
146224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala *    limitations under the License.
156224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala */
166224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala
176224eda509d436a575f801942337da92a6c18767Eino-Ville Talvalapackage com.androidplot.util;
186224eda509d436a575f801942337da92a6c18767Eino-Ville Talvalaimport java.util.List;
196224eda509d436a575f801942337da92a6c18767Eino-Ville Talvalaimport java.util.Set;
206224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala
216224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala/**
226224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala * Utility class for obtaining synch lock across multiple objects.
236224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala */
246224eda509d436a575f801942337da92a6c18767Eino-Ville Talvalapublic abstract class MultiSynch {
256224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala
266224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala    /**
276224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala     * Callback class for doing work from within a MultiSynch.
286224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala     */
296224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala    public interface Action {
306224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala
316224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala        /**
326224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala         * Invoked by MultiSynch.run(...)
336224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala         * @param params
346224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala         */
356224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala        public void run(Object[] params);
366224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala    }
376224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala
386224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala
396224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala    /**
406224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala     *
416224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala     * @param params
426224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala     * @param synchSet Set of objects to be synchronized upon
436224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala     * @param action Action to be invoked once  full synchronization has been obtained.
446224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala     */
456224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala    public static void run(Object[] params, Set synchSet,  Action action) {
466224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala        run(params, synchSet.toArray(), action, 0);
476224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala    }
486224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala
496224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala    /**
506224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala     * @param params
516224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala     * @param synchList List of objects to be synchronized upon
526224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala     * @param action   Action to be invoked once  full synchronization has been obtained.
536224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala     */
546224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala    public static void run(Object[] params, List synchList, Action action) {
556224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala        run(params, synchList.toArray(), action, 0);
566224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala    }
576224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala
586224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala    /**
596224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala     * @param params
606224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala     * @param synchArr Array of objects to be synchronized upon
616224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala     * @param action   Action to be invoked once  full synchronization has been obtained.
626224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala     */
636224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala    public static void run(Object[] params, Object[] synchArr, Action action) {
646224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala        run(params, synchArr, action, 0);
656224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala    }
666224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala
676224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala    /**
686224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala     * Recursively synchs on each item in SynchList
696224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala     * @param params
706224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala     * @param synchArr
716224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala     * @param action
726224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala     * @param depth
736224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala     */
746224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala    private static void run(Object[] params, Object[] synchArr, Action action, int depth) {
756224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala        if (synchArr != null) {
766224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala            synchronized (synchArr[depth]) {
776224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala                if (depth < synchArr.length - 1) {
786224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala                    run(params, synchArr, action, ++depth);
796224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala                } else {
806224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala                    action.run(params);
816224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala                }
826224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala            }
836224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala        }
846224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala        action.run(params);
856224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala    }
866224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala}
87