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 
25 package 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 
31 import java.util.LinkedList;
32 
33 public class MessageQueueBackend {
34   // The two queues
35   private MessageQueueImpl leftRightQueue;
36   private MessageQueueImpl rightLeftQueue;
37 
MessageQueueBackend()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. */
getFirstQueue()46   public MessageQueue getFirstQueue() {
47     return leftRightQueue;
48   }
49 
50   /** Get second of the two symmetric sides of this message queue. */
getSecondQueue()51   public MessageQueue getSecondQueue() {
52     return rightLeftQueue;
53   }
54 
55   private class MessageQueueImpl implements MessageQueue {
56     private LinkedList readList;
57     private LinkedList writeList;
58 
MessageQueueImpl(LinkedList listToReadFrom, LinkedList listToWriteTo)59     public MessageQueueImpl(LinkedList listToReadFrom, LinkedList listToWriteTo) {
60       readList = listToReadFrom;
61       writeList = listToWriteTo;
62     }
63 
readMessage()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 
readMessageWithTimeout(long millis)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 
writeMessage(Object obj)97     public void writeMessage(Object obj) {
98       synchronized(writeList) {
99         writeList.addLast(obj);
100         writeList.notify();
101       }
102     }
103   }
104 }
105