varz_node.cc
1 // Copyright 2020, Beeri 15. All rights reserved.
2 // Author: Roman Gershman (romange@gmail.com)
3 //
4 
5 #include "util/stats/varz_node.h"
6 #include "strings/strcat.h"
7 
8 namespace util {
9 
10 using namespace std;
11 using absl::StrAppend;
12 
13 folly::RWSpinLock VarzListNode::g_varz_lock;
14 
15 VarzListNode::VarzListNode(const char* name) : name_(name), prev_(nullptr) {
16  folly::RWSpinLock::WriteHolder guard(g_varz_lock);
17 
18  next_ = global_list();
19  if (next_) {
20  next_->prev_ = this;
21  }
22  global_list() = this;
23 }
24 
25 VarzListNode::~VarzListNode() {
26  folly::RWSpinLock::WriteHolder guard(g_varz_lock);
27  if (global_list() == this) {
28  global_list() = next_;
29  } else {
30  if (next_) {
31  next_->prev_ = prev_;
32  }
33  if (prev_) {
34  prev_->next_ = next_;
35  }
36  }
37 }
38 
39 string VarzListNode::Format(const AnyValue& av) {
40  string result;
41 
42  switch (av.type) {
43  case VarzValue::STRING:
44  StrAppend(&result, "\"", av.str, "\"");
45  break;
46  case VarzValue::NUM:
47  case VarzValue::TIME:
48  StrAppend(&result, av.num);
49  break;
50  case VarzValue::DOUBLE:
51  StrAppend(&result, av.dbl);
52  break;
53  case VarzValue::MAP:
54  result.append("{ ");
55  for (const auto& k_v : av.key_value_array) {
56  StrAppend(&result, "\"", k_v.first, "\": ", Format(k_v.second), ",");
57  }
58  result.back() = ' ';
59  result.append("}");
60  break;
61  }
62  return result;
63 }
64 
65 VarzListNode*& VarzListNode::global_list() {
66  static VarzListNode* varz_global_list = nullptr;
67  return varz_global_list;
68 }
69 
70 void VarzListNode::Iterate(std::function<void(const char*, AnyValue&&)> f) {
71  folly::RWSpinLock::ReadHolder guard(g_varz_lock);
72 
73  for (VarzListNode* node = global_list(); node != nullptr; node = node->next_) {
74  if (node->name_ != nullptr) {
75  f(node->name_, node->GetData());
76  }
77  }
78 }
79 
80 } // namespace util