static int disk_ioctl(rtems_disk_device *dd, uint32_t req, void *arg) { rtems_status_code sc = RTEMS_SUCCESSFUL; if (req == RTEMS_BLKIO_REQUEST) { rtems_blkdev_request *r = arg; if (r->req == RTEMS_BLKDEV_REQ_WRITE) { set_task_prio(RTEMS_SELF, PRIORITY_IDLE); set_task_prio(RTEMS_SELF, PRIORITY_SWAPOUT); } r->req_done(r->done_arg, sc); return 0; } else { return rtems_blkdev_ioctl(dd, req, arg); } }
static void task_purger(rtems_task_argument arg) { while (true) { suspend(RTEMS_SELF); set_task_prio(RTEMS_SELF, PRIORITY_HIGH); purge('P'); } rtems_task_delete(RTEMS_SELF); }
static int disk_ioctl(rtems_disk_device *dd, uint32_t req, void *argp) { if (req == RTEMS_BLKIO_REQUEST) { rtems_blkdev_request *r = argp; set_task_prio(task_id_low, PRIORITY_LOW_ALT); switch (r->req) { case RTEMS_BLKDEV_REQ_READ: case RTEMS_BLKDEV_REQ_WRITE: rtems_blkdev_request_done(r, RTEMS_SUCCESSFUL); return 0; default: errno = EINVAL; return -1; } } else { return rtems_blkdev_ioctl(dd, req, argp); } }
static void execute_test(unsigned i) { rtems_status_code sc = RTEMS_SUCCESSFUL; rtems_bdbuf_buffer *bd = NULL; bool suspend = false; print( 1, "[%05u]T(%c,%c,%s,%c)L(%c,%s,%c)H(%c,%s,%c)\n", i, trig_style_desc [trig], get_type_desc [trig_get], blk_kind_desc [trig_blk], rel_type_desc [trig_rel], get_type_desc [low_get], blk_kind_desc [low_blk], rel_type_desc [low_rel], get_type_desc [high_get], blk_kind_desc [high_blk], rel_type_desc [high_rel] ); set_task_prio(task_id_low, PRIORITY_LOW); finish_low = false; finish_high = false; sc = rtems_task_resume(task_id_low); ASSERT_SC(sc); sc = rtems_task_resume(task_id_high); ASSERT_SC(sc); sc = rtems_bdbuf_get(dd_b, 0, &bd); rtems_test_assert(sc == RTEMS_SUCCESSFUL && bd->dd == dd_b && bd->block == 0); sc = rtems_bdbuf_release(bd); ASSERT_SC(sc); switch (trig) { case SUSP: suspend = true; break; case CONT: suspend = false; break; default: rtems_test_assert(false); break; } print(2, "TG\n"); bd = get(trig_get, trig_blk); if (suspend) { print(2, "S\n"); resume = RESUME_IMMEDIATE; sc = rtems_task_suspend(RTEMS_SELF); ASSERT_SC(sc); } resume = RESUME_FINISH; print(2, "TR\n"); rel(bd, trig_rel); sc = rtems_task_suspend(RTEMS_SELF); ASSERT_SC(sc); print(2, "F\n"); sc = rtems_bdbuf_syncdev(dd_a); ASSERT_SC(sc); sc = rtems_bdbuf_syncdev(dd_b); ASSERT_SC(sc); }
static rtems_task Init(rtems_task_argument argument) { rtems_status_code sc = RTEMS_SUCCESSFUL; size_t i_w = 0; size_t i_ac = 0; size_t i_rel = 0; size_t i_p = 0; printk("\n\n*** TEST BLOCK 10 ***\n"); task_id_init = rtems_task_self(); sc = rtems_disk_io_initialize(); ASSERT_SC(sc); sc = disk_register(BLOCK_SIZE, BLOCK_COUNT, &dev); ASSERT_SC(sc); sc = rtems_task_create( rtems_build_name('P', 'U', 'R', 'G'), PRIORITY_HIGH, 0, RTEMS_DEFAULT_MODES, RTEMS_DEFAULT_ATTRIBUTES, &task_id_purger ); ASSERT_SC(sc); sc = rtems_task_start(task_id_purger, task_purger, 0); ASSERT_SC(sc); set_task_prio(task_id_purger, PRIORITY_LOW); sc = rtems_task_create( rtems_build_name('W', 'A', 'I', 'T'), PRIORITY_HIGH, 0, RTEMS_DEFAULT_MODES, RTEMS_DEFAULT_ATTRIBUTES, &task_id_waiter ); ASSERT_SC(sc); sc = rtems_task_start(task_id_waiter, task_waiter, 0); ASSERT_SC(sc); for (i_ac = 0; i_ac < ACCESS_COUNT; ++i_ac) { for (i_rel = 0; i_rel < RELEASE_COUNT; ++i_rel) { for (i_w = 0; i_w < WAITER_COUNT; ++i_w) { printk("test case [access]: %s and %s %s\n", access_assoc_table [i_ac], release_assoc_table [i_rel], waiter_assoc_table [i_w]); check_access(access_table [i_ac], release_table [i_rel], waiter_table [i_w]); } } } for (i_rel = 0; i_rel < RELEASE_COUNT; ++i_rel) { for (i_w = 0; i_w < WAITER_COUNT; ++i_w) { printk("test case [intermediate]: %s %s\n", release_assoc_table [i_rel], waiter_assoc_table [i_w]); check_intermediate(release_table [i_rel], waiter_table [i_w]); } } for (i_p = 0; i_p < PURGER_COUNT; ++i_p) { for (i_w = 0; i_w < WAITER_COUNT; ++i_w) { printk("test case [transfer]: %s %s\n", purger_assoc_table [i_p], waiter_assoc_table [i_w]); check_transfer(purger_table [i_p], waiter_table [i_w]); } } printk("*** END OF TEST BLOCK 10 ***\n"); exit(0); }
static void restore_waiter(void) { set_task_prio(task_id_waiter, PRIORITY_HIGH); }
static void create_waiter(void) { resume(task_id_waiter); set_task_prio(task_id_waiter, PRIORITY_IDLE); }
static void activate_purger(rtems_task_priority prio) { set_task_prio(task_id_purger, prio); resume(task_id_purger); }