1#include "thread/tests/test_internal.h"
2
3TEST_GROUP_DEFINE(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 cc_ignore(a, b);
11 atomic_store(&daemon_work_run, true);
12 return DAEMON_THREAD_COMMAND_SLEEP;
13}
14
15static struct daemon_work dwork =
16 DAEMON_WORK_FROM(daemon_work, WORK_ARGS(NULL, NULL));
17
18TEST_DEFINE_INTEGRATION(daemon, timesharing_worker) {
19 atomic_store(&daemon_work_run, false);
20
21 struct cpu_mask cmask;
22 cpu_mask_init(m: &cmask, nbits: global.core_count);
23 cpu_mask_set_all(&cmask);
24
25 struct daemon_attributes attrs = {
26 .max_timesharing_threads = 67,
27 .flags = DAEMON_FLAG_AUTO_SPAWN | DAEMON_FLAG_HAS_NAME,
28 .thread_cpu_mask = cmask,
29 .min_timesharing_threads = 4,
30 };
31
32 struct daemon *daemon =
33 daemon_create("daemon_test", &attrs, &dwork, NULL, NULL);
34
35 enforce(daemon);
36
37 daemon_wake_timesharing_worker(daemon);
38 while (!atomic_load(&daemon_work_run))
39 scheduler_yield();
40
41 daemon_destroy(daemon);
42 return TEST_SUCCESS;
43}
44