OpenSDN source code
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
db_entry.h
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2013 Juniper Networks, Inc. All rights reserved.
3  */
4 
5 #ifndef ctrlplane_db_entry_h
6 #define ctrlplane_db_entry_h
7 
8 #include <map>
9 
10 #include <tbb/atomic.h>
11 
12 #include "db/db_table.h"
13 
14 #include <boost/intrusive/list.hpp>
15 #include <boost/intrusive/set.hpp>
16 
17 struct DBState {
18  virtual ~DBState() { }
19 };
20 
21 // Generic database entry
22 class DBEntryBase {
23 public:
25  typedef std::unique_ptr<DBRequestKey> KeyPtr;
26 
27  DBEntryBase();
28  virtual ~DBEntryBase();
29  virtual std::string ToString() const = 0;
30  virtual KeyPtr GetDBRequestKey() const = 0;
31  virtual bool IsMoreSpecific(const std::string &match) const {
32  return false;
33  }
34  virtual bool IsLessSpecific(const std::string &match) const {
35  return false;
36  }
37 
38  void SetState(DBTableBase *tbl_base, ListenerId listener, DBState *state);
39  void ClearState(DBTableBase *tbl_base, ListenerId listener);
40  DBState *GetState(DBTableBase *tbl_base, ListenerId listener) const;
41  const DBState *GetState(const DBTableBase *tbl_base,
42  ListenerId listener) const;
43  bool is_state_empty(DBTablePartBase *tpart);
45 
46  void Delete();
47  void MarkDelete() { flags |= DeleteMarked; }
48  void ClearDelete() { flags &= ~DeleteMarked; }
49  bool IsDeleted() const { return (flags & DeleteMarked) != 0; }
50 
51  void set_onlist() { flags |= Onlist; }
52  void clear_onlist() { flags &= ~Onlist; }
53  bool is_onlist() { return (flags & Onlist); }
54 
55  void SetOnRemoveQ() {
56  onremoveq_.fetch_and_store(true);
57  }
58  bool IsOnRemoveQ() { return (onremoveq_); }
59  void ClearOnRemoveQ() {
60  onremoveq_.fetch_and_store(false);
61  }
62 
63  //member hook in change list
64  boost::intrusive::list_member_hook<> chg_list_;
65 
66  void set_last_change_at(uint64_t time);
68  const uint64_t last_change_at() const { return last_change_at_; }
69  const std::string last_change_at_str() const;
70  void set_last_update_at(uint64_t time);
72  const uint64_t last_update_at() const { return last_update_at_; }
75  DBTableBase *get_table() const;
76  void Notify();
77 
78 private:
79  enum DbEntryFlags {
80  Onlist = 1 << 0,
81  DeleteMarked = 1 << 1,
82  };
83  typedef std::map<ListenerId, DBState *> StateMap;
86  uint8_t flags;
87  tbb::atomic<bool> onremoveq_;
88  uint64_t last_change_at_; // time at which entry was last 'changed'
89  uint64_t last_update_at_; // time at which entry was last 'updated'
91 };
92 
93 // An implementation of DBEntryBase that uses boost::set as data-store
94 // Most of the DB Table implementations should derive from here instead of
95 // DBEntryBase directly.
96 // Derive directly from DBEntryBase only if there is a strong reason to do so
97 class DBEntry : public DBEntryBase {
98 public:
99  DBEntry() { };
100  virtual ~DBEntry() { };
101 
102  // Set key fields in the DBEntry
103  virtual void SetKey(const DBRequestKey *key) = 0;
104 
105  // Comparator used in Tree management
106  virtual bool IsLess(const DBEntry &rhs) const = 0;
107 
108  bool operator<(const DBEntry &rhs) const {
109  return IsLess(rhs);
110  }
111 
112 private:
113  friend class DBTablePartition;
114  boost::intrusive::set_member_hook<> node_;
116 };
117 
118 #endif
uint8_t flags
Definition: db_entry.h:86
uint64_t last_update_at_
Definition: db_entry.h:89
void set_last_update_at(uint64_t time)
Definition: db_entry.cc:108
virtual ~DBState()
Definition: db_entry.h:18
void set_last_update_at_to_now()
Definition: db_entry.cc:104
DBState * GetState(DBTableBase *tbl_base, ListenerId listener) const
Definition: db_entry.cc:37
DBEntry()
Definition: db_entry.h:99
DBTableBase * get_table() const
Definition: db_entry.cc:119
void clear_onlist()
Definition: db_entry.h:52
void set_last_change_at_to_now()
Definition: db_entry.cc:96
void set_onlist()
Definition: db_entry.h:51
bool IsDeleted() const
Definition: db_entry.h:49
void SetState(DBTableBase *tbl_base, ListenerId listener, DBState *state)
Definition: db_entry.cc:22
void MarkDelete()
Definition: db_entry.h:47
virtual bool IsLessSpecific(const std::string &match) const
Definition: db_entry.h:34
int ListenerId
Definition: db_table.h:62
const std::string last_change_at_str() const
Definition: db_entry.cc:123
StateMap state_
Definition: db_entry.h:85
std::unique_ptr< DBRequestKey > KeyPtr
Definition: db_entry.h:25
bool IsOnRemoveQ()
Definition: db_entry.h:58
const uint64_t last_change_at() const
Definition: db_entry.h:68
void ClearOnRemoveQ()
Definition: db_entry.h:59
const uint64_t last_update_at() const
Definition: db_entry.h:72
boost::intrusive::set_member_hook node_
Definition: db_entry.h:114
void SetOnRemoveQ()
Definition: db_entry.h:55
virtual ~DBEntry()
Definition: db_entry.h:100
boost::intrusive::list_member_hook chg_list_
Definition: db_entry.h:64
std::map< ListenerId, DBState * > StateMap
Definition: db_entry.h:83
tbb::atomic< bool > onremoveq_
Definition: db_entry.h:87
void set_table_partition(DBTablePartBase *tpart)
Definition: db_entry.cc:111
bool is_state_empty(DBTablePartBase *tpart)
Definition: db_entry.cc:87
virtual std::string ToString() const =0
DBTablePartBase * tpart_
Definition: db_entry.h:84
DISALLOW_COPY_AND_ASSIGN(DBEntryBase)
virtual void SetKey(const DBRequestKey *key)=0
void ClearDelete()
Definition: db_entry.h:48
DISALLOW_COPY_AND_ASSIGN(DBEntry)
void ClearState(DBTableBase *tbl_base, ListenerId listener)
Definition: db_entry.cc:73
virtual KeyPtr GetDBRequestKey() const =0
bool is_state_empty_unlocked(DBTablePartBase *tpart)
Definition: db_entry.cc:92
void Delete()
Definition: db_entry.cc:131
virtual bool IsLess(const DBEntry &rhs) const =0
bool operator<(const DBEntry &rhs) const
Definition: db_entry.h:108
uint64_t last_change_at_
Definition: db_entry.h:88
bool is_onlist()
Definition: db_entry.h:53
void set_last_change_at(uint64_t time)
Definition: db_entry.cc:100
void Notify()
Definition: db_entry.cc:127
DBTablePartBase * get_table_partition() const
Definition: db_entry.cc:115
virtual ~DBEntryBase()
Definition: db_entry.cc:19
virtual bool IsMoreSpecific(const std::string &match) const
Definition: db_entry.h:31
DBTableBase::ListenerId ListenerId
Definition: db_entry.h:24