package org.tanukisoftware.wrapper.test; /* * Copyright (c) 1999, 2009 Tanuki Software, Ltd. * http://www.tanukisoftware.com * All rights reserved. * * This software is the proprietary information of Tanuki Software. * You shall use it only in accordance with the terms of the * license agreement you entered into with Tanuki Software. * http://wrapper.tanukisoftware.org/doc/english/licenseOverview.html */ import java.io.IOException; import java.io.PrintStream; /** * A print stream which can be put into a state in which all calls to write * to it will result in the calling threads deadlocking in the call. * Obviously, this class will not be useful to many as it is for tests. * * @author Leif Mortenson <leif@tanukisoftware.com> */ public class DeadlockPrintStream extends PrintStream { /** The Wrapped PrintStream. */ private PrintStream m_out; /** True if calling threads should be deadlocked. */ private boolean m_deadlock; /*--------------------------------------------------------------- * Constructors *-------------------------------------------------------------*/ /** * Creates a new DeadlockPrintStream wrapped around another PrintStream. * * @param out The PrintStream which will be wrapped by this new stream. */ public DeadlockPrintStream( PrintStream out ) { super( out ); m_out = out; } /*--------------------------------------------------------------- * PrintStream Methods *-------------------------------------------------------------*/ public void write( int b ) { deadlock(); m_out.write( b ); } public void write( byte[] b ) throws IOException { deadlock(); m_out.write( b ); } public void write( byte[] b, int off, int len ) { deadlock(); m_out.write( b, off, len ); } public void flush() { deadlock(); m_out.flush(); } public void close() { deadlock(); m_out.close(); } /*--------------------------------------------------------------- * Methods *-------------------------------------------------------------*/ /** * This call will not return as long as the m_deadLock flag is set. * If it is ever cleared with a call to setDeadlock(), stuck threads * will all be released. */ private void deadlock() { if ( m_deadlock ) { synchronized( this ) { while( m_deadlock ) { try { this.wait(); } catch ( InterruptedException e ) { // Ignore } } } } } /** * Sets or clears the deadlock flag. If set, calls to any other method * of this class will result in the calling thread being deadlocked. * They will be released if the flag is cleared with this method. * * @param deadlock True to set the flag, false to clear it. */ public void setDeadlock( boolean deadlock ) { m_deadlock = deadlock; if ( !m_deadlock ) { synchronized( this ) { // Release any threads that are waiting. this.notifyAll(); } } } }