From a01e9a5f2a0df6b5de15cf36ce5aad2ae32d0300 Mon Sep 17 00:00:00 2001 From: Jack Halford Date: Wed, 1 Jan 2020 22:59:01 +0100 Subject: [PATCH] add utilisation tracker --- src/task.zig | 20 +++++++++----------- src/time.zig | 13 ++++++++++--- src/vga.zig | 2 ++ 3 files changed, 21 insertions(+), 14 deletions(-) diff --git a/src/task.zig b/src/task.zig index f274413..92a1580 100644 --- a/src/task.zig +++ b/src/task.zig @@ -78,37 +78,36 @@ pub fn new(entrypoint: usize) !*TaskNode { defer task.unlock_scheduler(); const node = try vmem.create(TaskNode); + errdefer vmem.destroy(node); + node.data = try Task.create(entrypoint); ready_tasks.prepend(node); return node; } -pub fn sleep_tick(tick: usize) void { +pub fn wakeup_tick(tick: usize) bool { task.lock_scheduler(); defer task.unlock_scheduler(); task.sleeping_tasks.decrement(tick); var popped = false; while (task.sleeping_tasks.popZero()) |sleepnode| { - // println("finished sleeping"); - // task.format(); const tasknode = sleepnode.data; tasknode.data.state = .ReadyToRun; vmem.free(@ptrToInt(sleepnode)); task.ready_tasks.prepend(tasknode); popped = true; } - if (popped) preempt(); + return popped; } // TODO: make a sleep without malloc pub fn usleep(usec: u64) !void { assert(current_task.data.state == .Running); + update_time_used(); const node = try vmem.create(SleepNode); - update_time_used(); - lock_scheduler(); defer unlock_scheduler(); @@ -121,16 +120,15 @@ pub fn usleep(usec: u64) !void { pub fn block(state: TaskState) void { assert(current_task.data.state == .Running); - assert(state != .Running); assert(state != .ReadyToRun); + update_time_used(); // println("blocking {} as {}", current_task.data.tid, state); lock_scheduler(); defer unlock_scheduler(); - update_time_used(); current_task.data.state = state; blocked_tasks.append(current_task); schedule(); @@ -190,14 +188,14 @@ pub fn cleaner_loop() noreturn { pub var IRQ_disable_counter: usize = 0; pub var postpone_task_switches_counter: isize = 0; // this counter can go negative when we are scheduling after a postpone pub var postpone_task_switches_flag: bool = false; -pub fn lock_scheduler() void { +fn lock_scheduler() void { if (constants.SMP == false) { x86.cli(); IRQ_disable_counter += 1; postpone_task_switches_counter += 1; } } -pub fn unlock_scheduler() void { +fn unlock_scheduler() void { if (constants.SMP == false) { assert(IRQ_disable_counter > 0); postpone_task_switches_counter -= 1; @@ -331,7 +329,7 @@ pub fn notify(comptime message: []const u8, args: ...) void { const cursor = vga.cursor; vga.background = fg; vga.foreground = bg; - vga.cursor = 80 - message.len - 10; + vga.cursor = 80 - message.len; vga.cursor_enabled = false; print(message, args); diff --git a/src/time.zig b/src/time.zig index 0527f39..1734908 100644 --- a/src/time.zig +++ b/src/time.zig @@ -6,19 +6,26 @@ pub var TASK_SLICE: u64 = 50 * 1000; pub fn increment() void { const tick = x86.interrupt.tick; //us - offset_us += tick; - task.sleep_tick(tick); + offset_us += tick; //global time counter + + var should_preempt = task.wakeup_tick(tick); if (task_slice_remaining != 0) { // There is a time slice length - if (task_slice_remaining <= tick) return task.preempt(); + if (task_slice_remaining <= tick) should_preempt = true; if (task_slice_remaining > tick) task_slice_remaining -= tick; } + if (should_preempt) task.preempt(); } pub fn uptime() void { var offset_ms: u64 = offset_us / 1000; const offset_s: u64 = offset_ms / 1000; offset_ms = @mod(offset_ms / 100, 10); + print("{}.{:.3}", offset_s, offset_ms); } + +pub fn utilisation() void { + print("{}%", 100 * (offset_us - task.CPU_idle_time) / offset_us); +} diff --git a/src/vga.zig b/src/vga.zig index 23a3f77..7e38f8b 100644 --- a/src/vga.zig +++ b/src/vga.zig @@ -73,6 +73,8 @@ pub fn topbar() void { time.uptime(); print(" | "); + time.utilisation(); + print(" | "); task.format_short(); // print(" ({})", task.IRQ_disable_counter); println("");