| 1 | #include "thread/tests/test_internal.h" |
| 2 | |
| 3 | TEST_GROUP_DEFINE(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 | cc_ignore(a, b); |
| 11 | atomic_store(&daemon_work_run, true); |
| 12 | return DAEMON_THREAD_COMMAND_SLEEP; |
| 13 | } |
| 14 | |
| 15 | static struct daemon_work dwork = |
| 16 | DAEMON_WORK_FROM(daemon_work, WORK_ARGS(NULL, NULL)); |
| 17 | |
| 18 | TEST_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 | |