1#include "thread/tests/test_internal.h"
2
3TEST_GROUP_DECLARE(daemon, .intensity_desc = {
4 .curve = SCALE_PIECEWISE_LOG,
5 .unit = "iters",
6 });
7
8static atomic_bool daemon_work_run = false;
9static enum daemon_thread_command daemon_work(void *a, void *b) {
10 atomic_store(&daemon_work_run, true);
11 return DAEMON_THREAD_COMMAND_SLEEP;
12}
13
14static struct daemon_work dwork =
15 DAEMON_WORK_FROM(daemon_work, WORK_ARGS(NULL, NULL));
16
17TEST_DECLARE_INTEGRATION(daemon, timesharing_worker) {
18 atomic_store(&daemon_work_run, false);
19
20 struct cpu_mask cmask;
21 cpu_mask_init(m: &cmask, nbits: global.core_count);
22 cpu_mask_set_all(&cmask);
23
24 struct daemon_attributes attrs = {
25 .max_timesharing_threads = 67,
26 .flags = DAEMON_FLAG_AUTO_SPAWN | DAEMON_FLAG_HAS_NAME,
27 .thread_cpu_mask = cmask,
28 .min_timesharing_threads = 4,
29 };
30
31 struct daemon *daemon =
32 daemon_create(fmt: "daemon_test", attrs: &attrs, timesharing_work: &dwork, NULL, NULL);
33
34 kassert(daemon);
35
36 daemon_wake_timesharing_worker(daemon);
37 while (!atomic_load(&daemon_work_run))
38 scheduler_yield();
39
40 daemon_destroy(daemon);
41 return TEST_SUCCESS;
42}
43