001/*
002 * Copyright (c) 2012, 2014, Oracle and/or its affiliates. All rights reserved.
003 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
004 *
005 * This code is free software; you can redistribute it and/or modify it
006 * under the terms of the GNU General Public License version 2 only, as
007 * published by the Free Software Foundation.
008 *
009 * This code is distributed in the hope that it will be useful, but WITHOUT
010 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
011 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
012 * version 2 for more details (a copy is included in the LICENSE file that
013 * accompanied this code).
014 *
015 * You should have received a copy of the GNU General Public License version
016 * 2 along with this work; if not, write to the Free Software Foundation,
017 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
018 *
019 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
020 * or visit www.oracle.com if you need additional information or have any
021 * questions.
022 */
023package com.oracle.graal.compiler;
024
025import com.oracle.graal.compiler.CompilerThreadFactory.DebugConfigAccess;
026import com.oracle.graal.debug.*;
027
028/**
029 * A compiler thread is a daemon thread that runs at {@link Thread#MAX_PRIORITY} and executes in the
030 * context of a thread-local {@linkplain GraalDebugConfig debug configuration}.
031 */
032public class CompilerThread extends Thread {
033
034    private final DebugConfigAccess debugConfigAccess;
035
036    public CompilerThread(Runnable r, String namePrefix, DebugConfigAccess debugConfigAccess) {
037        super(r);
038        this.setName(namePrefix + "-" + this.getId());
039        this.setPriority(Thread.MAX_PRIORITY);
040        this.setDaemon(true);
041        this.debugConfigAccess = debugConfigAccess;
042    }
043
044    @Override
045    public void run() {
046        GraalDebugConfig debugConfig = debugConfigAccess.getDebugConfig();
047        setContextClassLoader(getClass().getClassLoader());
048        try {
049            super.run();
050        } finally {
051            if (debugConfig != null) {
052                for (DebugDumpHandler dumpHandler : debugConfig.dumpHandlers()) {
053                    try {
054                        dumpHandler.close();
055                    } catch (Throwable t) {
056                    }
057                }
058            }
059        }
060    }
061}