35 *duplicate = cmp(rt_update);
79 }
else if (!uplist->
History()->empty()) {
96 for (UpdateList::List::iterator iter = list->begin();
97 iter != list->end(); iter++) {
100 delete temp_rt_update;
134 if (dbstate == NULL) {
145 if (dbstate == NULL) {
151 if (rstate != NULL) {
157 if (rt_update != NULL) {
184 for (AdvertiseSList::List::const_iterator iter = adv_slist->begin();
185 iter != adv_slist->end(); ++iter) {
186 mcurrent->
Set(iter->bitset);
202 for (AdvertiseSList::List::const_iterator iter = adv_slist->begin();
203 iter != adv_slist->end(); ++iter) {
204 mcurrent->
Set(iter->bitset);
211 for (UpdateInfoSList::List::const_iterator iter = uinfo_slist->begin();
212 iter != uinfo_slist->end(); ++iter) {
213 mscheduled->
Set(iter->target);
227 for (AdvertiseSList::List::const_iterator iter = adv_slist->begin();
228 iter != adv_slist->end(); ++iter) {
229 mcurrent->
Set(iter->bitset);
233 for (UpdateList::List::const_iterator iter = list->begin();
234 iter != list->end(); ++iter) {
255 if (dbstate == NULL) {
266 if (dbstate == NULL) {
272 if (rstate != NULL) {
279 if (rt_update != NULL) {
281 mcurrent, mscheduled);
287 if (uplist != NULL) {
289 mcurrent, mscheduled);
337 queue->
Dequeue(current_rt_update);
339 assert(rt_update->
Updates()->empty());
366 if (current_rt_update) {
368 queue->
Dequeue(current_rt_update);
370 assert(rt_update->
Updates()->empty());
401 if (dbstate == NULL) {
407 if (rstate != NULL) {
413 if (current_rt_update != NULL) {
420 if (uplist != NULL) {
441 for (AdvertiseSList::List::iterator iter = adv_slist->begin();
442 iter != adv_slist->end(); ) {
443 iter->bitset.Reset(clear);
444 if (iter->bitset.empty()) {
461 for (UpdateInfoSList::List::iterator iter = uinfo_slist->begin();
462 iter != uinfo_slist->end(); ) {
463 iter->target.Reset(clear);
464 if (iter->target.empty()) {
514 if (!rt_update->
Updates()->empty()) {
519 if (!rt_update->
History()->empty()) {
555 for (UpdateList::List::iterator iter = list->begin();
556 iter != list->end(); ) {
559 if (rt_update->
Updates()->empty()) {
567 if (list->size() > 1) {
570 }
else if (list->size() == 1) {
578 }
else if (!uplist->
History()->empty()) {
605 if (dbstate == NULL) {
617 if (dbstate == NULL) {
623 if (rstate != NULL) {
630 if (rt_update != NULL) {
631 bool delete_rt_update =
633 if (delete_rt_update) {
673 return queue->
Enqueue(rt_update);
702 if (!next_rt_update && upentry->
IsUpdate()) {
723 if (next_upentry != NULL && next_upentry->
IsUpdate()) {
747 rt_update = next_uinfo->
update;
750 *next_uinfo_p = next_uinfo;
boost::function< bool(const RouteUpdate *)> UpdateCmp
RouteUpdate * MakeRouteUpdate()
RouteUpdate * NextUpdate(UpdateEntry *upentry)
DBState * GetRouteUpdateAndDequeue(DBEntryBase *db_entry, RouteUpdate *rt_update, UpdateCmp cmp, bool *duplicate)
DBState * GetState(DBTableBase *tbl_base, ListenerId listener) const
void SetEntryState(DBEntryBase *db_entry, DBState *dbstate)
void set_queue_id(int queue_id)
DBState * GetUpdateListAndDequeue(DBEntryBase *db_entry, UpdateList *uplist)
void MoveHistory(RouteUpdate *rt_update)
void SetState(DBTableBase *tbl_base, ListenerId listener, DBState *state)
bool RouteStateMergeUpdate(DBEntryBase *db_entry, RouteUpdate *rt_update, RouteState *rstate)
void AddUpdate(RouteUpdate *rt_update)
RibUpdateMonitor(RibOut *ribout, QueueVec *queue_vec)
UpdateEntry * NextEntry(UpdateEntry *upentry)
DBState * GetDBStateAndDequeue(DBEntryBase *db_entry, UpdateCmp cmp, bool *duplicate)
static void RouteStateCurrent(const RouteState *rstate, RibPeerSet *mcurrent)
UpdateMarker * tail_marker()
void RouteStateClearPeerSet(DBEntryBase *db_entry, RouteState *rstate, const RibPeerSet &mleave)
bool Enqueue(RouteUpdate *rt_update)
AdvertiseSList & History()
static void RouteUpdateCurrentAndScheduled(const RouteUpdate *rt_update, int queue_id, RibPeerSet *mcurrent, RibPeerSet *mscheduled)
bool UpdateListMergeUpdate(DBEntryBase *db_entry, RouteUpdate *rt_update, UpdateList *uplist)
bool RouteUpdateMergeUpdate(DBEntryBase *db_entry, RouteUpdate *rt_update, RouteUpdate *current_rt_update)
void Dequeue(RouteUpdate *rt_update)
RouteUpdatePtr GetNextUpdate(int queue_id, UpdateEntry *upentry)
void MoveHistory(RouteState *rstate)
void UpdateInfoSListClearBits(UpdateInfoSList &uinfo_slist, const RibPeerSet &clear)
#define CHECK_CONCURRENCY(...)
bool EnqueueUpdate(DBEntryBase *db_entry, RouteUpdate *rt_update, UpdateList *uplist=NULL)
RouteUpdatePtr GetNextEntry(int queue_id, UpdateEntry *upentry, UpdateEntry **next_upentry_p)
void Set(const BitSet &rhs)
void ClearState(DBTableBase *tbl_base, ListenerId listener)
void AttrDequeue(UpdateInfo *current_uinfo)
AdvertiseSList & History()
const AdvertiseSList & Advertised() const
RouteUpdatePtr GetAttrNext(int queue_id, UpdateInfo *current_uinfo, UpdateInfo **next_uinfo_p)
bool GetPeerSetCurrentAndScheduled(DBEntryBase *db_entry, int queue_id, RibPeerSet *mcurrent, RibPeerSet *mscheduled)
void MoveHistory(RouteState *rstate)
RouteUpdate * FindUpdate(int queue_id)
bool MergeUpdate(DBEntryBase *db_entry, RouteUpdate *rt_update)
bool UpdateListClearPeerSet(DBEntryBase *db_entry, UpdateList *uplist, const RibPeerSet &mleave)
void MoveMarker(UpdateMarker *marker, RouteUpdate *rt_update)
void ClearEntryState(DBEntryBase *db_entry)
void RemoveUpdate(RouteUpdate *rt_update)
void ClearPeerSetCurrentAndScheduled(DBEntryBase *db_entry, const RibPeerSet &mleave)
UpdateInfo * AttrNext(UpdateInfo *current_uinfo)
bool RouteUpdateClearPeerSet(DBEntryBase *db_entry, RouteUpdate *rt_update, const RibPeerSet &mleave)
void DequeueUpdate(RouteUpdate *rt_update)
DBTableBase::ListenerId listener_id() const
UpdateList * MakeUpdateList()
void AdvertiseSListClearBits(AdvertiseSList &adv_slist, const RibPeerSet &clear)
static void UpdateListCurrentAndScheduled(const UpdateList *uplist, int queue_id, RibPeerSet *mcurrent, RibPeerSet *mscheduled)
void MergeUpdateInfo(UpdateInfoSList &uinfo_slist)
std::vector< UpdateQueue * > QueueVec
UpdateInfoSList & Updates()
std::list< RouteUpdate * > List