我正在为bcache Linux模块编写补丁,并且很难在Linux核心中找到通用的LIFO实现。我在defines和without上找到了几个FIFO实现。然而,LIFO没有任何相似之处。
哪里可以找到一个?优选C不是asm而不是基于定义,但任何都应该有效。
如果没有提供抽象LIFO,那么实现LIFO的最简单的结构是什么(例如Linux核心中的通用堆栈实现)?
答案 0 :(得分:1)
如果LIFO具有固定的最大深度,并且没有动态分配,那么它就像是
#define LIFO_MAXDEPTH 16
static spinlock_t lifo_lock = SPIN_LOCK_UNLOCKED;
static size_t lifo_count = 0;
static struct item lifo_entry[LIFO_MAXDEPTH];
int lifo_push(const struct item *from)
{
spin_lock(&lifo_lock);
if (lifo_count >= LIFO_MAXDEPTH) {
spin_unlock(&lifo_lock);
return -1;
}
lifo_entry[lifo_count++] = *from;
spin_unlock(&lifo_lock);
return 0;
}
int lifo_pop(struct item *to)
{
spin_lock(&lifo_lock);
if (lifo_count < 1) {
spin_unlock(&lifo_lock);
return -1;
}
*to = lifo_entry[--lifo_count];
spin_unlock(&lifo_lock);
return 0;
}
因为我们只需要将它锁定很短的持续时间,螺旋锁就足够了。
如果动态分配LIFO,事情会变得更复杂。特别是,因为我们可能需要调用kmalloc()
或kfree()
,所以我们不能使用自旋锁。您还希望将堆栈拆分为页面大小的块,因为高阶分配可能会失败。然后你必须考虑像恶意用户试图使用该设施进行DOS攻击等等。