src/share/classes/sun/rmi/transport/tcp/ConnectionMultiplexer.java

Print this page

        

*** 83,93 **** /** layered stream for writing formatted data to underlying connection */ private DataOutputStream dataOut; /** table holding currently open connection IDs and related info */ ! private Hashtable connectionTable = new Hashtable(7); /** number of currently open connections */ private int numConnections = 0; /** maximum allowed open connections */ --- 83,93 ---- /** layered stream for writing formatted data to underlying connection */ private DataOutputStream dataOut; /** table holding currently open connection IDs and related info */ ! private Hashtable<Integer, MultiplexConnectionInfo> connectionTable = new Hashtable<>(7); /** number of currently open connections */ private int numConnections = 0; /** maximum allowed open connections */
*** 129,139 **** */ public void run() throws IOException { try { int op, id, length; - Integer idObj; MultiplexConnectionInfo info; while (true) { // read next op code from remote endpoint --- 129,138 ----
*** 146,166 **** if (multiplexLog.isLoggable(Log.VERBOSE)) { multiplexLog.log(Log.VERBOSE, "operation OPEN " + id); } ! idObj = new Integer(id); ! info = ! (MultiplexConnectionInfo) connectionTable.get(idObj); if (info != null) throw new IOException( "OPEN: Connection ID already exists"); info = new MultiplexConnectionInfo(id); info.in = new MultiplexInputStream(this, info, 2048); info.out = new MultiplexOutputStream(this, info, 2048); synchronized (connectionTable) { ! connectionTable.put(idObj, info); ++ numConnections; } sun.rmi.transport.Connection conn; conn = new TCPConnection(channel, info.in, info.out); channel.acceptMultiplexConnection(conn); --- 145,163 ---- if (multiplexLog.isLoggable(Log.VERBOSE)) { multiplexLog.log(Log.VERBOSE, "operation OPEN " + id); } ! info = connectionTable.get(id); if (info != null) throw new IOException( "OPEN: Connection ID already exists"); info = new MultiplexConnectionInfo(id); info.in = new MultiplexInputStream(this, info, 2048); info.out = new MultiplexOutputStream(this, info, 2048); synchronized (connectionTable) { ! connectionTable.put(id, info); ++ numConnections; } sun.rmi.transport.Connection conn; conn = new TCPConnection(channel, info.in, info.out); channel.acceptMultiplexConnection(conn);
*** 172,193 **** if (multiplexLog.isLoggable(Log.VERBOSE)) { multiplexLog.log(Log.VERBOSE, "operation CLOSE " + id); } ! idObj = new Integer(id); ! info = ! (MultiplexConnectionInfo) connectionTable.get(idObj); if (info == null) throw new IOException( "CLOSE: Invalid connection ID"); info.in.disconnect(); info.out.disconnect(); if (!info.closed) sendCloseAck(info); synchronized (connectionTable) { ! connectionTable.remove(idObj); -- numConnections; } break; // remote endpoint acknowledging close of connection --- 169,188 ---- if (multiplexLog.isLoggable(Log.VERBOSE)) { multiplexLog.log(Log.VERBOSE, "operation CLOSE " + id); } ! info = connectionTable.get(id); if (info == null) throw new IOException( "CLOSE: Invalid connection ID"); info.in.disconnect(); info.out.disconnect(); if (!info.closed) sendCloseAck(info); synchronized (connectionTable) { ! connectionTable.remove(id); -- numConnections; } break; // remote endpoint acknowledging close of connection
*** 197,229 **** if (multiplexLog.isLoggable(Log.VERBOSE)) { multiplexLog.log(Log.VERBOSE, "operation CLOSEACK " + id); } ! idObj = new Integer(id); ! info = ! (MultiplexConnectionInfo) connectionTable.get(idObj); if (info == null) throw new IOException( "CLOSEACK: Invalid connection ID"); if (!info.closed) throw new IOException( "CLOSEACK: Connection not closed"); info.in.disconnect(); info.out.disconnect(); synchronized (connectionTable) { ! connectionTable.remove(idObj); -- numConnections; } break; // remote endpoint declaring additional bytes receivable case REQUEST: id = dataIn.readUnsignedShort(); ! idObj = new Integer(id); ! info = ! (MultiplexConnectionInfo) connectionTable.get(idObj); if (info == null) throw new IOException( "REQUEST: Invalid connection ID"); length = dataIn.readInt(); --- 192,220 ---- if (multiplexLog.isLoggable(Log.VERBOSE)) { multiplexLog.log(Log.VERBOSE, "operation CLOSEACK " + id); } ! info = connectionTable.get(id); if (info == null) throw new IOException( "CLOSEACK: Invalid connection ID"); if (!info.closed) throw new IOException( "CLOSEACK: Connection not closed"); info.in.disconnect(); info.out.disconnect(); synchronized (connectionTable) { ! connectionTable.remove(id); -- numConnections; } break; // remote endpoint declaring additional bytes receivable case REQUEST: id = dataIn.readUnsignedShort(); ! info = connectionTable.get(id); if (info == null) throw new IOException( "REQUEST: Invalid connection ID"); length = dataIn.readInt();
*** 236,248 **** break; // remote endpoint transmitting data packet case TRANSMIT: id = dataIn.readUnsignedShort(); ! idObj = new Integer(id); ! info = ! (MultiplexConnectionInfo) connectionTable.get(idObj); if (info == null) throw new IOException("SEND: Invalid connection ID"); length = dataIn.readInt(); if (multiplexLog.isLoggable(Log.VERBOSE)) { --- 227,237 ---- break; // remote endpoint transmitting data packet case TRANSMIT: id = dataIn.readUnsignedShort(); ! info = connectionTable.get(id); if (info == null) throw new IOException("SEND: Invalid connection ID"); length = dataIn.readInt(); if (multiplexLog.isLoggable(Log.VERBOSE)) {
*** 271,292 **** { // generate ID that should not be already used // If all possible 32768 IDs are used, // this method will block searching for a new ID forever. int id; - Integer idObj; do { lastID = (++ lastID) & 0x7FFF; id = lastID; // The orig flag (copied to the high bit of the ID) is used // to have two distinct ranges to choose IDs from for the // two endpoints. if (orig) id |= 0x8000; ! idObj = new Integer(id); ! } while (connectionTable.get(idObj) != null); // create multiplexing streams and bookkeeping information MultiplexConnectionInfo info = new MultiplexConnectionInfo(id); info.in = new MultiplexInputStream(this, info, 2048); info.out = new MultiplexOutputStream(this, info, 2048); --- 260,279 ---- { // generate ID that should not be already used // If all possible 32768 IDs are used, // this method will block searching for a new ID forever. int id; do { lastID = (++ lastID) & 0x7FFF; id = lastID; // The orig flag (copied to the high bit of the ID) is used // to have two distinct ranges to choose IDs from for the // two endpoints. if (orig) id |= 0x8000; ! } while (connectionTable.get(id) != null); // create multiplexing streams and bookkeeping information MultiplexConnectionInfo info = new MultiplexConnectionInfo(id); info.in = new MultiplexInputStream(this, info, 2048); info.out = new MultiplexOutputStream(this, info, 2048);
*** 296,306 **** if (!alive) throw new IOException("Multiplexer connection dead"); if (numConnections >= maxConnections) throw new IOException("Cannot exceed " + maxConnections + " simultaneous multiplexed connections"); ! connectionTable.put(idObj, info); ++ numConnections; } // inform remote endpoint of new connection synchronized (dataOut) { --- 283,293 ---- if (!alive) throw new IOException("Multiplexer connection dead"); if (numConnections >= maxConnections) throw new IOException("Cannot exceed " + maxConnections + " simultaneous multiplexed connections"); ! connectionTable.put(id, info); ++ numConnections; } // inform remote endpoint of new connection synchronized (dataOut) {
*** 329,342 **** // return if multiplexer already officially dead if (!alive) return; alive = false; ! Enumeration enum_ = connectionTable.elements(); while (enum_.hasMoreElements()) { ! MultiplexConnectionInfo info = ! (MultiplexConnectionInfo) enum_.nextElement(); info.in.disconnect(); info.out.disconnect(); } connectionTable.clear(); numConnections = 0; --- 316,329 ---- // return if multiplexer already officially dead if (!alive) return; alive = false; ! Enumeration<MultiplexConnectionInfo> enum_ = ! connectionTable.elements(); while (enum_.hasMoreElements()) { ! MultiplexConnectionInfo info = enum_.nextElement(); info.in.disconnect(); info.out.disconnect(); } connectionTable.clear(); numConnections = 0;