/*
* \brief Allocator using bitmaps to maintain cap space
* \author Alexander Boettcher
* \date 2012-06-14
*/
/*
* Copyright (C) 2012-2013 Genode Labs GmbH
*
* This file is part of the Genode OS framework, which is distributed
* under the terms of the GNU General Public License version 2.
*/
#ifndef _INCLUDE__BASE__BIT_ALLOCATOR_H_
#define _INCLUDE__BASE__BIT_ALLOCATOR_H_
#include
namespace Genode {
template
class Bit_allocator
{
protected:
Bit_array _array;
void _reserve(addr_t bit_start, size_t const num_cap)
{
if (!num_cap) return;
_array.set(bit_start, num_cap);
}
public:
addr_t alloc(size_t const num_log2)
{
addr_t const step = 1UL << num_log2;
addr_t i = 0;
try {
/*
* Throws exception if array is
* accessed outside bounds
*/
while (true) {
if (_array.get(i, step)) {
i += step;
continue;
}
_array.set(i, step);
return i;
}
} catch (Bit_array_invalid_index_access) {}
throw Bit_array_out_of_indexes();
}
void free(addr_t const bit_start,
size_t const num_log2)
{
_array.clear(bit_start, 1UL << num_log2);
}
};
}
#endif /* _INCLUDE__BASE__BIT_ALLOCATOR_H_ */