001: package com.protomatter.util;
002:
003: /**
004: * {{{ The Protomatter Software License, Version 1.0
005: * derived from The Apache Software License, Version 1.1
006: *
007: * Copyright (c) 1998-2002 Nate Sammons. All rights reserved.
008: *
009: * Redistribution and use in source and binary forms, with or without
010: * modification, are permitted provided that the following conditions
011: * are met:
012: *
013: * 1. Redistributions of source code must retain the above copyright
014: * notice, this list of conditions and the following disclaimer.
015: *
016: * 2. Redistributions in binary form must reproduce the above copyright
017: * notice, this list of conditions and the following disclaimer in
018: * the documentation and/or other materials provided with the
019: * distribution.
020: *
021: * 3. The end-user documentation included with the redistribution,
022: * if any, must include the following acknowledgment:
023: * "This product includes software developed for the
024: * Protomatter Software Project
025: * (http://protomatter.sourceforge.net/)."
026: * Alternately, this acknowledgment may appear in the software itself,
027: * if and wherever such third-party acknowledgments normally appear.
028: *
029: * 4. The names "Protomatter" and "Protomatter Software Project" must
030: * not be used to endorse or promote products derived from this
031: * software without prior written permission. For written
032: * permission, please contact support@protomatter.com.
033: *
034: * 5. Products derived from this software may not be called "Protomatter",
035: * nor may "Protomatter" appear in their name, without prior written
036: * permission of the Protomatter Software Project
037: * (support@protomatter.com).
038: *
039: * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
040: * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
041: * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
042: * DISCLAIMED. IN NO EVENT SHALL THE PROTOMATTER SOFTWARE PROJECT OR
043: * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
044: * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
045: * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
046: * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
047: * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
048: * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
049: * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
050: * SUCH DAMAGE. }}}
051: */
052:
053: import java.util.*;
054: import com.protomatter.pool.*;
055: import com.protomatter.syslog.Syslog;
056:
057: /**
058: * A thread-blocking queue. The <tt>getNextObject()</tt> method blocks until
059: * there's something added to the queue.
060: */
061: public final class BlockingQueue extends GrowingObjectPool {
062: /**
063: * Create a new queue.
064: */
065: public BlockingQueue() {
066: super (false);
067: try {
068: init(new Hashtable());
069: } catch (Exception x) {
070: // never get here.
071: Syslog.log(this , x);
072: }
073: }
074:
075: public ObjectPoolObject createObjectPoolObject() {
076: return null;
077: }
078:
079: /**
080: * Get the length of the queue (number of work elements yet to
081: * be processed).
082: */
083: public int getQueueLength() {
084: return getObjectPoolSize();
085: }
086:
087: /**
088: * Get the next object in the queue. This method blocks
089: * until something has been added.
090: */
091: public final Object getNextObject() {
092: BlockingQueueOPO o = null;
093: while (true) {
094: try {
095: o = (BlockingQueueOPO) checkout();
096: } catch (Exception x) {
097: ; // nothin to do here but try again.
098: }
099: if (o != null)
100: return o.getObject();
101: Thread.yield();
102: }
103: }
104:
105: /**
106: * Add an object to the queue. If there is a thread blocked waiting
107: * on the <tt>getNextObject()</tt> method, it will be un-blocked.
108: */
109: public final void add(Object object) {
110: try {
111: checkin(new BlockingQueueOPO(object));
112: } catch (Exception x) {
113: // never get here.
114: Syslog.log(this , x);
115: }
116: }
117:
118: private class BlockingQueueOPO implements ObjectPoolObject {
119: private Object object = null;
120: private boolean valid = true;
121:
122: public BlockingQueueOPO(Object o) {
123: this .object = o;
124: this .valid = true;
125: }
126:
127: public Object getObject() {
128: return this .object;
129: }
130:
131: public void deleteObjectPoolObject() {
132: this .valid = false;
133: }
134:
135: public boolean isObjectPoolObjectValid() {
136: return this .valid;
137: }
138:
139: public void beforeObjectPoolObjectCheckout() {
140: }
141:
142: public void afterObjectPoolObjectCheckin() {
143: }
144: }
145: }
|