src/jdk.internal.le/share/classes/jdk/internal/org/jline/utils/NonBlockingInputStreamImpl.java
author jlahoda
Mon, 04 Nov 2019 09:40:35 +0100
changeset 58903 eeb1c0da2126
parent 52938 5ff7480c9e28
permissions -rw-r--r--
8229815: Upgrade Jline to 3.12.1 Reviewed-by: rfield
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
52938
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
     1
/*
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
     2
 * Copyright (c) 2002-2018, the original author or authors.
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
     3
 *
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
     4
 * This software is distributable under the BSD license. See the terms of the
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
     5
 * BSD license in the documentation provided with this software.
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
     6
 *
58903
eeb1c0da2126 8229815: Upgrade Jline to 3.12.1
jlahoda
parents: 52938
diff changeset
     7
 * https://opensource.org/licenses/BSD-3-Clause
52938
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
     8
 */
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
     9
package jdk.internal.org.jline.utils;
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
    10
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
    11
import java.io.IOException;
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
    12
import java.io.InputStream;
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
    13
import java.io.InterruptedIOException;
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
    14
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
    15
/**
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
    16
 * This class wraps a regular input stream and allows it to appear as if it
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
    17
 * is non-blocking; that is, reads can be performed against it that timeout
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
    18
 * if no data is seen for a period of time.  This effect is achieved by having
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
    19
 * a separate thread perform all non-blocking read requests and then
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
    20
 * waiting on the thread to complete.
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
    21
 *
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
    22
 * <p>VERY IMPORTANT NOTES
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
    23
 * <ul>
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
    24
 *   <li> This class is not thread safe. It expects at most one reader.
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
    25
 *   <li> The {@link #shutdown()} method must be called in order to shut down
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
    26
 *          the thread that handles blocking I/O.
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
    27
 * </ul>
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
    28
 */
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
    29
