本帖最后由 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]));
- }
|