langtools/src/share/classes/com/sun/tools/sjavac/server/JavacServer.java
author alundblad
Tue, 17 Jun 2014 14:01:27 +0200
changeset 25299 b4a7dcd657f5
parent 24067 76e7b6bbbd85
permissions -rw-r--r--
8048594: The sjavac client/server protocol should be hidden behind an interface Reviewed-by: jfranck
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
15368
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
     1
/*
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
     2
 * Copyright (c) 2011-2012, Oracle and/or its affiliates. All rights reserved.
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
     4
 *
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
     7
 * published by the Free Software Foundation.  Oracle designates this
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
     8
 * particular file as subject to the "Classpath" exception as provided
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
     9
 * by Oracle in the LICENSE file that accompanied this code.
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
    10
 *
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
    11
 * This code is distributed in the hope that it will be useful, but WITHOUT
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
    12
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
    13
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
    14
 * version 2 for more details (a copy is included in the LICENSE file that
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
    15
 * accompanied this code).
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
    16
 *
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
    17
 * You should have received a copy of the GNU General Public License version
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
    18
 * 2 along with this work; if not, write to the Free Software Foundation,
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
    19
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
    20
 *
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
    21
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
    22
 * or visit www.oracle.com if you need additional information or have any
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
    23
 * questions.
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
    24
 */
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
    25
package com.sun.tools.sjavac.server;
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
    26
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
    27
import java.io.File;
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
    28
import java.io.IOException;
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
    29
import java.io.PrintWriter;
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
    30
import java.io.FileNotFoundException;
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
    31
import java.util.HashMap;
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
    32
import java.util.Map;
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
    33
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
    34
import java.net.InetAddress;
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
    35
import java.net.ServerSocket;
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
    36
import java.net.Socket;
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
    37
import java.util.ArrayList;
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
    38
import java.util.Random;
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
    39
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
    40
import com.sun.tools.sjavac.Util;
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
    41
import com.sun.tools.sjavac.ProblemException;
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
    42
import java.io.*;
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
    43
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
    44
/**
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
    45
 * The JavacServer class contains methods both to setup a server that responds to requests and methods to connect to this server.
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
    46
 *
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
    47
 * <p><b>This is NOT part of any supported API. If you write code that depends on this, you do so at your own risk. This code and its internal interfaces are
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
    48
 * subject to change or deletion without notice.</b></p>
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
    49
 */
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
    50