public class NonBlockingInputStreamImpl
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
    30
    extends NonBlockingInputStream
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
    31
{
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
    32
    private InputStream in;                  // The actual input stream
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
    33
    private int         b = READ_EXPIRED;    // Recently read byte
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
    34
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
    35
    private String      name;
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
    36
    private boolean     threadIsReading      = false;
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
    37
    private IOException exception            = null;
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
    38
    private long        threadDelay          = 60 * 1000;
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
    39
    private Thread      thread;
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
    40
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
    41
    /**
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
    42
     * Creates a <code>NonBlockingReader</code> out of a normal blocking
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
    43
     * reader. Note that this call also spawn a separate thread to perform the
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
    44
     * blocking I/O on behalf of the thread that is using this class. The
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
    45
     * {@link #shutdown()} method must be called in order to shut this thread down.
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
    46
     * @param name The stream name
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
    47
     * @param in The reader to wrap
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
    48
     */
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
    49
    public NonBlockingInputStreamImpl(String name, InputStream in) {
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
    50
        this.in = in;
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
    51
        this.name = name;
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
    52
    }
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
    53
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
    54
    private synchronized void startReadingThreadIfNeeded() {
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
    55
        if (thread == null) {
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
    56
            thread = new Thread(this::run);
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
    57
            thread.setName(name + " non blocking reader thread");
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
    58
            thread.setDaemon(true);
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
    59
            thread.start();
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
    60
        }
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
    61
    }
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
    62
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
    63
    /**
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
    64
     * Shuts down the thread that is handling blocking I/O. Note that if the
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
    65
     * thread is currently blocked waiting for I/O it will not actually
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
    66
     * shut down until the I/O is received.
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
    67
     */
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
    68
    public synchronized void shutdown() {
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
    69
        if (thread != null) {
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
    70
            notify();
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
    71
        }
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
    72
    }
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
    73
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
    74
    @Override
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
    75
    public void close() throws IOException {
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
    76
        /*
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
    77
         * The underlying input stream is closed first. This means that if the
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
    78
         * I/O thread was blocked waiting on input, it will be woken for us.
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
    79
         */
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
    80
        in.close();
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
    81
        shutdown();
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
    82
    }
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
    83
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
    84
    /**
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
    85
     * Attempts to read a byte from the input stream for a specific
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
    86
     * period of time.
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
    87
     * @param timeout The amount of time to wait for the character
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
    88
     * @param isPeek <code>true</code>if the byte read must not be consumed
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
    89
     * @return The byte read, -1 if EOF is reached, or -2 if the
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
    90
     *   read timed out.
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
    91
     * @throws IOException if anything wrong happens
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
    92
     */
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
    93
    public synchronized int read(long timeout, boolean isPeek) throws IOException {
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
    94
        /*
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
    95
         * If the thread hit an IOException, we report it.
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
    96
         */
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
    97
        if (exception != null) {
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
    98
            assert b == READ_EXPIRED;
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
    99
            IOException toBeThrown = exception;
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
   100
            if (!isPeek)
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
   101
                exception = null;
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
   102
            throw toBeThrown;
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
   103
        }
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
   104
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
   105
        /*
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
   106
         * If there was a pending character from the thread, then
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
   107
         * we send it. If the timeout is 0L or the thread was shut down
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
   108
         * then do a local read.
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
   109
         */
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
   110
        if (b >= -1) {
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
   111
            assert exception == null;
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
   112
        }
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
   113
        else if (!isPeek && timeout <= 0L && !threadIsReading) {
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
   114
            b = in.read();
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
   115
        }
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
   116
        else {
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
   117
            /*
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
   118
             * If the thread isn't reading already, then ask it to do so.
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
   119
             */
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
   120
            if (!threadIsReading) {
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
   121
                threadIsReading = true;
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
   122
                startReadingThreadIfNeeded();
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
   123
                notifyAll();
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
   124
            }
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
   125
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
   126
            boolean isInfinite = (timeout <= 0L);
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
   127
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
   128
            /*
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
   129
             * So the thread is currently doing the reading for us. So
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
   130
             * now we play the waiting game.
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
   131
             */
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
   132
            while (isInfinite || timeout > 0L)  {
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
   133
                long start = System.currentTimeMillis ();
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
   134
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
   135
                try {
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
   136
                    if (Thread.interrupted()) {
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
   137
                        throw new InterruptedException();
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
   138
                    }
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
   139
                    wait(timeout);
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
   140
                }
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
   141
                catch (InterruptedException e) {
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
   142
                    exception = (IOException) new InterruptedIOException().initCause(e);
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
   143
                }
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
   144
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
   145
                if (exception != null) {
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
   146
                    assert b == READ_EXPIRED;
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
   147
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
   148
                    IOException toBeThrown = exception;
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
   149
                    if (!isPeek)
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
   150
                        exception = null;
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
   151
                    throw toBeThrown;
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
   152
                }
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
   153
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
   154
                if (b >= -1) {
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
   155
                    assert exception == null;
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
   156
                    break;
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
   157
                }
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
   158
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
   159
                if (!isInfinite) {
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
   160
                    timeout -= System.currentTimeMillis() - start;
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
   161
                }
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
   162
            }
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
   163
        }
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
   164
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
   165
        /*
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
   166
         * b is the character that was just read. Either we set it because
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
   167
         * a local read was performed or the read thread set it (or failed to
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
   168
         * change it).  We will return it's value, but if this was a peek
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
   169
         * operation, then we leave it in place.
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
   170
         */
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
   171
        int ret = b;
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
   172
        if (!isPeek) {
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
   173
            b = READ_EXPIRED;
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
   174
        }
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
   175
        return ret;
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
   176
    }
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
   177
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
   178
    private void run () {
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
   179
        Log.debug("NonBlockingInputStream start");
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
   180
        boolean needToRead;
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
   181
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
   182
        try {
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
   183
            while (true) {
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
   184
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
   185
                /*
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
   186
                 * Synchronize to grab variables accessed by both this thread
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
   187
                 * and the accessing thread.
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
   188
                 */
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
   189
                synchronized (this) {
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
   190
                    needToRead = this.threadIsReading;
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
   191
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
   192
                    try {
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
   193
                        /*
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
   194
                         * Nothing to do? Then wait.
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
   195
                         */
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
   196
                        if (!needToRead) {
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
   197
                            wait(threadDelay);
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
   198
                        }
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
   199
                    } catch (InterruptedException e) {
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
   200
                        /* IGNORED */
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
   201
                    }
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
   202
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
   203
                    needToRead = this.threadIsReading;
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
   204
                    if (!needToRead) {
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
   205
                        return;
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
   206
                    }
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
   207
                }
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
   208
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
   209
                /*
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
   210
                 * We're not shutting down, but we need to read. This cannot
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
   211
                 * happen while we are holding the lock (which we aren't now).
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
   212
                 */
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
   213
                int byteRead = READ_EXPIRED;
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
   214
                IOException failure = null;
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
   215
                try {
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
   216
                    byteRead = in.read();
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
   217
                } catch (IOException e) {
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
   218
                    failure = e;
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
   219
                }
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
   220
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
   221
                /*
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
   222
                 * Re-grab the lock to update the state.
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
   223
                 */
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
   224
                synchronized (this) {
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
   225
                    exception = failure;
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
   226
                    b = byteRead;
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
   227
                    threadIsReading = false;
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
   228
                    notify();
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
   229
                }
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
   230
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
   231
                // If end of stream, exit the loop thread
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
   232
                if (byteRead < 0) {
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
   233
                    return;
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
   234
                }
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
   235
            }
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
   236
        } catch (Throwable t) {
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
   237
            Log.warn("Error in NonBlockingInputStream thread", t);
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
   238
        } finally {
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
   239
            Log.debug("NonBlockingInputStream shutdown");
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
   240
            synchronized (this) {
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
   241
                thread = null;
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
   242
                threadIsReading = false;
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
   243
            }
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
   244
        }
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
   245
    }
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
   246
5ff7480c9e28 8214491: Upgrade to JLine 3.9.0
jlahoda
parents:
diff changeset
   247
}