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