source: rtems/testsuites/libtests/block05/init.c @ b8ed6d80

4.115
Last change on this file since b8ed6d80 was b8ed6d80, checked in by Sebastian Huber <sebastian.huber@…>, on 06/04/12 at 07:41:13

libtests/block05: Fix warnings

  • Property mode set to 100644
File size: 10.5 KB
Line 
1/**
2 * @file
3 *
4 * @ingroup test_bdbuf
5 *
6 * @brief Bdbuf test.
7 */
8
9/*
10 * Copyright (c) 2009-2012 embedded brains GmbH.  All rights reserved.
11 *
12 *  embedded brains GmbH
13 *  Obere Lagerstr. 30
14 *  82178 Puchheim
15 *  Germany
16 *  <rtems@embedded-brains.de>
17 *
18 * The license and distribution terms for this file may be
19 * found in the file LICENSE in this distribution or at
20 * http://www.rtems.com/license/LICENSE.
21 */
22
23#ifdef HAVE_CONFIG_H
24#include "config.h"
25#endif
26
27#include "tmacros.h"
28#include <stdarg.h>
29#include <errno.h>
30
31#include <rtems.h>
32#include <rtems/bdbuf.h>
33#include <rtems/diskdevs.h>
34
35/* forward declarations to avoid warnings */
36static rtems_task Init(rtems_task_argument argument);
37
38#define ASSERT_SC(sc) rtems_test_assert((sc) == RTEMS_SUCCESSFUL)
39
40#define PRIORITY_INIT 1
41
42#define PRIORITY_HIGH 2
43
44#define PRIORITY_LOW_ALT 3
45
46#define PRIORITY_SWAPOUT 4
47
48#define PRIORITY_LOW 5
49
50#define PRIORITY_RESUME 6
51
52#define BLOCK_SIZE_A 1
53
54#define BLOCK_COUNT_A 2
55
56#define BLOCK_SIZE_B 2
57
58#define BLOCK_COUNT_B 1
59
60/* In case of trouble change this to 1 or 2 for more output */
61static unsigned output_level = 0;
62
63static rtems_disk_device *dd_a;
64
65static rtems_disk_device *dd_b;
66
67static rtems_id task_id_init;
68
69static rtems_id task_id_low;
70
71static rtems_id task_id_high;
72
73static rtems_id task_id_resume;
74
75static volatile bool finish_low;
76
77static volatile bool finish_high;
78
79static volatile enum resume_style {
80  RESUME_IMMEDIATE,
81  RESUME_FINISH
82} resume;
83
84static volatile enum trig_style {
85  SUSP = 0,
86  CONT
87} trig;
88
89static volatile enum get_type {
90  GET = 0,
91  READ
92} trig_get, low_get, high_get;
93
94static volatile enum blk_kind {
95  BLK_A0 = 0,
96  BLK_A1,
97  BLK_B0
98} trig_blk, low_blk, high_blk;
99
100static volatile enum rel_type {
101  REL = 0,
102  REL_MOD,
103  SYNC
104} trig_rel, low_rel, high_rel;
105
106static const char trig_style_desc [] = {
107  'S',
108  'C'
109};
110
111static const char get_type_desc [] = {
112  'G',
113  'R'
114};
115
116static const char *blk_kind_desc [] = {
117  "A0",
118  "A1",
119  "B0"
120};
121
122static const char rel_type_desc [] = {
123  'R',
124  'M',
125  'S'
126};
127
128static void print(unsigned level, const char *fmt, ...)
129{
130  if (level <= output_level) {
131    va_list ap;
132
133    va_start(ap, fmt);
134    vprintk(fmt, ap);
135    va_end(ap);
136  }
137}
138
139static void set_task_prio(rtems_id task, rtems_task_priority prio)
140{
141  rtems_status_code sc = RTEMS_SUCCESSFUL;
142  rtems_task_priority cur = 0;
143
144  sc = rtems_task_set_priority(task, prio, &cur);
145  ASSERT_SC(sc);
146}
147
148static rtems_bdbuf_buffer *get(enum get_type type, enum blk_kind kind)
149{
150  rtems_status_code sc = RTEMS_SUCCESSFUL;
151  rtems_bdbuf_buffer *bd = NULL;
152  rtems_blkdev_bnum blk_index = 0;
153  rtems_status_code (*get_bd)(
154    rtems_disk_device *,
155    rtems_blkdev_bnum,
156    rtems_bdbuf_buffer **
157  ) = NULL;
158  rtems_disk_device *dd = NULL;
159  size_t bds_per_group = 0;
160
161  switch (kind) {
162    case BLK_A0:
163      dd = dd_a;
164      blk_index = 0;
165      bds_per_group = 2;
166      break;
167    case BLK_A1:
168      dd = dd_a;
169      blk_index = 1;
170      bds_per_group = 2;
171      break;
172    case BLK_B0:
173      dd = dd_b;
174      blk_index = 0;
175      bds_per_group = 1;
176      break;
177    default:
178      rtems_test_assert(false);
179      break;
180  }
181
182  switch (type) {
183    case GET:
184      get_bd = rtems_bdbuf_get;
185      break;
186    case READ:
187      get_bd = rtems_bdbuf_read;
188      break;
189    default:
190      rtems_test_assert(false);
191      break;
192  }
193
194  sc = (*get_bd)(dd, blk_index, &bd);
195  rtems_test_assert(
196    sc == RTEMS_SUCCESSFUL
197      && bd->dd == dd
198      && bd->block == blk_index
199      && bd->group->bds_per_group == bds_per_group
200   );
201
202  return bd;
203}
204
205static void rel(rtems_bdbuf_buffer *bd, enum rel_type type)
206{
207  rtems_status_code sc = RTEMS_SUCCESSFUL;
208  rtems_status_code (*rel_bd)(rtems_bdbuf_buffer *) = NULL;
209
210  switch (type) {
211    case REL:
212      rel_bd = rtems_bdbuf_release;
213      break;
214    case REL_MOD:
215      rel_bd = rtems_bdbuf_release_modified;
216      break;
217    case SYNC:
218      rel_bd = rtems_bdbuf_sync;
219      break;
220    default:
221      rtems_test_assert(false);
222      break;
223  }
224
225  sc = (*rel_bd)(bd);
226  ASSERT_SC(sc);
227}
228
229static void task_low(rtems_task_argument arg)
230{
231  rtems_status_code sc = RTEMS_SUCCESSFUL;
232
233  while (true) {
234    print(2, "LG\n");
235    rtems_bdbuf_buffer *bd = get(low_get, low_blk);
236
237    print(2, "LR\n");
238    rel(bd, low_rel);
239
240    finish_low = true;
241
242    sc = rtems_task_suspend(RTEMS_SELF);
243    ASSERT_SC(sc);
244  }
245}
246
247static void task_high(rtems_task_argument arg)
248{
249  rtems_status_code sc = RTEMS_SUCCESSFUL;
250
251  while (true) {
252    print(2, "HG\n");
253    rtems_bdbuf_buffer *bd = get(high_get, high_blk);
254
255    print(2, "HR\n");
256    rel(bd, high_rel);
257
258    finish_high = true;
259
260    sc = rtems_task_suspend(RTEMS_SELF);
261    ASSERT_SC(sc);
262  }
263}
264
265static void task_resume(rtems_task_argument arg)
266{
267  while (true) {
268    bool do_resume = false;
269
270    switch (resume) {
271      case RESUME_IMMEDIATE:
272        print(2, "RI\n");
273        do_resume = true;
274        break;
275      case RESUME_FINISH:
276        print(2, "RF\n");
277        do_resume = finish_low && finish_high;
278        break;
279      default:
280        rtems_test_assert(false);
281        break;
282    }
283
284    if (do_resume) {
285      rtems_task_resume(task_id_init);
286    }
287  }
288}
289
290static void execute_test(unsigned i)
291{
292  rtems_status_code sc = RTEMS_SUCCESSFUL;
293  rtems_bdbuf_buffer *bd = NULL;
294  bool suspend = false;
295
296  print(
297    1,
298    "[%05u]T(%c,%c,%s,%c)L(%c,%s,%c)H(%c,%s,%c)\n",
299    i,
300    trig_style_desc [trig],
301    get_type_desc [trig_get],
302    blk_kind_desc [trig_blk],
303    rel_type_desc [trig_rel],
304    get_type_desc [low_get],
305    blk_kind_desc [low_blk],
306    rel_type_desc [low_rel],
307    get_type_desc [high_get],
308    blk_kind_desc [high_blk],
309    rel_type_desc [high_rel]
310  );
311
312  set_task_prio(task_id_low, PRIORITY_LOW);
313
314  finish_low = false;
315  finish_high = false;
316
317  sc = rtems_task_resume(task_id_low);
318  ASSERT_SC(sc);
319
320  sc = rtems_task_resume(task_id_high);
321  ASSERT_SC(sc);
322
323  sc = rtems_bdbuf_get(dd_b, 0, &bd);
324  rtems_test_assert(sc == RTEMS_SUCCESSFUL && bd->dd == dd_b && bd->block == 0);
325
326  sc = rtems_bdbuf_release(bd);
327  ASSERT_SC(sc);
328
329  switch (trig) {
330    case SUSP:
331      suspend = true;
332      break;
333    case CONT:
334      suspend = false;
335      break;
336    default:
337      rtems_test_assert(false);
338      break;
339  }
340
341  print(2, "TG\n");
342  bd = get(trig_get, trig_blk);
343
344  if (suspend) {
345    print(2, "S\n");
346    resume = RESUME_IMMEDIATE;
347    sc = rtems_task_suspend(RTEMS_SELF);
348    ASSERT_SC(sc);
349  }
350  resume = RESUME_FINISH;
351
352  print(2, "TR\n");
353  rel(bd, trig_rel);
354
355  sc = rtems_task_suspend(RTEMS_SELF);
356  ASSERT_SC(sc);
357
358  print(2, "F\n");
359
360  sc = rtems_bdbuf_syncdev(dd_a);
361  ASSERT_SC(sc);
362
363  sc = rtems_bdbuf_syncdev(dd_b);
364  ASSERT_SC(sc);
365}
366
367static const rtems_driver_address_table disk_ops = {
368  .initialization_entry = NULL,
369  RTEMS_GENERIC_BLOCK_DEVICE_DRIVER_ENTRIES
370};
371
372static int disk_ioctl(rtems_disk_device *dd, uint32_t req, void *argp)
373{
374  if (req == RTEMS_BLKIO_REQUEST) {
375    rtems_blkdev_request *r = argp;
376
377    set_task_prio(task_id_low, PRIORITY_LOW_ALT);
378
379    switch (r->req) {
380      case RTEMS_BLKDEV_REQ_READ:
381      case RTEMS_BLKDEV_REQ_WRITE:
382        r->req_done(r->done_arg, RTEMS_SUCCESSFUL);
383        return 0;
384      default:
385        errno = EINVAL;
386        return -1;
387    }
388  } else {
389    return rtems_blkdev_ioctl(dd, req, argp);
390  }
391}
392
393static void disk_register(
394  uint32_t block_size,
395  rtems_blkdev_bnum block_count,
396  rtems_disk_device **dd_ptr
397)
398{
399  rtems_status_code sc = RTEMS_SUCCESSFUL;
400  rtems_device_major_number major = 0;
401  dev_t dev = 0;
402
403  sc = rtems_io_register_driver(0, &disk_ops, &major);
404  ASSERT_SC(sc);
405
406  dev = rtems_filesystem_make_dev_t(major, 0);
407
408  sc = rtems_disk_create_phys(
409    dev,
410    block_size,
411    block_count,
412    disk_ioctl,
413    NULL,
414    NULL
415  );
416  ASSERT_SC(sc);
417
418  *dd_ptr = rtems_disk_obtain(dev);
419  rtems_test_assert(*dd_ptr!= NULL);
420}
421
422static rtems_task Init(rtems_task_argument argument)
423{
424  rtems_status_code sc = RTEMS_SUCCESSFUL;
425  unsigned i = 0;
426
427  printk("\n\n*** TEST BLOCK 5 ***\n");
428
429  task_id_init = rtems_task_self();
430
431  sc = rtems_disk_io_initialize();
432  ASSERT_SC(sc);
433
434  disk_register(BLOCK_SIZE_A, BLOCK_COUNT_A, &dd_a);
435
436  disk_register(BLOCK_SIZE_B, BLOCK_COUNT_B, &dd_b);
437
438  sc = rtems_task_create(
439    rtems_build_name(' ', 'L', 'O', 'W'),
440    PRIORITY_LOW,
441    0,
442    RTEMS_DEFAULT_MODES,
443    RTEMS_DEFAULT_ATTRIBUTES,
444    &task_id_low
445  );
446  ASSERT_SC(sc);
447
448  sc = rtems_task_start(task_id_low, task_low, 0);
449  ASSERT_SC(sc);
450
451  sc = rtems_task_create(
452    rtems_build_name('H', 'I', 'G', 'H'),
453    PRIORITY_HIGH,
454    0,
455    RTEMS_DEFAULT_MODES,
456    RTEMS_DEFAULT_ATTRIBUTES,
457    &task_id_high
458  );
459  ASSERT_SC(sc);
460
461  sc = rtems_task_start(task_id_high, task_high, 0);
462  ASSERT_SC(sc);
463
464  sc = rtems_task_create(
465    rtems_build_name('R', 'E', 'S', 'U'),
466    PRIORITY_RESUME,
467    0,
468    RTEMS_DEFAULT_MODES,
469    RTEMS_DEFAULT_ATTRIBUTES,
470    &task_id_resume
471  );
472  ASSERT_SC(sc);
473
474  sc = rtems_task_start(task_id_resume, task_resume, 0);
475  ASSERT_SC(sc);
476
477  sc = rtems_task_suspend(task_id_low);
478  ASSERT_SC(sc);
479
480  sc = rtems_task_suspend(task_id_high);
481  ASSERT_SC(sc);
482
483  for (trig = SUSP; trig <= CONT; ++trig) {
484    for (trig_get = GET; trig_get <= READ; ++trig_get) {
485      for (low_get = GET; low_get <= READ; ++low_get) {
486        for (high_get = GET; high_get <= READ; ++high_get) {
487          for (trig_blk = BLK_A0; trig_blk <= BLK_B0; ++trig_blk) {
488            for (low_blk = BLK_A0; low_blk <= BLK_B0; ++low_blk) {
489              for (high_blk = BLK_A0; high_blk <= BLK_B0; ++high_blk) {
490                for (trig_rel = REL; trig_rel <= SYNC; ++trig_rel) {
491                  for (low_rel = REL; low_rel <= SYNC; ++low_rel) {
492                    for (high_rel = REL; high_rel <= SYNC; ++high_rel) {
493                      execute_test(i);
494                      ++i;
495                    }
496                  }
497                }
498              }
499            }
500          }
501        }
502      }
503    }
504  }
505
506  printk("*** END OF TEST BLOCK 5 ***\n");
507
508  exit(0);
509}
510
511#define CONFIGURE_INIT
512
513#define CONFIGURE_APPLICATION_NEEDS_CLOCK_DRIVER
514#define CONFIGURE_APPLICATION_NEEDS_CONSOLE_DRIVER
515#define CONFIGURE_APPLICATION_NEEDS_LIBBLOCK
516
517#define CONFIGURE_USE_IMFS_AS_BASE_FILESYSTEM
518
519#define CONFIGURE_MAXIMUM_TASKS 4
520#define CONFIGURE_MAXIMUM_DRIVERS 4
521
522#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
523
524#define CONFIGURE_INIT_TASK_PRIORITY PRIORITY_INIT
525#define CONFIGURE_INIT_TASK_ATTRIBUTES RTEMS_DEFAULT_ATTRIBUTES
526#define CONFIGURE_INIT_TASK_INITIAL_MODES RTEMS_DEFAULT_MODES
527
528#define CONFIGURE_SWAPOUT_TASK_PRIORITY PRIORITY_SWAPOUT
529
530#define CONFIGURE_BDBUF_BUFFER_MIN_SIZE BLOCK_SIZE_A
531#define CONFIGURE_BDBUF_BUFFER_MAX_SIZE BLOCK_SIZE_B
532#define CONFIGURE_BDBUF_CACHE_MEMORY_SIZE BLOCK_SIZE_B
533
534#include <rtems/confdefs.h>
Note: See TracBrowser for help on using the repository browser.