source: rtems/testsuites/sptests/sp28/init.c @ a6608123

4.104.115
Last change on this file since a6608123 was 82478ffc, checked in by Joel Sherrill <joel.sherrill@…>, on 10/02/08 at 20:57:28

2008-10-02 Joel Sherrill <joel.sherrill@…>

  • sp09/screen01.c, sp09/screen12.c, sp25/system.h, sp25/task1.c, sp28/init.c, sp39/init.c, sp41/init.c, spfatal01/testcase.h, spfatal08/testcase.h: Change size_t to ssize_t on all Heap, Workspace and Region calls. On 16-bit architectures, size_t can be 16-bits which would limit sizes to 64K. Also address constants which overflowed on 16-bit integer targets.
  • Property mode set to 100644
File size: 9.8 KB
Line 
1/*
2 *  The license and distribution terms for this file may be
3 *  found in the file LICENSE in this distribution or at
4 *  http://www.rtems.com/license/LICENSE.
5 *
6 *  $Id$
7 */
8
9#define CONFIGURE_INIT
10#include <tmacros.h>
11
12rtems_task Init(rtems_task_argument argument);
13
14#define CONFIGURE_APPLICATION_NEEDS_CONSOLE_DRIVER
15#define CONFIGURE_APPLICATION_NEEDS_CLOCK_DRIVER
16#define CONFIGURE_MAXIMUM_USER_EXTENSIONS    2
17
18#define CONFIGURE_MAXIMUM_TASKS              4
19#define CONFIGURE_MAXIMUM_TASK_VARIABLES     (4)
20#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
21#define CONFIGURE_MICROSECONDS_PER_TICK      10000
22
23#define CONFIGURE_MICROSECONDS_INIT
24
25#include <rtems/confdefs.h>
26
27#include <bsp.h>
28#include <rtems/error.h>
29#include <stdio.h>
30
31volatile void *taskvar;
32volatile int nRunning;
33volatile int nDeleted;
34
35rtems_task
36subtask (rtems_task_argument arg)
37{
38  uintptr_t localvar = arg;
39  int i;
40  rtems_status_code sc;
41
42  nRunning++;
43  while (nRunning != 3)
44    rtems_task_wake_after (0);
45  sc = rtems_task_variable_add(RTEMS_SELF, (void **)&taskvar, NULL);
46  directive_failed( sc, "task variable add" );
47
48  taskvar = (void *)localvar;
49  while (localvar < 1000) {
50    localvar++;
51    rtems_task_wake_after (0);
52    taskvar = (void *)((uintptr_t)taskvar + 1);
53    rtems_task_wake_after (0);
54    if ((uintptr_t)taskvar != localvar) {
55      printf ("Task:%d taskvar:%d localvar:%d\n",
56        arg, (uintptr_t)taskvar, localvar);
57      rtems_task_suspend (RTEMS_SELF);
58    }
59  }
60  sc = rtems_task_variable_delete(RTEMS_SELF, (void **)&taskvar);
61  nDeleted++;
62  directive_failed( sc, "task variable delete" );
63
64  if ((uintptr_t)taskvar == localvar) {
65    printf("Task:%d deleted taskvar:%d localvar:%d\n",
66      arg, (uintptr_t)taskvar, localvar);
67    nRunning--;
68    rtems_task_suspend (RTEMS_SELF);
69  }
70  while (nDeleted != 3)
71    rtems_task_wake_after (0);
72  for (i = 0 ; i < 1000 ; i++) {
73    taskvar = (void *)(localvar = 100 * arg);
74    rtems_task_wake_after(0);
75    if (nRunning <= 1)
76      break;
77    if ((uintptr_t)taskvar == localvar) {
78      printf("Task:%d taskvar:%d localvar:%d\n",
79        arg, (uintptr_t)taskvar, localvar);
80      nRunning--;
81      rtems_task_suspend(RTEMS_SELF);
82    }
83  }
84  nRunning--;
85  while (nRunning)
86    rtems_task_wake_after(0);
87
88  puts("*** END OF TEST 28 ***" );
89  rtems_test_exit(0);
90}
91
92void
93starttask (int arg)
94{
95  rtems_id tid;
96  rtems_status_code sc;
97
98  sc = rtems_task_create(rtems_build_name ('S', 'R', 'V', arg + 'A'),
99    100,
100    RTEMS_MINIMUM_STACK_SIZE,
101    RTEMS_PREEMPT|RTEMS_NO_TIMESLICE|RTEMS_NO_ASR|RTEMS_INTERRUPT_LEVEL(0),
102    RTEMS_NO_FLOATING_POINT|RTEMS_LOCAL,
103    &tid
104  );
105  directive_failed( sc, "task create" );
106
107  sc = rtems_task_start(tid, subtask, arg);
108  directive_failed( sc, "task start" );
109}
110
111volatile void *taskvar1;
112volatile void *taskvar2;
113volatile void *taskvar3;
114
115void test_errors(void)
116{
117  rtems_status_code  sc;
118  void              *value;
119
120  /*
121   *  task variable get error status codes
122   */
123  puts( "task variable get - NULL pointer - RTEMS_INVALID_ADDRESS" );
124  sc = rtems_task_variable_get(RTEMS_SELF, NULL, &value );
125  fatal_directive_status( sc, RTEMS_INVALID_ADDRESS, "get NULL pointer" );
126
127  puts( "task variable get - bad result - RTEMS_INVALID_ADDRESS" );
128  sc = rtems_task_variable_get(RTEMS_SELF, (void **)&taskvar1, NULL);
129  fatal_directive_status( sc, RTEMS_INVALID_ADDRESS, "get bad result" );
130
131  puts( "task variable get - bad pointer - RTEMS_INVALID_ADDRESS" );
132  sc = rtems_task_variable_get(RTEMS_SELF, (void **)&taskvar1, &value);
133  fatal_directive_status( sc, RTEMS_INVALID_ADDRESS, "get bad pointer" );
134
135  /*
136   *  task variable delete error status codes
137   */
138  puts( "task variable delete - NULL pointer - RTEMS_INVALID_ADDRESS" );
139  sc = rtems_task_variable_delete(RTEMS_SELF, NULL);
140  fatal_directive_status( sc, RTEMS_INVALID_ADDRESS, "delete NULL pointer" );
141
142  puts( "task variable delete - bad pointer - RTEMS_INVALID_ADDRESS" );
143  sc = rtems_task_variable_delete(RTEMS_SELF, (void **)&taskvar1);
144  fatal_directive_status( sc, RTEMS_INVALID_ADDRESS, "delete bad pointer" );
145
146}
147
148volatile uint32_t test_dtor_ran;
149
150void test_dtor(void *pointer)
151{
152  test_dtor_ran++;
153}
154
155
156void test_multiple_taskvars(void)
157{
158  rtems_status_code  sc;
159  void              *value;
160
161  test_dtor_ran = 0;
162
163  /*
164   *  Add multiple task variables and add each twice to
165   *  verify that behavior is OK
166   */
167  puts( "Adding multiple task variables" );
168  sc = rtems_task_variable_add(RTEMS_SELF, (void **)&taskvar1, NULL);
169  directive_failed( sc, "add multiple #1" );
170
171  sc = rtems_task_variable_add(RTEMS_SELF, (void **)&taskvar1, test_dtor);
172  directive_failed( sc, "add multiple #2" );
173
174  sc = rtems_task_variable_add(RTEMS_SELF, (void **)&taskvar2, test_dtor);
175  directive_failed( sc, "add multiple #3" );
176
177  sc = rtems_task_variable_add(RTEMS_SELF, (void **)&taskvar2, NULL);
178  directive_failed( sc, "add multiple #4" );
179
180  sc = rtems_task_variable_add(RTEMS_SELF, (void **)&taskvar3, NULL);
181  directive_failed( sc, "add multiple #5" );
182
183  sc = rtems_task_variable_add(RTEMS_SELF, (void **)&taskvar3, test_dtor);
184  directive_failed( sc, "add multiple #6" );
185
186  /*
187   *  Obtain task variables in various spots on the chain
188   */
189  puts( "Obtaining multiple task variables" );
190  sc = rtems_task_variable_get( RTEMS_SELF, (void **)&taskvar3, &value );
191  directive_failed( sc, "get multiple #1" );
192  sc = rtems_task_variable_get( RTEMS_SELF, (void **)&taskvar2, &value );
193  directive_failed( sc, "get multiple #2" );
194  sc = rtems_task_variable_get( RTEMS_SELF, (void **)&taskvar1, &value );
195  directive_failed( sc, "get multiple #2" );
196 
197  /*
198   *  Delete task variables in various spots on the chain
199   */
200
201  /* to trip the destructors */
202  taskvar1 = (void *)1;
203  taskvar2 = (void *)2;
204  taskvar3 = (void *)3;
205
206  puts( "Deleting multiple task variables" );
207  sc = rtems_task_variable_delete(RTEMS_SELF, (void **)&taskvar2);
208  directive_failed( sc, "delete multiple #1" );
209  sc = rtems_task_variable_delete(RTEMS_SELF, (void **)&taskvar3);
210  directive_failed( sc, "delete multiple #2" );
211  sc = rtems_task_variable_delete(RTEMS_SELF, (void **)&taskvar1);
212  directive_failed( sc, "delete multiple #3" );
213
214  if ( test_dtor_ran != 2 ) {
215    printf( "Test dtor ran %d times not 2 times as expected\n", test_dtor_ran );
216    rtems_test_exit(0);
217  }
218}
219
220#define MAX_VARS 4096
221
222void *Pointers[MAX_VARS];
223
224void test_out_of_memory(void)
225{
226  int                 i;
227  int                 max;
228  rtems_status_code   sc;
229  int                 ran_out = 0;
230  void              **base;
231
232  base = Pointers;
233
234  for (i=0 ; i<MAX_VARS ; i++ ) {
235    sc = rtems_task_variable_add(RTEMS_SELF, &base[i], NULL);
236    if ( sc == RTEMS_NO_MEMORY ) {
237      puts( "task_variable_add - returns NO_MEMORY" );
238      max = i;
239      ran_out = 1;
240      break;
241    }
242    directive_failed( sc, "add loop until out of memory" );
243  }
244
245  if ( !ran_out ) {
246    puts( "ERROR!!! did not run out of memory adding task variables!" );
247    rtems_test_exit(0);
248  }
249
250  for (i=0 ; i<max ; i++ ) {
251    sc = rtems_task_variable_delete(RTEMS_SELF, &base[i]);
252    directive_failed( sc, "delete loop until out of memory" );
253  }
254}
255
256rtems_id main_task;
257rtems_id other_task;
258
259rtems_task Other_Task(rtems_task_argument ignored)
260{
261  rtems_status_code sc;
262
263  puts( "Deleting task variables in another task" );
264  sc = rtems_task_variable_delete(main_task, (void **)&taskvar1);
265  directive_failed( sc, "delete loop for other task" );
266
267  (void) rtems_task_delete( RTEMS_SELF );
268}
269
270void test_delete_from_other_task(void)
271{
272  rtems_status_code sc;
273
274  test_dtor_ran = 0;
275
276  sc = rtems_task_ident( RTEMS_SELF, 0, &main_task );
277  directive_failed( sc, "task ident" );
278
279  sc = rtems_task_variable_add(RTEMS_SELF, (void **)&taskvar1, test_dtor);
280  directive_failed( sc, "add for other task case" );
281
282  sc = rtems_task_create(rtems_build_name ('O', 'T', 'H', 'R'),
283    100,
284    RTEMS_MINIMUM_STACK_SIZE,
285    RTEMS_PREEMPT|RTEMS_NO_TIMESLICE|RTEMS_NO_ASR|RTEMS_INTERRUPT_LEVEL(0),
286    RTEMS_NO_FLOATING_POINT|RTEMS_LOCAL,
287    &other_task
288  );
289  directive_failed( sc, "task create other" );
290
291  sc = rtems_task_start(other_task, Other_Task, 0);
292  directive_failed( sc, "task start other" );
293
294  rtems_task_wake_after( 100 );
295 
296  if ( test_dtor_ran != 1 ) {
297    printf( "Test dtor ran %d times not 1 times as expected\n", test_dtor_ran );
298    rtems_test_exit(0);
299  }
300}
301
302/*
303 *  Task which adds task variables just to delete them
304 */
305rtems_task Task_variable_deleter(rtems_task_argument ignored)
306{
307  rtems_status_code sc;
308
309  puts( "Adding multiple task variables to delete implicitly" );
310  sc = rtems_task_variable_add(RTEMS_SELF, (void **)&taskvar1, test_dtor);
311  directive_failed( sc, "add multiple for delete #1" );
312
313  sc = rtems_task_variable_add(RTEMS_SELF, (void **)&taskvar2, NULL);
314  directive_failed( sc, "add multiple for delete #2" );
315
316  sc = rtems_task_variable_add(RTEMS_SELF, (void **)&taskvar3, test_dtor);
317  directive_failed( sc, "add multiple for delete #3" );
318
319  (void) rtems_task_delete( RTEMS_SELF );
320}
321
322void test_delete_as_side_effect(void)
323{
324  rtems_status_code sc;
325  rtems_id          deleter_task;
326
327  test_dtor_ran = 0;
328
329  sc = rtems_task_create(rtems_build_name ('O', 'T', 'H', 'R'),
330    100,
331    RTEMS_MINIMUM_STACK_SIZE,
332    RTEMS_PREEMPT|RTEMS_NO_TIMESLICE|RTEMS_NO_ASR|RTEMS_INTERRUPT_LEVEL(0),
333    RTEMS_NO_FLOATING_POINT|RTEMS_LOCAL,
334    &deleter_task
335  );
336  directive_failed( sc, "task create deleter" );
337
338  sc = rtems_task_start(deleter_task, Task_variable_deleter, 0);
339  directive_failed( sc, "task start deleter" );
340
341  rtems_task_wake_after( 100 );
342 
343  if ( test_dtor_ran != 2 ) {
344    printf( "Test dtor ran %d times not 2 times as expected\n", test_dtor_ran );
345    rtems_test_exit(0);
346  }
347}
348
349rtems_task Init (rtems_task_argument ignored)
350{
351  puts("*** START OF TEST 28 ***" );
352
353  test_errors();
354
355  test_multiple_taskvars();
356
357  test_delete_as_side_effect();
358
359  test_delete_from_other_task();
360
361  starttask (1);
362  starttask (2);
363  starttask (3);
364
365  test_out_of_memory();
366
367  rtems_task_suspend (RTEMS_SELF);
368}
Note: See TracBrowser for help on using the repository browser.