$(srcdir)/util/locks.h $(srcdir)/util/log.h $(srcdir)/services/localzone.h $(srcdir)/util/storage/dnstree.h \
$(srcdir)/util/module.h $(srcdir)/util/storage/lruhash.h $(srcdir)/util/data/msgreply.h \
$(srcdir)/util/data/packed_rrset.h $(srcdir)/util/data/msgparse.h $(srcdir)/sldns/pkthdr.h \
- $(srcdir)/sldns/rrdef.h $(srcdir)/sldns/sbuffer.h $(srcdir)/util/config_file.h
+ $(srcdir)/sldns/rrdef.h $(srcdir)/sldns/sbuffer.h $(srcdir)/util/config_file.h $(srcdir)/respip/respip.h
rpz.lo rpz.o: $(srcdir)/services/rpz.c config.h $(srcdir)/services/rpz.h $(srcdir)/services/localzone.h \
$(srcdir)/util/rbtree.h $(srcdir)/util/locks.h $(srcdir)/util/log.h $(srcdir)/util/storage/dnstree.h \
$(srcdir)/util/module.h $(srcdir)/util/storage/lruhash.h $(srcdir)/util/data/msgreply.h \
* are kept in here. They can then be deleted.
*/
struct fast_reload_construct {
+ /** construct for views */
+ struct views* views;
/** construct for forwards */
struct iter_forwards* fwds;
/** construct for stubs */
return;
forwards_delete(ct->fwds);
hints_delete(ct->hints);
+ views_delete(ct->views);
/* Delete the log identity here so that the global value is not
* reset by config_delete. */
if(ct->oldcfg && ct->oldcfg->log_identity) {
config_delete(ct->oldcfg);
}
-/** get memory for string */
-static size_t
-getmem_str(char* str)
-{
- if(!str) return 0;
- return strlen(str)+1;
-}
-
/** get memory for strlist */
static size_t
getmem_config_strlist(struct config_strlist* p)
size_t mem = 0;
if(fr_poll_for_quit(fr))
return 1;
+ mem += views_get_mem(ct->views);
mem += forwards_get_mem(ct->fwds);
mem += hints_get_mem(ct->hints);
mem += sizeof(*ct->oldcfg);
fr_construct_from_config(struct fast_reload_thread* fr,
struct config_file* newcfg, struct fast_reload_construct* ct)
{
- if(!(ct->fwds = forwards_create()))
+ if(!(ct->views = views_create())) {
+ fr_construct_clear(ct);
+ return 0;
+ }
+ if(!views_apply_cfg(ct->views, newcfg)) {
+ fr_construct_clear(ct);
return 0;
+ }
+ if(fr_poll_for_quit(fr))
+ return 1;
+
+ if(!(ct->fwds = forwards_create())) {
+ fr_construct_clear(ct);
+ return 0;
+ }
if(!forwards_apply_cfg(ct->fwds, newcfg)) {
fr_construct_clear(ct);
return 0;
log_assert(ct->hints);
/* Grab big locks to satisfy lock conditions. */
+ lock_rw_wrlock(&ct->views->lock);
+ lock_rw_wrlock(&daemon->views->lock);
lock_rw_wrlock(&ct->fwds->lock);
lock_rw_wrlock(&ct->hints->lock);
lock_rw_wrlock(&env->fwds->lock);
* towards the state machine for query resolution. */
forwards_swap_tree(env->fwds, ct->fwds);
hints_swap_tree(env->hints, ct->hints);
+ views_swap_tree(daemon->views, ct->views);
/* Set globals with new config. */
config_apply(env->cfg);
+ lock_rw_unlock(&ct->views->lock);
+ lock_rw_unlock(&daemon->views->lock);
lock_rw_unlock(&env->fwds->lock);
lock_rw_unlock(&env->hints->lock);
lock_rw_unlock(&ct->fwds->lock);
(actionstr) ? actionstr : "inform", srcip, port);
log_nametypeclass(NO_VERBOSE, txt, qname, qtype, qclass);
}
+
+size_t respip_set_get_mem(struct respip_set* set)
+{
+ size_t m = sizeof(*set);
+ lock_rw_rdlock(&set->lock);
+ m += regional_get_mem(set->region);
+ lock_rw_unlock(&set->lock);
+ return m;
+}
struct ub_packed_rrset_key*
respip_copy_rrset(const struct ub_packed_rrset_key* key, struct regional* region);
+
+/** Get memory usage of respip set tree. The routine locks and unlocks the
+ * set for reading. */
+size_t respip_set_get_mem(struct respip_set* set);
+
#endif /* RESPIP_RESPIP_H */
lock_rw_unlock(&z->lock);
}
+
+/** Get memory usage for local_zone */
+static size_t
+local_zone_get_mem(struct local_zone* z)
+{
+ size_t m = sizeof(*z);
+ lock_rw_rdlock(&z->lock);
+ m += z->namelen + z->taglen + regional_get_mem(z->region);
+ lock_rw_unlock(&z->lock);
+ return m;
+}
+
+size_t local_zones_get_mem(struct local_zones* zones)
+{
+ struct local_zone* z;
+ size_t m = sizeof(*zones);
+ lock_rw_rdlock(&zones->lock);
+ RBTREE_FOR(z, struct local_zone*, &zones->ztree) {
+ m += local_zone_get_mem(z);
+ }
+ lock_rw_unlock(&zones->lock);
+ return m;
+}
*/
struct local_data*
local_zone_find_data(struct local_zone* z, uint8_t* nm, size_t nmlen, int nmlabs);
+
+/** Get memory usage for local_zones tree. The routine locks and unlocks
+ * the tree for reading. */
+size_t local_zones_get_mem(struct local_zones* zones);
+
#endif /* SERVICES_LOCALZONE_H */
#include "services/view.h"
#include "services/localzone.h"
#include "util/config_file.h"
+#include "respip/respip.h"
int
view_cmp(const void* v1, const void* v2)
return v;
}
-/* \noop (ignore this comment for doxygen)
- * This prototype is defined in in respip.h, but we want to avoid
- * unnecessary dependencies */
-void respip_set_delete(struct respip_set *set);
-
void
view_delete(struct view* v)
{
/* TODO implement print */
(void)v;
}
+
+size_t views_get_mem(struct views* vs)
+{
+ struct view* v;
+ size_t m = sizeof(struct views);
+ lock_rw_rdlock(&vs->lock);
+ RBTREE_FOR(v, struct view*, &vs->vtree) {
+ m += view_get_mem(v);
+ }
+ lock_rw_unlock(&vs->lock);
+ return m;
+}
+
+size_t view_get_mem(struct view* v)
+{
+ size_t m = sizeof(*v);
+ lock_rw_rdlock(&v->lock);
+ m += getmem_str(v->name);
+ m += local_zones_get_mem(v->local_zones);
+ m += respip_set_get_mem(v->respip_set);
+ lock_rw_unlock(&v->lock);
+ return m;
+}
+
+void views_swap_tree(struct views* vs, struct views* data)
+{
+ rbnode_type* oldroot = vs->vtree.root;
+ size_t oldcount = vs->vtree.count;
+ vs->vtree.root = data->vtree.root;
+ vs->vtree.count = data->vtree.count;
+ data->vtree.root = oldroot;
+ data->vtree.count = oldcount;
+}
* Views storage, shared.
*/
struct views {
- /** lock on the view tree */
+ /** lock on the view tree. When locking order, the views lock
+ * is before the forwards,hints,anchors lock. */
lock_rw_type lock;
/** rbtree of struct view */
rbtree_type vtree;
*/
struct view* views_find_view(struct views* vs, const char* name, int write);
+/**
+ * Calculate memory usage of views.
+ * @param vs: the views tree. The routine locks and unlocks the structure
+ * for reading.
+ * @return memory in bytes.
+ */
+size_t views_get_mem(struct views* vs);
+
+/**
+ * Calculate memory usage of view.
+ * @param v: the view. The routine locks and unlocks the structure for reading.
+ * @return memory in bytes.
+ */
+size_t view_get_mem(struct view* v);
+
+/**
+ * Swap internal tree with preallocated entries. Caller should manage
+ * the locks.
+ * @param vs: views tree
+ * @param data: preallocated information.
+ */
+void views_swap_tree(struct views* vs, struct views* data);
+
#endif /* SERVICES_VIEW_H */
return 0;
#endif
}
+
+size_t
+getmem_str(char* str)
+{
+ if(!str) return 0;
+ return strlen(str)+1;
+}
#define LINUX_IP_LOCAL_PORT_RANGE_PATH "/proc/sys/net/ipv4/ip_local_port_range"
#endif
+/** get memory for string */
+size_t getmem_str(char* str);
+
#endif /* UTIL_CONFIG_FILE_H */