/** * Test 2. * * # Get task 0 to get buffers 0 -> 4 from the pool hold them. Then get * task 1 and task 2 to get them with blocking. The 2 tasks tests the * priority blocking on the buffer. */ static bool bdbuf_test_2 (bdbuf_task_control* tasks) { int i; tasks[0].test = 2; tasks[1].test = 2; tasks[2].test = 2; /* * Use pool 0. */ tasks[0].minor = 0; tasks[1].minor = 0; tasks[2].minor = 0; /* * Wake task 0 and wait for it to have all the buffers. */ bdbuf_send_wait_event ("master", "wake task 0", tasks[0].task); if (bdbuf_wait ("master", BDBUF_SECONDS (5)) != RTEMS_SUCCESSFUL) return false; /* * Wake task 1. */ bdbuf_send_wait_event ("master", "wake task 1", tasks[1].task); /* * Wake task 2. */ bdbuf_send_wait_event ("master", "wake task 2", tasks[2].task); for (i = 0; i < 5; i++) { /* * Wake task 0 and watch task 2 then task 1 get the released buffer. */ bdbuf_send_wait_event ("master", "wake task 0", tasks[0].task); /* * Wait until task 2 has the buffer. */ if (bdbuf_wait ("master", BDBUF_SECONDS (5)) != RTEMS_SUCCESSFUL) return false; } /* * Wait for the tests to finish. */ return bdbuf_tests_finished (tasks); }
/** * Test 5. * * # Read every buffer in the pool and hold. Then get task 1 to ask for a new * buffer. It will block waiting for one to appear. */ static bool bdbuf_test_5 (bdbuf_task_control* tasks) { tasks[0].test = 5; tasks[1].test = 5; /* * Use pool 0. */ tasks[0].minor = 0; tasks[1].minor = 0; /* * Wake task 0. */ bdbuf_send_wait_event ("master", "wake task 0", tasks[0].task); /* * Wait for the buffers in the pool to be taken. */ if (bdbuf_wait ("master", BDBUF_SECONDS (5)) != RTEMS_SUCCESSFUL) return false; bdbuf_sleep (100); /* * Wake task 1 to read another one and have to block. */ bdbuf_send_wait_event ("master", "wake task 1", tasks[1].task); bdbuf_sleep (100); /* * Wake task 0 to release it buffers. */ bdbuf_send_wait_event ("master", "wake task 0", tasks[0].task); return bdbuf_tests_finished (tasks); }
/** * Test 1. * * # Get task 0 to get buffer 0 from the pool then release it twice. */ static bool bdbuf_test_1 (bdbuf_task_control* tasks) { tasks[0].test = 1; /* * Use pool 0. */ tasks[0].minor = 0; bdbuf_send_wait_event ("master", "wake task 0", tasks[0].task); return bdbuf_tests_finished (tasks); }
/** * Get the blocks 0 -> 4 and release them. Task 0 should be holding * each one. */ static void bdbuf_tests_ranged_get_release (bdbuf_task_control* tc, bool wake_master, int lower, int upper) { rtems_status_code sc; bool passed; int i; rtems_bdbuf_buffer* bd; /* * Set task control's passed to false to handle a timeout. */ tc->passed = false; passed = true; for (i = lower; (i < upper) && passed; i++) { dev_t device = rtems_filesystem_make_dev_t (tc->major, tc->minor); bdbuf_test_printf ("%s: rtems_bdbuf_get[%d]: blocking ...\n", tc->name, i); sc = rtems_bdbuf_get (device, i, &bd); bdbuf_test_printf ("%s: rtems_bdbuf_get[%d]: ", tc->name, i); if (!bdbuf_test_print_sc (sc, true)) { passed = false; break; } bdbuf_test_printf ("%s: rtems_bdbuf_release[%d]: ", tc->name, i); sc = rtems_bdbuf_release (bd); if (!bdbuf_test_print_sc (sc, true)) { passed = false; break; } /* * Wake the master to tell it we have finished. */ if (wake_master) bdbuf_send_wait_event (tc->name, "wake master", tc->master); } tc->passed = passed; tc->test = 0; }
/** * Get all the blocks in the pool and hold them. Wake the master to tell it was * have the buffers then wait for the master to tell us to release them. */ static void bdbuf_tests_task_0_test_4 (bdbuf_task_control* tc) { rtems_status_code sc; bool passed; size_t i; rtems_bdbuf_buffer* bd; rtems_chain_control buffers; size_t num = bdbuf_test_buffer_count (); /* * Set task control's passed to false to handle a timeout. */ tc->passed = false; passed = true; /* * Clear any disk settings. */ bdbuf_clear_disk_driver_watch (tc); bdbuf_set_disk_driver_action (tc, BDBUF_DISK_NOOP); /* * Get the blocks 0 -> 4 and hold them. */ rtems_chain_initialize_empty (&buffers); for (i = 0; (i < num) && passed; i++) { bdbuf_test_printf ("%s: rtems_bdbuf_read[%d]: ", tc->name, i); sc = rtems_bdbuf_read (tc->dd, i, &bd); if (!bdbuf_test_print_sc (sc, true)) passed = false; rtems_chain_append (&buffers, &bd->link); } /* * Wake the master to tell it we have the buffers. */ bdbuf_send_wait_event (tc->name, "wake master", tc->master); if (passed) { bdbuf_sleep (250); bdbuf_set_disk_driver_watch (tc, num / 2); /* * Release half the buffers, wait 500msecs then release the * remainder. This tests the swap out timer on each buffer. */ bdbuf_test_printf ("%s: rtems_bdbuf_release_modified[0]: unblocks task 1\n", tc->name); bd = (rtems_bdbuf_buffer*) rtems_chain_get (&buffers); sc = rtems_bdbuf_release_modified (bd); bdbuf_test_printf ("%s: rtems_bdbuf_release_modified[0]: ", tc->name); passed = bdbuf_test_print_sc (sc, true); if (passed) { for (i = 1; (i < (num / 2)) && passed; i++) { bdbuf_test_printf ("%s: rtems_bdbuf_release_modified[%d]: " \ "unblocks task 1\n", tc->name, i); bd = (rtems_bdbuf_buffer*) rtems_chain_get (&buffers); sc = rtems_bdbuf_release_modified (bd); bdbuf_test_printf ("%s: rtems_bdbuf_release_modified[%d]: ", tc->name, i); passed = bdbuf_test_print_sc (sc, true); if (!passed) break; } if (passed) { passed = bdbuf_disk_driver_watch_wait (tc, BDBUF_SECONDS (5)); if (passed) { bdbuf_sleep (500); bdbuf_set_disk_driver_watch (tc, num / 2); for (i = 0; (i < (num / 2)) && passed; i++) { bdbuf_test_printf ("%s: rtems_bdbuf_release_modified[%d]: ", tc->name, i + (num / 2)); bd = (rtems_bdbuf_buffer*) rtems_chain_get (&buffers); passed = bdbuf_test_print_sc (rtems_bdbuf_release_modified (bd), true); if (!passed) break; } passed = bdbuf_disk_driver_watch_wait (tc, BDBUF_SECONDS (5)); if (passed) { if (!rtems_chain_is_empty (&buffers)) { passed = false; bdbuf_test_printf ("%s: buffer chain not empty\n", tc->name); } } } } } } tc->passed = passed; tc->test = 0; }
/** * Get the blocks 0 -> 4 and hold them. Wake the master to tell it was have the * buffers then wait for the master to tell us to release a single buffer. * Task 1 will be block waiting for each buffer. It is a higher priority. */ static void bdbuf_tests_task_0_test_2 (bdbuf_task_control* tc) { rtems_status_code sc; bool passed; int i; rtems_bdbuf_buffer* bd; rtems_chain_control buffers; /* * Set task control's passed to false to handle a timeout. */ tc->passed = false; passed = true; /* * Get the blocks 0 -> 4 and hold them. */ rtems_chain_initialize_empty (&buffers); for (i = 0; (i < 5) && passed; i++) { bdbuf_test_printf ("%s: rtems_bdbuf_get[%d]: ", tc->name, i); sc = rtems_bdbuf_get (tc->dd, i, &bd); if (!bdbuf_test_print_sc (sc, true)) passed = false; rtems_chain_append (&buffers, &bd->link); } /* * Wake the master to tell it we have the buffers. */ bdbuf_send_wait_event (tc->name, "wake master", tc->master); if (passed) { /* * For each buffer we hold wait until the master wakes us * and then return it. Task 2 will block waiting for this * buffer. It is a higher priority task. */ for (i = 0; (i < 5) && passed; i++) { sc = bdbuf_wait (tc->name, BDBUF_SECONDS (5)); if (sc != RTEMS_SUCCESSFUL) { bdbuf_test_printf ("%s: wait failed: ", tc->name); bdbuf_test_print_sc (sc, true); passed = false; break; } else { bdbuf_test_printf ("%s: rtems_bdbuf_release[%d]: unblocks task 1\n", tc->name, i); bd = (rtems_bdbuf_buffer*) rtems_chain_get (&buffers); sc = rtems_bdbuf_release (bd); bdbuf_test_printf ("%s: rtems_bdbuf_release[%d]: ", tc->name, i); if (!bdbuf_test_print_sc (sc, true)) { passed = false; break; } } } } tc->passed = passed; tc->test = 0; }