GCC Code Coverage Report


Directory: kernel/
File: kernel/src/sched.c
Date: 2024-01-01 16:15:14
Exec Total Coverage
Lines: 39 43 90.7%
Functions: 5 6 83.3%
Branches: 19 30 63.3%

Line Branch Exec Source
1 /*
2 * Copyright (c) 2022-2023, The Puppy RTOS Authors
3 *
4 * SPDX-License-Identifier: Apache-2.0
5 */
6
7 #include <puppy.h>
8 #include <puppy/kobj.h>
9
10 #define KLOG_TAG "sched"
11 #define KLOG_LVL KLOG_WARNING
12 #include <puppy/klog.h>
13
14 struct _thread_obj *p_sched_ready_highest(void);
15
16 472 int p_sched(void)
17 {
18 472 int ret = P_EOK;
19 struct _thread_obj *_h_thread;
20 472 p_base_t key = arch_irq_lock();
21 472 struct p_cpu *_cpu = p_cpu_self();
22
23
2/2
✓ Branch 0 taken 467 times.
✓ Branch 1 taken 5 times.
472 if (_cpu->sched_lock == 0)
24 {
25
2/2
✓ Branch 0 taken 454 times.
✓ Branch 1 taken 13 times.
467 if (!_cpu->next_thread)
26 {
27 /* get prio higest thread */
28 454 _h_thread = p_sched_ready_highest();
29
2/2
✓ Branch 0 taken 86 times.
✓ Branch 1 taken 368 times.
454 if (!_h_thread)
30 {
31 86 arch_irq_unlock(key);
32 86 return 0;
33 }
34
6/6
✓ Branch 0 taken 364 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 187 times.
✓ Branch 3 taken 177 times.
✓ Branch 4 taken 39 times.
✓ Branch 5 taken 148 times.
368 if (_cpu->curr_thread && _cpu->curr_thread->state == P_THREAD_STATE_RUN && _h_thread->prio >= _cpu->curr_thread->prio)
35 {
36 39 arch_irq_unlock(key);
37 39 return 0;
38 }
39 329 _cpu->next_thread = _h_thread;
40 329 p_sched_ready_remove(_h_thread);
41 KLOG_D("next thread:%s", _cpu->next_thread->kobj.name);
42
4/4
✓ Branch 0 taken 324 times.
✓ Branch 1 taken 5 times.
✓ Branch 2 taken 148 times.
✓ Branch 3 taken 176 times.
329 if (_cpu->curr_thread && _cpu->curr_thread->state == P_THREAD_STATE_RUN)
43 {
44 148 p_sched_ready_insert(_cpu->curr_thread);
45 }
46 }
47
48 342 arch_swap(key);
49 315 ret = p_get_errno();
50 }
51
52 320 arch_irq_unlock(key);
53 320 return -ret;
54 }
55
56 void p_sched_lock(void)
57 {
58 atomic_fetch_add(&p_cpu_self()->sched_lock, 1);
59 }
60 4 void p_sched_unlock(void)
61 {
62 4 atomic_fetch_sub(&p_cpu_self()->sched_lock, 1);
63
1/2
✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
4 if (!p_cpu_self()->sched_lock)
64 {
65 4 p_sched();
66 }
67 }
68
69 325 void p_sched_swap_out_cb(p_obj_t thread)
70 {
71 P_UNUSED(thread);
72
1/6
✗ Branch 2 not taken.
✓ Branch 3 taken 325 times.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
325 KLOG_ASSERT(p_obj_get_type(p_cpu_self()->curr_thread) == P_OBJ_TYPE_THREAD);
73 325 p_cpu_self()->curr_thread = NULL;
74 325 }
75
76 328 void p_sched_swap_in_cb(p_obj_t thread)
77 {
78 328 struct p_cpu *cpu = p_cpu_self();
79 P_UNUSED(thread);
80
1/6
✗ Branch 2 not taken.
✓ Branch 3 taken 328 times.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
328 KLOG_ASSERT(p_obj_get_type(p_cpu_self()->next_thread) == P_OBJ_TYPE_THREAD);
81 328 cpu->next_thread->state = P_THREAD_STATE_RUN;
82 328 cpu->curr_thread = cpu->next_thread;
83 328 cpu->next_thread = NULL;
84 328 cpu->curr_thread->oncpu = p_cpu_self_id();
85 329 }
86
87 60 int sched_getcpu(void)
88 {
89 60 return p_cpu_self_id();
90 }
91