| /* |
| * Copyright (c) 1998, 2020 Oracle and/or its affiliates. All rights reserved. |
| * |
| * This program and the accompanying materials are made available under the |
| * terms of the Eclipse Public License v. 2.0 which is available at |
| * http://www.eclipse.org/legal/epl-2.0, |
| * or the Eclipse Distribution License v. 1.0 which is available at |
| * http://www.eclipse.org/org/documents/edl-v10.php. |
| * |
| * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause |
| */ |
| |
| // Contributors: |
| // Oracle - initial API and implementation from Oracle TopLink |
| package org.eclipse.persistence.testing.tests.clientserver; |
| |
| |
| // A simple thread-safe FirstInFirstOut queue (non-null objects only) |
| class FIFO { |
| // Parameter is a maximum number of objects in FIFO |
| public FIFO(int nSize) { |
| this.nSize = nSize; |
| objectArray = new Object[nSize]; |
| } |
| |
| public boolean isFull() { |
| return nCount == nSize; |
| } |
| |
| public boolean isEmpty() { |
| return nCount == 0; |
| } |
| |
| // Adds an object to FIFO. |
| // Returns true if successful. |
| // Returns false in two cases: |
| // 1. There is no room in FIFO; |
| // 2. Attempt to insert null; |
| public synchronized boolean insertTail(Object object) { |
| if (!isFull() && (object != null)) { |
| if (!isEmpty()) { |
| nTail = next(nTail); |
| } else if (nHead != nTail) { |
| error(); |
| } |
| |
| if (objectArray[nTail] == null) { |
| objectArray[nTail] = object; |
| nCount++; |
| return true; |
| } else { |
| error(); |
| return false; |
| } |
| } else { |
| return false; |
| } |
| } |
| |
| // Removes an object from FIFO. |
| // Returns the removed object, |
| // or null if FIFO empty. |
| public synchronized Object removeHead() { |
| Object head = null; |
| if (!isEmpty()) { |
| head = objectArray[nHead]; |
| if (head != null) { |
| objectArray[nHead] = null; |
| nCount--; |
| if (!isEmpty()) { |
| nHead = next(nHead); |
| } |
| } else { |
| error(); |
| } |
| } else if (nHead != nTail) { |
| error(); |
| } |
| |
| return head; |
| } |
| |
| protected int next(int i) { |
| return (i + 1) % nSize; |
| } |
| |
| // An error check - should NEVER happen. |
| // Checks that the class works as designed. |
| // Here are the invariants which if broken cause error() to be called: |
| // 1. nCount==0 ==> nHead==nTail; |
| // 2. The elements of objectArray not currently occupied should contain null. |
| // 3. Stored objects should be NON null. |
| private void error() { |
| System.out.println("FIFO error"); |
| } |
| |
| private int nTail; |
| private int nHead; |
| private int nCount; |
| private int nSize; |
| private Object[] objectArray; |
| } |