// Copyright (c) 2009 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. package org.chromium.sdk.util; /** * Signals that a deadlock was about to happen. * <p> * Method may wait for some callback to receive a result from some worker * thread. If this method happened to be called from another callback * being run by the same thread this will block the thread forever because * method is never going to get result. Such situation may raise this * exception. * <p> * Currently this exception is never actually thrown so it gets more of * symbolic sense. Nevertheless it's still important to keep its declaration * because it helps to track which ones are blocking and which are not. * To do this, one should temporarily modify this class and make exception checked * (make it extend {@code java.lang.Exception}). This will enforce the proper * declaration of all blocking methods. * <p>Here are the simple rules: you never normally catch this exception, but * add throws declaration wherever needed; if your callback method needs to * throw it you are doing something wrong (i.e. calling blocking method from * a callback) and risk running into a deadlock; wherever you are * sure you are on a safe ground (not called from callback) and there is no * need in further tracking this exception, make a symbolic try/catch and * explain why you think it's safe, in a catch block: * <pre> * try { * makeSureAllScriptsAreLoaded(); * } catch (MethodIsBlockingException e) { * // I'm being called from my own thread, so it's ok if method blocks, * // I can wait * throw new RuntimeException(e); // never executed * } * </pre> * <p>By default, {@code MethodIsBlockingException} is unchecked exception, * so you may completely ignore it. */ public class MethodIsBlockingException extends RuntimeException { // We never actually instantiate this exception, because it's symbolic. private MethodIsBlockingException() {} }