blob: d1c8398c359897da13cca7e015709c92323ac792 [file] [log] [blame]
/* $Id$
*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to you under the Apache License, Version
* 2.0 (the "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef __ETCHCIRCULARQUEUE_H__
#define __ETCHCIRCULARQUEUE_H__
#include "capu/os/Time.h"
#include "capu/os/Mutex.h"
#include "capu/os/CondVar.h"
#include "common/EtchObject.h"
#include "support/EtchMailbox.h"
#include "transport/EtchWho.h"
#include "transport/EtchMessage.h"
/**
* A circular queue of a fixed size. Elements are added to one
* end and removed from the other, with the queue size ranging
* from empty to full. Operations can optionally wait until
* finished or return status indicating success or failure.
* For instance, adding to a full queue can wait until an item
* is removed before adding the new item or it can wait only
* a specified amount of time before completing successfully
* or giving up.
*/
class EtchCircularQueue {
public:
/**
* Constructs the CircularQueue.
*
* @param size the maximum number of items allowed in the queue.
*/
EtchCircularQueue(capu::uint32_t size);
/**
* Constructs the CircularQueue with the maximum number of items
* defaulted to 10.
*/
EtchCircularQueue();
/**
* Destructor
*/
virtual ~EtchCircularQueue();
/**
* @return the maximum number of items that may be put in the queue.
*/
capu::uint32_t getSize();
/////////////////////
// BASIC QUEUE OPS //
/////////////////////
/**
* @return the current number of items in the queue.
*/
capu::uint32_t getCount();
/**
* @return true if the queue is empty.
*/
capu::bool_t isEmpty();
/**
* @return true if the queue is full.
*/
capu::bool_t isFull();
//////////////////////
// PUBLIC QUEUE OPS //
//////////////////////
/**
* Gets the next available item from the queue, waiting
* until an item is available or the queue is closed.
*
* @param element an item from the queue or null if the queue
* is closed
* @return ETCH_OK if the item could be dequeued, ETCH_EINVAL if
* the param is invalid or ETCH_ERROR if the queue is closed.
*/
status_t get(EtchMailbox::EtchElement** element);
/**
* Gets the next available item from the queue, waiting
* until an item is available or the queue is closed.
*
* @param element an item from the queue or null if maxDelay
* has been exceeded or the queue is closed.
* @param maxDelay the maximum time in ms to wait for
* something to be put in the queue; 0 means wait forever,
* less than 0 means don't wait at all.
*
* @return ETCH_OK if the item could be dequeued, ETCH_EINVAL if
* the param is invalid, ETCH_TIMEOUT if maxDelay has been exceeded
* or ETCH_ERROR if an error occurred
*/
status_t get(EtchMailbox::EtchElement** element, capu::int32_t maxDelay);
/**
* Puts an item in the queue, waiting until space is available
* or the queue is closed.
*
* @param obj a non-null item to put in the queue.
*
* @return ETCH_OK if the item was placed in the queue, ETCH_EINVAL if
* the param is invalid or ETCH_ERROR if the queue is closed.
*/
status_t put(EtchMailbox::EtchElement* obj);
/**
* Puts an item in the queue, waiting until space is available
* or the queue is closed.
*
* @param obj a non-null item to put in the queue.
*
* @param maxDelay the maximum time in ms to wait for
* available space the queue; 0 means wait forever,
* less than 0 means don't wait at all.
*
* @return ETCH_OK if the item was placed in the queue,
* ETCH_TIMEOUT if maxDelay has been exceeded or ETCH_ERROR if an error occurred
*/
status_t put(EtchMailbox::EtchElement* obj, capu::int32_t maxDelay);
/**
* Closes the queue so that no more items may be put into it.
* Get will return null when there are no more items to return.
*/
void close();
/**
* @return true if the queue is closed.
*/
capu::bool_t isClosed();
private:
/**
* Gets the item at the head of the queue. Additionally, wakes
* up the next one waiting for the queue, either to get or put.
* @param element the item at the head of the queue
*
* @return ETCH_OK if the item could be dequeued, ETCH_EINVAL if the param is invalid
* or ETCH_ERROR if an error occurred
*/
status_t getAndNotify(EtchMailbox::EtchElement** element);
/**
* Puts the item at the tail of the queue. Additionally, wakes
* up the next one waiting for the queue, either to get or put.
* @param obj non-null item to put.
*
* @return ETCH_OK if the item was placed in the queue, ETCH_EINVAL if
* the param is invalid or ETCH_ERROR if the queue is closed.
*/
status_t putAndNotify(EtchMailbox::EtchElement* obj);
/**
* Gets the item at the head of the queue.
* @param element the item at the head of the queue.
*
* @return ETCH_OK if the item could be dequeued, ETCH_EINVAL if the param is invalid
* or ETCH_ERROR if an error occurred
*/
status_t get0(EtchMailbox::EtchElement** element);
/**
* Puts the item at the tail of the queue.
* @param obj non-null item to put.
*
* @return ETCH_OK if the item was placed in the queue, ETCH_EINVAL if
* the param is invalid or ETCH_ERROR if the queue is closed.
*/
status_t put0(EtchMailbox::EtchElement* obj);
EtchMailbox::EtchElement** mItems;
capu::CondVar mCondVar;
capu::Mutex mMutex;
capu::bool_t mClosed;
capu::uint32_t mCount;
capu::uint32_t mSize;
capu::uint32_t mHead;
capu::uint32_t mTail;
};
#endif /* ETCHCIRCULARQUEUE_H */