Source: ../../rip/update_queue.hh
|
|
|
|
// -*- c-basic-offset: 4; tab-width: 8; indent-tabs-mode: t -*-
// Copyright (c) 2001-2009 XORP, Inc.
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License, Version 2, June
// 1991 as published by the Free Software Foundation. Redistribution
// and/or modification of this program under the terms of any other
// version of the GNU General Public License is not permitted.
//
// This program is distributed in the hope that it will be useful, but
// WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For more details,
// see the GNU General Public License, Version 2, a copy of which can be
// found in the XORP LICENSE.gpl file.
//
// XORP Inc, 2953 Bunker Hill Lane, Suite 204, Santa Clara, CA 95054, USA;
// http://xorp.net
// $XORP: xorp/rip/update_queue.hh,v 1.18 2009/01/05 18:31:08 jtc Exp $
#ifndef __RIP_UPDATE_QUEUE__
#define __RIP_UPDATE_QUEUE__
#include <vector>
#include "route_db.hh"
template <typename A>
class UpdateQueueImpl;
/**
* @short Reader for @ref UpdateQueue class.
*
* Hooks and unhooks read iterators in update queue. The opaque
* UpdateQueueReaderPool actually tracks the position of each iterator,
* this class just maintains a token that the reader pool uses.
*/
template <typename A>
class UpdateQueueReader {
public:
UpdateQueueReader(UpdateQueueImpl<A>* i);
~UpdateQueueReader();
uint32_t id() const;
bool parent_is(const UpdateQueueImpl<A>* o) const;
private:
UpdateQueueImpl<A>* _impl;
uint32_t _id;
};
/**
* @short Update Queue for RIP Route entries.
*
* The Update Queue has is conceptually a single writer multi-reader
* queue. It is used to store state for triggered updates and may be
* used unsolicited responses (routing table announcements).
*/
template <typename A>
class UpdateQueue {
protected:
typedef UpdateQueueReader<A> Reader;
public:
typedef ref_ptr<Reader> ReadIterator;
typedef RouteEntryRef<A> RouteUpdate;
public:
UpdateQueue();
~UpdateQueue();
/**
* Add update to back of queue.
*/
void push_back(const RouteUpdate& ru);
/**
* Remove all queued entries and reset all read iterators to the front
* of the queue.
*/
void flush();
/**
* Create a read iterator. These are reference counted entities that
* need to be stored in order to operate. The newly created reader is
* set to the end of the update queue.
*/
ReadIterator create_reader();
/**
* Destroy read iterator. This method detaches the iterator from the
* update queue. Use of the iterator after this call is unsafe.
*/
void destroy_reader(ReadIterator& r);
/**
* Check ReadIterator's validity.
* @param r reader to be checked.
* @return true if r is an active read iterator, false if iterator does
* not belong to this instance or has been destroyed.
*/
bool reader_valid(const ReadIterator& r);
/**
* Increment iterator and return pointer to entry if available.
*
* @return A pointer to a RouteEntry if available, 0 otherwise.
*/
const RouteEntry<A>* next(ReadIterator& r);
/**
* Get the RouteEntry associated with the read iterator.
*
* @return A pointer to a RouteEntry if available, 0 otherwise.
*/
const RouteEntry<A>* get(ReadIterator& r) const;
/**
* Advance read iterator to end of update queue. Calls to
* @ref next and @ref get will return 0 until further
* updates occur.
*/
void ffwd(ReadIterator& r);
/**
* Move read iterator to first entry of update queue.
*/
void rwd(ReadIterator& r);
/**
* Return number of updates held. Note: this may be more than are
* available for reading since there is internal buffering and
* UpdateQueue iterators attach at the end of the UpdateQueue.
*
* @return number of updates queued.
*/
uint32_t updates_queued() const;
protected:
UpdateQueueImpl<A>* _impl;
};
#endif // __RIP_UPDATE_QUEUE__
Generated by: pavlin on kobe.xorp.net on Wed Jan 7 19:11:10 2009, using kdoc 2.0a54+XORP.