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