| 1 | #include "thread/tests/test_internal.h" |
| 2 | |
| 3 | TEST_GROUP_DECLARE(daemon, .intensity_desc = { |
| 4 | .curve = SCALE_PIECEWISE_LOG, |
| 5 | .unit = "iters" , |
| 6 | }); |
| 7 | |
| 8 | static atomic_bool daemon_work_run = false; |
| 9 | static 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 | |
| 14 | static struct daemon_work dwork = |
| 15 | DAEMON_WORK_FROM(daemon_work, WORK_ARGS(NULL, NULL)); |
| 16 | |
| 17 | TEST_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 | |