public class JavacServer {
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
    51
    // Responding to this tcp/ip port on localhost.
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
    52
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
    53
    private final ServerSocket serverSocket;
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
    54
    // The secret cookie shared between server and client through the port file.
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
    55
    private final long myCookie;
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
    56
    // When the server was started.
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
    57
    private long serverStart;
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
    58
    // Accumulated build time for all requests, not counting idle time.
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
    59
    private long totalBuildTime;
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
    60
    // The javac server specific log file.
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
    61
    PrintWriter theLog;
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
    62
    // The compiler pool that maintains the compiler threads.
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
    63
    CompilerPool compilerPool;
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
    64
    // For the client, all port files fetched, one per started javac server.
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
    65
    // Though usually only one javac server is started by a client.
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
    66
    private static Map<String, PortFile> allPortFiles;
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
    67
    private static Map<String, Long> maxServerMemory;
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
    68
    final static String PROTOCOL_COOKIE_VERSION = "----THE-COOKIE-V2----";
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
    69
    final static String PROTOCOL_CWD = "----THE-CWD----";
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
    70
    final static String PROTOCOL_ID = "----THE-ID----";
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
    71
    final static String PROTOCOL_ARGS = "----THE-ARGS----";
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
    72
    final static String PROTOCOL_SOURCES_TO_COMPILE = "----THE-SOURCES-TO-COMPILE----";
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
    73
    final static String PROTOCOL_VISIBLE_SOURCES = "----THE-VISIBLE-SOURCES----";
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
    74
    final static String PROTOCOL_END = "----THE-END----";
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
    75
    final static String PROTOCOL_STDOUT = "----THE-STDOUT----";
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
    76
    final static String PROTOCOL_STDERR = "----THE-STDERR----";
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
    77
    final static String PROTOCOL_PACKAGE_ARTIFACTS = "----THE-PACKAGE_ARTIFACTS----";
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
    78
    final static String PROTOCOL_PACKAGE_DEPENDENCIES = "----THE-PACKAGE_DEPENDENCIES----";
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
    79
    final static String PROTOCOL_PACKAGE_PUBLIC_APIS = "----THE-PACKAGE-PUBLIC-APIS----";
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
    80
    final static String PROTOCOL_SYSINFO = "----THE-SYSINFO----";
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
    81
    final static String PROTOCOL_RETURN_CODE = "----THE-RETURN-CODE----";
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
    82
    // Check if the portfile is gone, every 5 seconds.
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
    83
    static int CHECK_PORTFILE_INTERVAL = 5;
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
    84
    // Wait 2 seconds for response, before giving up on javac server.
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
    85
    static int CONNECTION_TIMEOUT = 2;
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
    86
    static int WAIT_BETWEEN_CONNECT_ATTEMPTS = 1;
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
    87
    static int MAX_NUM_CONNECT_ATTEMPTS = 3;
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
    88
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
    89
    /**
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
    90
     * Acquire the port file. Synchronized since several threads inside an smart javac wrapper client acquires the same port file at the same time.
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
    91
     */
25299
b4a7dcd657f5 8048594: The sjavac client/server protocol should be hidden behind an interface
alundblad
parents: 24067
diff changeset
    92
    public static synchronized PortFile getPortFile(String filename) throws FileNotFoundException {
15368
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
    93
        if (allPortFiles == null) {
22163
3651128c74eb 8030244: Update langtools to use Diamond
briangoetz
parents: 20241
diff changeset
    94
            allPortFiles = new HashMap<>();
15368
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
    95
        }
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
    96
        PortFile pf = allPortFiles.get(filename);
24067
76e7b6bbbd85 8035063: Option handling in sjavac needs to be rewritten
alundblad
parents: 22163
diff changeset
    97
76e7b6bbbd85 8035063: Option handling in sjavac needs to be rewritten
alundblad
parents: 22163
diff changeset
    98
        // Port file known. Does it still exist?
76e7b6bbbd85 8035063: Option handling in sjavac needs to be rewritten
alundblad
parents: 22163
diff changeset
    99
        if (pf != null) {
76e7b6bbbd85 8035063: Option handling in sjavac needs to be rewritten
alundblad
parents: 22163
diff changeset
   100
            try {
76e7b6bbbd85 8035063: Option handling in sjavac needs to be rewritten
alundblad
parents: 22163
diff changeset
   101
                if (!pf.exists())
76e7b6bbbd85 8035063: Option handling in sjavac needs to be rewritten
alundblad
parents: 22163
diff changeset
   102
                    pf = null;
76e7b6bbbd85 8035063: Option handling in sjavac needs to be rewritten
alundblad
parents: 22163
diff changeset
   103
            } catch (IOException ioex) {
76e7b6bbbd85 8035063: Option handling in sjavac needs to be rewritten
alundblad
parents: 22163
diff changeset
   104
                ioex.printStackTrace();
76e7b6bbbd85 8035063: Option handling in sjavac needs to be rewritten
alundblad
parents: 22163
diff changeset
   105
            }
76e7b6bbbd85 8035063: Option handling in sjavac needs to be rewritten
alundblad
parents: 22163
diff changeset
   106
        }
76e7b6bbbd85 8035063: Option handling in sjavac needs to be rewritten
alundblad
parents: 22163
diff changeset
   107
15368
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   108
        if (pf == null) {
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   109
            pf = new PortFile(filename);
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   110
            allPortFiles.put(filename, pf);
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   111
        }
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   112
        return pf;
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   113
    }
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   114
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   115
    /**
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   116
     * Get the cookie used for this server.
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   117
     */
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   118
    long getCookie() {
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   119
        return myCookie;
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   120
    }
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   121
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   122
    /**
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   123
     * Get the port used for this server.
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   124
     */
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   125
    int getPort() {
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   126
        return serverSocket.getLocalPort();
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   127
    }
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   128
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   129
    /**
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   130
     * Sum up the total build time for this javac server.
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   131
     */
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   132
    public void addBuildTime(long inc) {
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   133
        totalBuildTime += inc;
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   134
    }
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   135
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   136
    /**
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   137
     * Log this message.
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   138
     */
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   139
    public void log(String msg) {
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   140
        if (theLog != null) {
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   141
            theLog.println(msg);
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   142
        } else {
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   143
            System.err.println(msg);
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   144
        }
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   145
    }
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   146
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   147
    /**
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   148
     * Make sure the log is flushed.
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   149
     */
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   150
    public void flushLog() {
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   151
        if (theLog != null) {
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   152
            theLog.flush();
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   153
        }
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   154
    }
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   155
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   156
    /**
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   157
     * Start a server using a settings string. Typically: "--startserver:portfile=/tmp/myserver,poolsize=3" and the string "portfile=/tmp/myserver,poolsize=3"
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   158
     * is sent as the settings parameter. Returns 0 on success, -1 on failure.
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   159
     */
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   160
    public static int startServer(String settings, PrintStream err) {
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   161
        try {
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   162
            String portfile = Util.extractStringOption("portfile", settings);
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   163
            // The log file collects more javac server specific log information.
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   164
            String logfile = Util.extractStringOption("logfile", settings);
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   165
            // The stdouterr file collects all the System.out and System.err writes to disk.
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   166
            String stdouterrfile = Util.extractStringOption("stdouterrfile", settings);
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   167
            // We could perhaps use System.setOut and setErr here.
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   168
            // But for the moment we rely on the client to spawn a shell where stdout
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   169
            // and stderr are redirected already.
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   170
            // The pool size is a limit the number of concurrent compiler threads used.
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   171
            // The server might use less than these to avoid memory problems.
25299
b4a7dcd657f5 8048594: The sjavac client/server protocol should be hidden behind an interface
alundblad
parents: 24067
diff changeset
   172
            int defaultPoolSize = Runtime.getRuntime().availableProcessors();
b4a7dcd657f5 8048594: The sjavac client/server protocol should be hidden behind an interface
alundblad
parents: 24067
diff changeset
   173
            int poolsize = Util.extractIntOption("poolsize", settings, defaultPoolSize);
15368
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   174
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   175
            // How many seconds of inactivity will the server accept before quitting?
25299
b4a7dcd657f5 8048594: The sjavac client/server protocol should be hidden behind an interface
alundblad
parents: 24067
diff changeset
   176
            int keepalive = Util.extractIntOption("keepalive", settings, 120);
b4a7dcd657f5 8048594: The sjavac client/server protocol should be hidden behind an interface
alundblad
parents: 24067
diff changeset
   177
15368
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   178
            // The port file is locked and the server port and cookie is written into it.
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   179
            PortFile portFile = getPortFile(portfile);
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   180
            JavacServer s;
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   181
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   182
            synchronized (portFile) {
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   183
                portFile.lock();
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   184
                portFile.getValues();
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   185
                if (portFile.containsPortInfo()) {
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   186
                    err.println("Javac server not started because portfile exists!");
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   187
                    portFile.unlock();
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   188
                    return -1;
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   189
                }
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   190
                s = new JavacServer(poolsize, logfile);
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   191
                portFile.setValues(s.getPort(), s.getCookie());
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   192
                portFile.unlock();
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   193
            }
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   194
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   195
            // Run the server. Will delete the port file when shutting down.
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   196
            // It will shut down automatically when no new requests have come in
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   197
            // during the last 125 seconds.
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   198
            s.run(portFile, err, keepalive);
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   199
            // The run loop for the server has exited.
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   200
            return 0;
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   201
        } catch (Exception e) {
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   202
            e.printStackTrace(err);
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   203
            return -1;
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   204
        }
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   205
    }
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   206
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   207
    /**
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   208
     * Spawn the server instance.
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   209
     */
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   210
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   211
    private JavacServer(int poolSize, String logfile) throws IOException {
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   212
        serverStart = System.currentTimeMillis();
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   213
        // Create a server socket on a random port that is bound to the localhost/127.0.0.1 interface.
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   214
        // I.e only local processes can connect to this port.
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   215
        serverSocket = new ServerSocket(0, 128, InetAddress.getByName(null));
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   216
        compilerPool = new CompilerPool(poolSize, this);
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   217
        Random rnd = new Random();
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   218
        myCookie = rnd.nextLong();
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   219
        theLog = new PrintWriter(logfile);
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   220
        log("Javac server started. port=" + getPort() + " date=" + (new java.util.Date()) + " with poolsize=" + poolSize);
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   221
        flushLog();
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   222
    }
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   223
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   224
    /**
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   225
     * Fork a background process. Returns the command line used that can be printed if something failed.
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   226
     */
25299
b4a7dcd657f5 8048594: The sjavac client/server protocol should be hidden behind an interface
alundblad
parents: 24067
diff changeset
   227
    public static String fork(String sjavac, String portfile, String logfile, int poolsize, int keepalive,
b4a7dcd657f5 8048594: The sjavac client/server protocol should be hidden behind an interface
alundblad
parents: 24067
diff changeset
   228
            final PrintStream err, String stdouterrfile, boolean background)
15368
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   229
            throws IOException, ProblemException {
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   230
        if (stdouterrfile != null && stdouterrfile.trim().equals("")) {
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   231
            stdouterrfile = null;
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   232
        }
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   233
        final String startserver = "--startserver:portfile=" + portfile + ",logfile=" + logfile + ",stdouterrfile=" + stdouterrfile + ",poolsize=" + poolsize + ",keepalive="+ keepalive;
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   234
25299
b4a7dcd657f5 8048594: The sjavac client/server protocol should be hidden behind an interface
alundblad
parents: 24067
diff changeset
   235
        if (background) {
15368
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   236
            sjavac += "%20" + startserver;
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   237
            sjavac = sjavac.replaceAll("%20", " ");
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   238
            sjavac = sjavac.replaceAll("%2C", ",");
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   239
            // If the java/sh/cmd launcher fails the failure will be captured by stdouterr because of the redirection here.
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   240
            String[] cmd = {"/bin/sh", "-c", sjavac + " >> " + stdouterrfile + " 2>&1"};
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   241
            if (!(new File("/bin/sh")).canExecute()) {
22163
3651128c74eb 8030244: Update langtools to use Diamond
briangoetz
parents: 20241
diff changeset
   242
                ArrayList<String> wincmd = new ArrayList<>();
15368
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   243
                wincmd.add("cmd");
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   244
                wincmd.add("/c");
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   245
                wincmd.add("start");
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   246
                wincmd.add("cmd");
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   247
                wincmd.add("/c");
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   248
                wincmd.add(sjavac + " >> " + stdouterrfile + " 2>&1");
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   249
                cmd = wincmd.toArray(new String[wincmd.size()]);
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   250
            }
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   251
            Process pp = null;
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   252
            try {
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   253
                pp = Runtime.getRuntime().exec(cmd);
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   254
            } catch (Exception e) {
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   255
                e.printStackTrace(err);
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   256
                e.printStackTrace(new PrintWriter(stdouterrfile));
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   257
            }
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   258
            StringBuilder rs = new StringBuilder();
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   259
            for (String s : cmd) {
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   260
                rs.append(s + " ");
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   261
            }
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   262
            return rs.toString();
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   263
        }
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   264
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   265
        // Do not spawn a background server, instead run it within the same JVM.
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   266
        Thread t = new Thread() {
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   267
            @Override
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   268
            public void run() {
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   269
                try {
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   270
                    JavacServer.startServer(startserver, err);
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   271
                } catch (Throwable t) {
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   272
                    t.printStackTrace(err);
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   273
                }
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   274
            }
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   275
        };
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   276
        t.start();
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   277
        return "";
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   278
    }
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   279
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   280
    /**
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   281
     * Run the server thread until it exits. Either because of inactivity or because the port file has been deleted by someone else, or overtaken by some other
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   282
     * javac server.
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   283
     */
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   284
    private void run(PortFile portFile, PrintStream err, int keepalive) {
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   285
        boolean fileDeleted = false;
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   286
        long timeSinceLastCompile;
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   287
        try {
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   288
            // Every 5 second (check_portfile_interval) we test if the portfile has disappeared => quit
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   289
            // Or if the last request was finished more than 125 seconds ago => quit
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   290
            // 125 = seconds_of_inactivity_before_shutdown+check_portfile_interval
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   291
            serverSocket.setSoTimeout(CHECK_PORTFILE_INTERVAL*1000);
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   292
            for (;;) {
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   293
                try {
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   294
                    Socket s = serverSocket.accept();
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   295
                    CompilerThread ct = compilerPool.grabCompilerThread();
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   296
                    ct.setSocket(s);
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   297
                    compilerPool.execute(ct);
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   298
                    flushLog();
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   299
                } catch (java.net.SocketTimeoutException e) {
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   300
                    if (compilerPool.numActiveRequests() > 0) {
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   301
                        // Never quit while there are active requests!
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   302
                        continue;
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   303
                    }
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   304
                    // If this is the timeout after the portfile
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   305
                    // has been deleted by us. Then we truly stop.
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   306
                    if (fileDeleted) {
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   307
                        log("Quitting because of "+(keepalive+CHECK_PORTFILE_INTERVAL)+" seconds of inactivity!");
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   308
                        break;
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   309
                    }
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   310
                    // Check if the portfile is still there.
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   311
                    if (!portFile.exists()) {
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   312
                        // Time to quit because the portfile was deleted by another
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   313
                        // process, probably by the makefile that is done building.
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   314
                        log("Quitting because portfile was deleted!");
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   315
                        flushLog();
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   316
                        break;
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   317
                    }
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   318
                    // Check if portfile.stop is still there.
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   319
                    if (portFile.markedForStop()) {
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   320
                        // Time to quit because another process touched the file
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   321
                        // server.port.stop to signal that the server should stop.
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   322
                        // This is necessary on some operating systems that lock
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   323
                        // the port file hard!
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   324
                        log("Quitting because a portfile.stop file was found!");
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   325
                        portFile.delete();
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   326
                        flushLog();
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   327
                        break;
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   328
                    }
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   329
                    // Does the portfile still point to me?
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   330
                    if (!portFile.stillMyValues()) {
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   331
                        // Time to quit because another build has started.
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   332
                        log("Quitting because portfile is now owned by another javac server!");
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   333
                        flushLog();
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   334
                        break;
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   335
                    }
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   336
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   337
                    // Check how long since the last request finished.
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   338
                    long diff = System.currentTimeMillis() - compilerPool.lastRequestFinished();
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   339
                    if (diff < keepalive * 1000) {
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   340
                        // Do not quit if we have waited less than 120 seconds.
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   341
                        continue;
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   342
                    }
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   343
                    // Ok, time to quit because of inactivity. Perhaps the build
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   344
                    // was killed and the portfile not cleaned up properly.
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   345
                    portFile.delete();
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   346
                    fileDeleted = true;
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   347
                    log("" + keepalive + " seconds of inactivity quitting in "
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   348
                        + CHECK_PORTFILE_INTERVAL + " seconds!");
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   349
                    flushLog();
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   350
                    // Now we have a second 5 second grace
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   351
                    // period where javac remote requests
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   352
                    // that have loaded the data from the
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   353
                    // recently deleted portfile can connect
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   354
                    // and complete their requests.
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   355
                }
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   356
            }
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   357
        } catch (Exception e) {
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   358
            e.printStackTrace(err);
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   359
            e.printStackTrace(theLog);
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   360
            flushLog();
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   361
        } finally {
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   362
            compilerPool.shutdown();
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   363
        }
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   364
        long realTime = System.currentTimeMillis() - serverStart;
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   365
        log("Shutting down.");
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   366
        log("Total wall clock time " + realTime + "ms build time " + totalBuildTime + "ms");
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   367
        flushLog();
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   368
    }
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   369
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   370
    public static void cleanup(String... args) {
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   371
        String settings = Util.findServerSettings(args);
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   372
        if (settings == null) return;
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   373
        String portfile = Util.extractStringOption("portfile", settings);
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   374
        String background = Util.extractStringOption("background", settings);
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   375
        if (background != null && background.equals("false")) {
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   376
            // If the server runs within this jvm, then delete the portfile,
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   377
            // since this jvm is about to exit soon.
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   378
            File f = new File(portfile);
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   379
            f.delete();
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   380
        }
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   381
    }
2577ddb7e710 8004658: Add internal smart javac wrapper to solve JEP 139
ohrstrom
parents:
diff changeset
   382
}