buffermanagerwritecollect.java
来自「java jdk 1.4的源码」· Java 代码 · 共 126 行
JAVA
126 行
/* * @(#)BufferManagerWriteCollect.java 1.12 03/01/23 * * Copyright 2003 Sun Microsystems, Inc. All rights reserved. * SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. */package com.sun.corba.se.internal.iiop;import java.util.Iterator;import java.util.NoSuchElementException;import java.util.LinkedList;import com.sun.corba.se.internal.orbutil.ORBConstants;import com.sun.corba.se.internal.iiop.messages.Message;import com.sun.corba.se.internal.iiop.messages.MessageBase;import com.sun.corba.se.internal.iiop.messages.FragmentMessage;/** * Initial implementation of the collect buffer manager. */public class BufferManagerWriteCollect extends BufferManagerWrite{ private BufferQueue queue = new BufferQueue(); private int initialFragmentSize; public BufferManagerWriteCollect(int initialFragmentSize) { this.stream = null; this.initialFragmentSize = initialFragmentSize; } public ByteBufferWithInfo getInitialBuffer (int size) { return new ByteBufferWithInfo(size); } public int getInitialBufferSize () { return initialFragmentSize; } // Set the fragment's "more fragments" bit to true, put it in the // queue, and allocate a new bbwi. public void overflow (ByteBufferWithInfo bbwi) { // Set the fragment's moreFragments field to true MessageBase.setFlag(bbwi.buf, Message.MORE_FRAGMENTS_BIT); // Enqueue the previous fragment queue.enqueue(bbwi); // Create a new bbwi ByteBufferWithInfo newBbwi = new ByteBufferWithInfo(getInitialBufferSize()); newBbwi.fragmented = true; stream.setByteBufferWithInfo(newBbwi); // Now we must marshal in the fragment header/GIOP header // REVISIT - we can optimize this by not creating the fragment message // each time. FragmentMessage header = stream.getMessage().createFragmentMessage(); header.write(stream); } // Send all fragments public void sendMessage () { // Enqueue the last fragment queue.enqueue(stream.getByteBufferWithInfo()); Iterator bufs = iterator(); IIOPConnection conn = (IIOPConnection)stream.getConnection(); // With the collect strategy, we must lock the connection // while fragments are being sent. This is so that there are // no interleved fragments in GIOP 1.1. // // Note that this thread must not call writeLock again in any // of its send methods! conn.writeLock(); //conn.createOutCallDescriptor(stream.getMessage().getRequestId()); conn.createOutCallDescriptor(MessageBase.getRequestId(stream.getMessage())); try { while (bufs.hasNext()) { stream.setByteBufferWithInfo((ByteBufferWithInfo)bufs.next()); conn.sendWithoutLock(stream); } } finally { conn.writeUnlock(); } } private Iterator iterator () { return new BufferManagerWriteCollectIterator(); } private class BufferManagerWriteCollectIterator implements Iterator { public boolean hasNext () { return queue.size() != 0; } public Object next () { return queue.dequeue(); } public void remove () { throw new UnsupportedOperationException(); } }}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?