1/*
2 * Copyright (c) 2000, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation.
8 *
9 * This code is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
12 * version 2 for more details (a copy is included in the LICENSE file that
13 * accompanied this code).
14 *
15 * You should have received a copy of the GNU General Public License version
16 * 2 along with this work; if not, write to the Free Software Foundation,
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 *
23 */
24
25package sun.jvm.hotspot.utilities;
26
27/** The backend for the message queue abstraction. This class is
28    instantiated first and queried to provide the two "sides" of the
29    message queue. */
30
31import java.util.LinkedList;
32
33public class MessageQueueBackend {
34  // The two queues
35  private MessageQueueImpl leftRightQueue;
36  private MessageQueueImpl rightLeftQueue;
37
38  public MessageQueueBackend() {
39    LinkedList leftRightPipe = new LinkedList();
40    LinkedList rightLeftPipe = new LinkedList();
41    leftRightQueue = new MessageQueueImpl(rightLeftPipe, leftRightPipe);
42    rightLeftQueue = new MessageQueueImpl(leftRightPipe, rightLeftPipe);
43  }
44
45  /** Get one of the two symmetric sides of this message queue. */
46  public MessageQueue getFirstQueue() {
47    return leftRightQueue;
48  }
49
50  /** Get second of the two symmetric sides of this message queue. */
51  public MessageQueue getSecondQueue() {
52    return rightLeftQueue;
53  }
54
55  private class MessageQueueImpl implements MessageQueue {
56    private LinkedList readList;
57    private LinkedList writeList;
58
59    public MessageQueueImpl(LinkedList listToReadFrom, LinkedList listToWriteTo) {
60      readList = listToReadFrom;
61      writeList = listToWriteTo;
62    }
63
64    public Object readMessage() {
65      synchronized(readList) {
66        while (readList.isEmpty()) {
67          try {
68            readList.wait();
69          }
70          catch (InterruptedException e) {
71          }
72        }
73        return readList.removeFirst();
74      }
75    }
76
77    public Object readMessageWithTimeout(long millis) {
78      synchronized(readList) {
79        if (readList.isEmpty()) {
80          if (millis == 0) {
81            return null;
82          }
83          try {
84            readList.wait(millis);
85          }
86          catch (InterruptedException e) {
87          }
88        }
89        // If list is still empty after wait, return null
90        if (readList.isEmpty()) {
91          return null;
92        }
93        return readList.removeFirst();
94      }
95    }
96
97    public void writeMessage(Object obj) {
98      synchronized(writeList) {
99        writeList.addLast(obj);
100        writeList.notify();
101      }
102    }
103  }
104}
105