view src/myVncProxy/MulticastQueue.java @ 109:3f73ebf918bd

add time out to avoid memory overlow caused by suspended clients.
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Fri, 05 Aug 2011 12:08:17 +0900
parents 0cbe556e2c54
children 7e60020f0a72
line wrap: on
line source

package myVncProxy;

import java.util.concurrent.CountDownLatch;

public class MulticastQueue<T>
{
	
	Node<T> tail;
	
	public MulticastQueue()
	{
		tail = new Node<T>(null);
	}
	
	public synchronized void put(T item)
	{
		Node<T> next = new Node<T>(item);
		tail.set(next);
		tail = next;
	}
	
	public Client<T> newClient()
	{
		return new Client<T>(tail);
	}
	
	static class Client<T>
	{
		Node<T> node;
		
		Client(Node<T> tail)
		{
			node = tail;
		}
		
		public T poll()
		{
			Node<T> next = null;
			T item = null;
			do {
				try {
					next = node.next();
				}catch(InterruptedException _e){
					continue;
				}
				item = node.getItem();
				node = next;
			} while ( item == null);
			return item;
		}
	}
	
	static class Node<T>
	{
		private T item;
		private Node<T> next;
		private CountDownLatch latch;
		
		public Node(T item)
		{
			this.item = item;
			this.next = null;
			latch = new CountDownLatch(1);
		}
		
		synchronized public T getItem() {
			return item;
		}

		public void set(Node<T> next)
		{
			this.next = next;
			latch.countDown();
		}
		
		public Node<T> next() throws InterruptedException
		{
			latch.await();
			return next;
		}

		synchronized public void clear() {
			item = null;
		}
	}
}