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