OpenSDN source code
label_block.cc
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2013 Juniper Networks, Inc. All rights reserved.
3  * Copyright Contributors to the OpenSDN project
4  */
5 
6 #include "base/label_block.h"
7 
8 #include <stdio.h>
9 
10 #include <cassert>
11 #include <string>
12 
13 using std::string;
14 
16  refcount_ = 0;
17 }
18 
20  assert(blocks_.size() == 0);
21 }
22 
23 LabelBlockPtr LabelBlockManager::LocateBlock(uint32_t first, uint32_t last) {
24  std::scoped_lock lock(mutex_);
25 
26  for (LabelBlockList::iterator it = blocks_.begin();
27  it != blocks_.end(); ++it) {
28  LabelBlock *block = *it;
29  if (block->first_ == first && block->last_ == last) {
30  return LabelBlockPtr(block);
31  }
32  }
33 
34  LabelBlock *block = new LabelBlock(this, first, last);
35  blocks_.push_back(block);
36  return LabelBlockPtr(block);
37 }
38 
40  for (LabelBlockList::iterator it = blocks_.begin();
41  it != blocks_.end(); ++it) {
42  if (*it == block) {
43  blocks_.erase(it);
44  return;
45  }
46  }
47  assert(false);
48 }
49 
51  std::scoped_lock lock(mutex_);
52  return blocks_.size();
53 }
54 
55 LabelBlock::LabelBlock(uint32_t first, uint32_t last)
56  : block_manager_(NULL),
57  first_(first),
58  last_(last),
59  prev_pos_(BitSet::npos) {
60  refcount_ = 0;
61 }
62 
64  LabelBlockManager *block_manager, uint32_t first, uint32_t last)
65  : block_manager_(block_manager),
66  first_(first),
67  last_(last),
68  prev_pos_(BitSet::npos) {
69  refcount_ = 0;
70 }
71 
73  assert(used_bitset_.empty());
74  if (block_manager_)
75  block_manager_->RemoveBlock(this);
76 }
77 
79  std::scoped_lock lock(mutex_);
80 
81  size_t pos;
82  for (int idx = 0; idx < 2; prev_pos_ = BitSet::npos, idx++) {
83  if (prev_pos_ == BitSet::npos) {
85  } else {
87  }
88 
89  if (first_ + pos <= last_) {
90  used_bitset_.set(pos);
91  prev_pos_ = pos;
92  return static_cast<uint32_t>(first_ + pos);
93  }
94  }
95 
96  return 0;
97 }
98 
99 void LabelBlock::ReleaseLabel(uint32_t value) {
100  std::scoped_lock lock(mutex_);
101 
102  assert(value >= first_ && value <= last_);
103  size_t pos = value - first_;
104  used_bitset_.reset(pos);
105 }
106 
107 string LabelBlock::ToString() const {
108  char repr[32];
109  snprintf(repr, sizeof(repr), "%u-%u", first_, last_);
110  return repr;
111 }
Definition: bitset.h:18
size_t find_first_clear() const
Definition: bitset.cc:308
BitSet & reset(size_t pos)
Definition: bitset.cc:137
static const size_t npos
Definition: bitset.h:20
size_t find_next_clear(size_t pos) const
Definition: bitset.cc:325
bool empty() const
Definition: bitset.cc:166
BitSet & set(size_t pos)
Definition: bitset.cc:126
std::mutex mutex_
Definition: label_block.h:53
LabelBlockPtr LocateBlock(uint32_t first, uint32_t last)
Definition: label_block.cc:23
std::atomic< int > refcount_
Definition: label_block.h:49
void RemoveBlock(LabelBlock *block)
Definition: label_block.cc:39
LabelBlockList blocks_
Definition: label_block.h:54
std::atomic< int > refcount_
Definition: label_block.h:104
LabelBlockManagerPtr block_manager_
Definition: label_block.h:101
uint32_t first_
Definition: label_block.h:102
uint32_t last_
Definition: label_block.h:102
LabelBlock(uint32_t first, uint32_t last)
Definition: label_block.cc:55
BitSet used_bitset_
Definition: label_block.h:109
std::string ToString() const
Definition: label_block.cc:107
void ReleaseLabel(uint32_t value)
Definition: label_block.cc:99
std::mutex mutex_
Definition: label_block.h:108
uint32_t AllocateLabel()
Definition: label_block.cc:78
size_t prev_pos_
Definition: label_block.h:103
boost::intrusive_ptr< LabelBlock > LabelBlockPtr
Definition: label_block.h:20