From e90b72ec3082588b296956730bd2930cf8d5d671 Mon Sep 17 00:00:00 2001 From: Richard Qin Date: Fri, 10 Jul 2026 11:31:46 +0800 Subject: refactor: promote new architecture to repository root Archive the deprecated implementation under lume-legacy, make the new kernel the default root-level build, and update repository entry points without changing kernel behavior. --- kernel/pid.cc | 63 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 63 insertions(+) create mode 100644 kernel/pid.cc (limited to 'kernel/pid.cc') diff --git a/kernel/pid.cc b/kernel/pid.cc new file mode 100644 index 0000000..04b846b --- /dev/null +++ b/kernel/pid.cc @@ -0,0 +1,63 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later */ +/* Copyright (C) 2026 Richard Qin */ + +/* + * PID Allocator — Bitmap-based O(1) block search + * Reference: docs/specs/task.md §3.2 + */ + +#include + +void PidAllocator::init() +{ + for (int i = 0; i < kBitmapWords; i++) + bitmap_[i] = 0; + next_hint_ = 1; + bitmap_[0] |= 0x1ULL; /* Reserve PID 0 (idle/swapper) only. + * PID 1 (init) is allocated normally — the first + * kthread_create() call gets it, matching Linux. */ +} + +int32 PidAllocator::alloc() +{ + LockGuard guard(lock_); + + int32 word_start = next_hint_ / 64; + + for (int32 passes = 0; passes < kBitmapWords; passes++) { + int32 w = (word_start + passes) % kBitmapWords; + uint64 free_bits = ~bitmap_[w]; + if (free_bits == 0) + continue; + + int bit = 0; + uint64 v = free_bits; + while ((v & 1ULL) == 0) { v >>= 1; bit++; } + int32 pid = w * 64 + bit; + + if (pid >= kMaxPid) + continue; + + bitmap_[w] |= (1ULL << bit); + next_hint_ = pid + 1; + if (next_hint_ >= kMaxPid) + next_hint_ = 2; + + return pid; + } + + return -1; +} + +void PidAllocator::free(int32 pid) +{ + if (pid < 0 || pid >= kMaxPid) + return; + + LockGuard guard(lock_); + int32 w = pid / 64; + int32 bit = pid % 64; + bitmap_[w] &= ~(1ULL << bit); +} + +PidAllocator g_pid_alloc; -- cgit v1.2.3