Files
SUB-OS/include/lib/rbtree.h
T
subhobhai943andClaude Opus 5 f9400f6ac4 feat(kernel): Add RB-tree/kfifo/hashtable, wait queues, futex, tiny RCU, page cache and KTest harness
Expands the kernel-and-TTY core with the primitives the higher layers have
been missing, plus an in-kernel harness that proves they work.

Data structures (lib/):
  - rbtree.c: Linux-compatible red-black tree with parent pointers, full
    insert/erase rebalancing, in-order iteration and an invariant validator.
  - kfifo.c: power-of-two byte ring with free-running indices, so the wrap
    path costs one mask instead of a branch per byte.
  - hashtable.c: separately-chained table with FNV-1a hashing, string or
    u64 keys, and rehash-on-growth at a 3/4 load factor.

Kernel subsystems:
  - kernel/wait.c: wait queues and one-shot completion barriers, backed by a
    static sleeper pool so a blocking path never re-enters the allocator.
  - kernel/futex.c: 32-bucket futex hash with value re-check, requeue, and an
    fmutex_t sleeping mutex built on the uncontended-fastpath protocol.
  - kernel/rcu.c: tiny RCU with reader nesting, deferred callbacks, kfree_rcu
    and rcu_assign_pointer/rcu_dereference publish barriers.
  - mm/page_cache.c: write-back block page cache, 4 KB pages indexed by
    (device, page), CLOCK second-chance eviction and dirty write-back.
  - kernel/ktest.c: KUnit-style harness with 6 built-in suites, 21 cases and
    735 assertions covering every subsystem above (all passing under QEMU).

LazyBox userland:
  - coreutils.c: sort, uniq, cut, tr, rev, tac, nl, seq, diff, xxd, du,
    factor, sum and truncate, reading through the VFS and handling the
    zero-length synthetic nodes that procfs and sysfs expose.
  - ktest, rcuinfo, futexinfo, waitinfo and pagecache diagnostics applets.

Co-Authored-By: Claude Opus 5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01L5yKJT4Wo2cV3rfPrwY5MP
2026-08-24 23:38:59 +05:30

64 lines
1.7 KiB
C

#ifndef _LIB_RBTREE_H
#define _LIB_RBTREE_H
#include <stddef.h>
#include <stdint.h>
#include <stdbool.h>
// Linux-style Red-Black Tree: O(log n) ordered container used by the
// CFS-style scheduler index, VMA lookup and the page cache radix index.
#define RB_RED 0
#define RB_BLACK 1
struct rb_node {
struct rb_node* rb_parent;
struct rb_node* rb_left;
struct rb_node* rb_right;
int rb_color;
};
struct rb_root {
struct rb_node* rb_node;
};
#define RB_ROOT_INIT { NULL }
#define rb_entry(ptr, type, member) \
((type*)((char*)(ptr) - offsetof(type, member)))
static inline void rb_root_init(struct rb_root* root) {
root->rb_node = NULL;
}
static inline bool rb_empty(const struct rb_root* root) {
return root->rb_node == NULL;
}
// Attach a freshly allocated node into the tree, then recolour.
static inline void rb_link_node(struct rb_node* node, struct rb_node* parent,
struct rb_node** rb_link) {
node->rb_parent = parent;
node->rb_color = RB_RED;
node->rb_left = NULL;
node->rb_right = NULL;
*rb_link = node;
}
void rb_insert_color(struct rb_node* node, struct rb_root* root);
void rb_erase(struct rb_node* node, struct rb_root* root);
struct rb_node* rb_first(const struct rb_root* root);
struct rb_node* rb_last(const struct rb_root* root);
struct rb_node* rb_next(const struct rb_node* node);
struct rb_node* rb_prev(const struct rb_node* node);
size_t rb_count(const struct rb_root* root);
int rb_black_height(const struct rb_root* root);
bool rb_validate(const struct rb_root* root);
#define rb_for_each(pos, root) \
for (pos = rb_first(root); pos != NULL; pos = rb_next(pos))
#endif // _LIB_RBTREE_H