103928aee4356845252ac6b662d5c72c29903813eJake Slack// 203928aee4356845252ac6b662d5c72c29903813eJake Slack// ======================================================================== 303928aee4356845252ac6b662d5c72c29903813eJake Slack// Copyright (c) 1995-2014 Mort Bay Consulting Pty. Ltd. 403928aee4356845252ac6b662d5c72c29903813eJake Slack// ------------------------------------------------------------------------ 503928aee4356845252ac6b662d5c72c29903813eJake Slack// All rights reserved. This program and the accompanying materials 603928aee4356845252ac6b662d5c72c29903813eJake Slack// are made available under the terms of the Eclipse Public License v1.0 703928aee4356845252ac6b662d5c72c29903813eJake Slack// and Apache License v2.0 which accompanies this distribution. 803928aee4356845252ac6b662d5c72c29903813eJake Slack// 903928aee4356845252ac6b662d5c72c29903813eJake Slack// The Eclipse Public License is available at 1003928aee4356845252ac6b662d5c72c29903813eJake Slack// http://www.eclipse.org/legal/epl-v10.html 1103928aee4356845252ac6b662d5c72c29903813eJake Slack// 1203928aee4356845252ac6b662d5c72c29903813eJake Slack// The Apache License v2.0 is available at 1303928aee4356845252ac6b662d5c72c29903813eJake Slack// http://www.opensource.org/licenses/apache2.0.php 1403928aee4356845252ac6b662d5c72c29903813eJake Slack// 1503928aee4356845252ac6b662d5c72c29903813eJake Slack// You may elect to redistribute this code under either of these licenses. 1603928aee4356845252ac6b662d5c72c29903813eJake Slack// ======================================================================== 1703928aee4356845252ac6b662d5c72c29903813eJake Slack// 1803928aee4356845252ac6b662d5c72c29903813eJake Slack 1903928aee4356845252ac6b662d5c72c29903813eJake Slack 2003928aee4356845252ac6b662d5c72c29903813eJake Slackpackage org.eclipse.jetty.util.preventers; 2103928aee4356845252ac6b662d5c72c29903813eJake Slack 2203928aee4356845252ac6b662d5c72c29903813eJake Slackimport org.eclipse.jetty.util.component.AbstractLifeCycle; 2303928aee4356845252ac6b662d5c72c29903813eJake Slackimport org.eclipse.jetty.util.log.Log; 2403928aee4356845252ac6b662d5c72c29903813eJake Slackimport org.eclipse.jetty.util.log.Logger; 2503928aee4356845252ac6b662d5c72c29903813eJake Slack 2603928aee4356845252ac6b662d5c72c29903813eJake Slack/** 2703928aee4356845252ac6b662d5c72c29903813eJake Slack * AbstractLeakPreventer 2803928aee4356845252ac6b662d5c72c29903813eJake Slack * 2903928aee4356845252ac6b662d5c72c29903813eJake Slack * Abstract base class for code that seeks to avoid pinning of webapp classloaders by using the jetty classloader to 3003928aee4356845252ac6b662d5c72c29903813eJake Slack * proactively call the code that pins them (generally pinned as static data members, or as static 3103928aee4356845252ac6b662d5c72c29903813eJake Slack * data members that are daemon threads (which use the context classloader)). 3203928aee4356845252ac6b662d5c72c29903813eJake Slack * 3303928aee4356845252ac6b662d5c72c29903813eJake Slack * Instances of subclasses of this class should be set with Server.addBean(), which will 3403928aee4356845252ac6b662d5c72c29903813eJake Slack * ensure that they are called when the Server instance starts up, which will have the jetty 3503928aee4356845252ac6b662d5c72c29903813eJake Slack * classloader in scope. 3603928aee4356845252ac6b662d5c72c29903813eJake Slack * 3703928aee4356845252ac6b662d5c72c29903813eJake Slack */ 3803928aee4356845252ac6b662d5c72c29903813eJake Slackpublic abstract class AbstractLeakPreventer extends AbstractLifeCycle 3903928aee4356845252ac6b662d5c72c29903813eJake Slack{ 4003928aee4356845252ac6b662d5c72c29903813eJake Slack protected static final Logger LOG = Log.getLogger(AbstractLeakPreventer.class); 4103928aee4356845252ac6b662d5c72c29903813eJake Slack 4203928aee4356845252ac6b662d5c72c29903813eJake Slack /* ------------------------------------------------------------ */ 4303928aee4356845252ac6b662d5c72c29903813eJake Slack abstract public void prevent(ClassLoader loader); 4403928aee4356845252ac6b662d5c72c29903813eJake Slack 4503928aee4356845252ac6b662d5c72c29903813eJake Slack 4603928aee4356845252ac6b662d5c72c29903813eJake Slack /* ------------------------------------------------------------ */ 4703928aee4356845252ac6b662d5c72c29903813eJake Slack @Override 4803928aee4356845252ac6b662d5c72c29903813eJake Slack protected void doStart() throws Exception 4903928aee4356845252ac6b662d5c72c29903813eJake Slack { 5003928aee4356845252ac6b662d5c72c29903813eJake Slack ClassLoader loader = Thread.currentThread().getContextClassLoader(); 5103928aee4356845252ac6b662d5c72c29903813eJake Slack try 5203928aee4356845252ac6b662d5c72c29903813eJake Slack { 5303928aee4356845252ac6b662d5c72c29903813eJake Slack Thread.currentThread().setContextClassLoader(getClass().getClassLoader()); 5403928aee4356845252ac6b662d5c72c29903813eJake Slack prevent(getClass().getClassLoader()); 5503928aee4356845252ac6b662d5c72c29903813eJake Slack super.doStart(); 5603928aee4356845252ac6b662d5c72c29903813eJake Slack } 5703928aee4356845252ac6b662d5c72c29903813eJake Slack finally 5803928aee4356845252ac6b662d5c72c29903813eJake Slack { 5903928aee4356845252ac6b662d5c72c29903813eJake Slack Thread.currentThread().setContextClassLoader(loader); 6003928aee4356845252ac6b662d5c72c29903813eJake Slack } 6103928aee4356845252ac6b662d5c72c29903813eJake Slack } 6203928aee4356845252ac6b662d5c72c29903813eJake Slack} 63