本帖最后由 john_lee 于 2011-12-17 14:53 编辑
LOOK 20111018 为 flag_t 增加了一种新的等待模式:LSB。
enum mode_t {
ANY_KEEP,
ANY_CONSUME,
ALL_KEEP,
ALL_CONSUME,
LSB_KEEP, // 新增
LSB_CONSUME // 新增
};
作用是,返回所等待的 pattern 的最低位,例如,当前 flag 为 0b110011110,当请求 pattern 为 0b1011011 时,原语返回 0b10:
flag_t flag(0b110011110); // flag 初值
...
int ev = flag.wait(0b1011011, flag_t:LSB_CONSUME); // ev == 0b10
这个等待模式类似于 ANY 模式,不同的是 ANY 模式会返回所有满足 pattern 的位,而 LSB 模式只返回满足 pattern 的最低位。
LSB 模式可用于一些特殊场合,例如:管理一组按数组结构排列好的共享资源,资源最多 32 个,当应用程序(任务)来请求资源时,分配其中一个未用资源,并将其资源地址返回给任务。
下面给出一个非常简单的固定大小内存池的管理例程:
class mempool_t : flag_t {
public:
__INLINE mempool_t();
__INLINE void* alloc(uintptr_t timeout = 0); // 分配
__INLINE void free(void* blk); // 释放
private:
struct blk_t { uint8_t data[80]; };
blk_t buf[10]; // 内存资源
};
__INLINE mempool_t::mempool_t()
: flag_t((1 << 10) - 1) // 10 块的 bitmap
{
}
__INLINE void* mempool_t::alloc(uintptr_t timeout)
{
uintptr_t lsb = wait(~0, LSB_CONSUME, timeout);
return lsb != 0 ? &buf[ctz(lsb)] : 0;
}
__INLINE void mempool_t::free(void* blk)
{
// 可以先检查blk的合法性
set_bits(1 << (reinterpret_cast<blk_t*>(blk) - &buf[0]));
}
|