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 + -
显示快捷键?