001: /*
002: * Mailbox.java
003: *
004: * Copyright (C) 2004 Peter Graves
005: * $Id: Mailbox.java,v 1.3 2004/09/13 18:10:30 asimon Exp $
006: *
007: * This program is free software; you can redistribute it and/or
008: * modify it under the terms of the GNU General Public License
009: * as published by the Free Software Foundation; either version 2
010: * of the License, or (at your option) any later version.
011: *
012: * This program is distributed in the hope that it will be useful,
013: * but WITHOUT ANY WARRANTY; without even the implied warranty of
014: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
015: * GNU General Public License for more details.
016: *
017: * You should have received a copy of the GNU General Public License
018: * along with this program; if not, write to the Free Software
019: * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
020: */
021:
022: package org.armedbear.lisp;
023:
024: import java.util.LinkedList;
025: import java.util.NoSuchElementException;
026:
027: public final class Mailbox extends LispObject {
028:
029: private LinkedList box = new LinkedList();
030:
031: private void send(LispObject o) {
032: synchronized (this ) {
033: box.add(o);
034: notifyAll();
035: }
036: }
037:
038: private LispObject read() {
039: while (box.isEmpty())
040: synchronized (this ) {
041: try {
042: wait();
043: } catch (InterruptedException e) {
044: throw new RuntimeException(e);
045: }
046: }
047: return (LispObject) box.removeFirst();
048: }
049:
050: private LispObject peek() {
051: synchronized (this ) {
052: try {
053: return (LispObject) box.getFirst();
054: } catch (NoSuchElementException e) {
055: return NIL;
056: }
057: }
058: }
059:
060: private LispObject empty() {
061: return box.isEmpty() ? T : NIL;
062: }
063:
064: public String toString() {
065: StringBuffer sb = new StringBuffer("#<MAILBOX @ #x");
066: sb.append(Integer.toHexString(hashCode()));
067: sb.append(">");
068: return sb.toString();
069: }
070:
071: // ### make-mailbox
072: private static final Primitive0 MAKE_MAILBOX = new Primitive0(
073: "make-mailbox", PACKAGE_EXT, true, "") {
074: public LispObject execute() throws ConditionThrowable {
075: return new Mailbox();
076: }
077: };
078:
079: // ### mailbox-send mailbox object
080: private static final Primitive2 MAILBOX_SEND = new Primitive2(
081: "mailbox-send", PACKAGE_EXT, true, "mailbox object") {
082: public LispObject execute(LispObject first, LispObject second)
083: throws ConditionThrowable {
084: if (first instanceof Mailbox) {
085: Mailbox mbox = (Mailbox) first;
086: mbox.send(second);
087: return T;
088: } else
089: return signal(new TypeError(first, "Mailbox"));
090: }
091: };
092:
093: // ### mailbox-read mailbox
094: private static final Primitive1 MAILBOX_READ = new Primitive1(
095: "mailbox-read", PACKAGE_EXT, true, "mailbox") {
096: public LispObject execute(LispObject arg)
097: throws ConditionThrowable {
098: if (arg instanceof Mailbox) {
099: Mailbox mbox = (Mailbox) arg;
100: return mbox.read();
101: } else
102: return signal(new TypeError(arg, "Mailbox"));
103: }
104: };
105:
106: // ### mailbox-peek mailbox
107: private static final Primitive1 MAILBOX_PEEK = new Primitive1(
108: "mailbox-peek", PACKAGE_EXT, true, "mailbox") {
109: public LispObject execute(LispObject arg)
110: throws ConditionThrowable {
111: if (arg instanceof Mailbox) {
112: Mailbox mbox = (Mailbox) arg;
113: return mbox.peek();
114: } else
115: return signal(new TypeError(arg, "Mailbox"));
116: }
117: };
118:
119: // ### mailbox-empty-p mailbox
120: private static final Primitive1 MAILBOX_EMPTY_P = new Primitive1(
121: "mailbox-empty-p", PACKAGE_EXT, true, "mailbox") {
122: public LispObject execute(LispObject arg)
123: throws ConditionThrowable {
124: if (arg instanceof Mailbox) {
125: Mailbox mbox = (Mailbox) arg;
126: return mbox.empty();
127: } else
128: return signal(new TypeError(arg, "Mailbox"));
129: }
130: };
131: }
|