annotate packages/kernel/current/tests/stress_threads.c @ 3292:7f8e529b4d82 default tip

Fix FREESCALE_EDMA_NBYTES_MLOFFYES_MLOFF() so it works with negative offsets.
author vae
date Wed, 29 Apr 2015 23:31:48 +0000
parents 74dbf4c3f2e1
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
1 //==========================================================================
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
2 //
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
3 // stress_threads.cxx
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
4 //
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
5 // Basic thread stress test
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
6 //
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
7 //==========================================================================
2729
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2197
diff changeset
8 // ####ECOSGPLCOPYRIGHTBEGIN####
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2197
diff changeset
9 // -------------------------------------------
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2197
diff changeset
10 // This file is part of eCos, the Embedded Configurable Operating System.
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2197
diff changeset
11 // Copyright (C) 1998, 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 191
diff changeset
12 //
2729
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2197
diff changeset
13 // eCos is free software; you can redistribute it and/or modify it under
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2197
diff changeset
14 // the terms of the GNU General Public License as published by the Free
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2197
diff changeset
15 // Software Foundation; either version 2 or (at your option) any later
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2197
diff changeset
16 // version.
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 191
diff changeset
17 //
2729
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2197
diff changeset
18 // eCos is distributed in the hope that it will be useful, but WITHOUT
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2197
diff changeset
19 // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2197
diff changeset
20 // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2197
diff changeset
21 // for more details.
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 191
diff changeset
22 //
2729
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2197
diff changeset
23 // You should have received a copy of the GNU General Public License
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2197
diff changeset
24 // along with eCos; if not, write to the Free Software Foundation, Inc.,
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2197
diff changeset
25 // 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 191
diff changeset
26 //
2729
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2197
diff changeset
27 // As a special exception, if other files instantiate templates or use
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2197
diff changeset
28 // macros or inline functions from this file, or you compile this file
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2197
diff changeset
29 // and link it with other works to produce a work based on this file,
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2197
diff changeset
30 // this file does not by itself cause the resulting work to be covered by
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2197
diff changeset
31 // the GNU General Public License. However the source code for this file
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2197
diff changeset
32 // must still be made available in accordance with section (3) of the GNU
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2197
diff changeset
33 // General Public License v2.
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 191
diff changeset
34 //
2729
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2197
diff changeset
35 // This exception does not invalidate any other reasons why a work based
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2197
diff changeset
36 // on this file might be covered by the GNU General Public License.
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2197
diff changeset
37 // -------------------------------------------
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2197
diff changeset
38 // ####ECOSGPLCOPYRIGHTEND####
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
39 //==========================================================================
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
40 //#####DESCRIPTIONBEGIN####
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
41 //
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
42 // Author(s): rosalia
4
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
43 // Contributors: rosalia, jskov
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
44 // Date: 1999-04-13
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
45 // Description: Very simple thread stress test, with some memory
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
46 // allocation and alarm handling.
4
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
47 //
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
48 // Notes:
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
49 // If client_makes_request is big, it means that there are made many more
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
50 // client requests than can be serviced. Consequently, clients are wasting
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
51 // CPU time and should be sleeping more.
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
52 //
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
53 // The list of handler invocations show how many threads are running
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
54 // at the same time. The more powerful the CPU, the more the numbers
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
55 // should spread out.
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
56 //####DESCRIPTIONEND####
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
57
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
58 #include <pkgconf/system.h>
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
59 #include <cyg/infra/testcase.h>
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
60
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
61 #include <cyg/hal/hal_arch.h>
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
62
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
63 #if defined(CYGPKG_KERNEL) && defined(CYGPKG_IO) && defined(CYGPKG_ISOINFRA)
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
64
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
65 #include <pkgconf/kernel.h>
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
66 #include <pkgconf/isoinfra.h>
78
59d97b6ba612 Merge from eCos master repository on 2000-03-28-19:50:47-BST
jlarmour
parents: 66
diff changeset
67 #include CYGHWR_MEMORY_LAYOUT_H
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
68
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
69 #if defined(CYGFUN_KERNEL_API_C)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
70
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
71 #include <cyg/kernel/kapi.h>
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
72
151
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents: 115
diff changeset
73 #ifdef CYGINT_ISO_STDIO_FORMATTED_IO
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
74
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
75 #include <stdio.h>
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
76 #include <stdlib.h>
2197
eb767a98013a * tests/stress_threads.c: Add string.h to avoid compiler warning.
asl
parents: 210
diff changeset
77 #include <string.h>
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
78
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
79 #if defined(CYGPKG_LIBM)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
80
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
81 #include <math.h>
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
82 #include <assert.h>
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
83
10
d3fbcdfa1b2f Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents: 8
diff changeset
84 #include <cyg/kernel/test/stackmon.h>
d3fbcdfa1b2f Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents: 8
diff changeset
85
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
86 #if defined(CYGFUN_KERNEL_THREADS_TIMER)
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
87 #if CYGINT_ISO_MALLOC
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
88
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
89 /* if TIME_LIMIT is defined, it represents the number of seconds this
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
90 test should last; if it is undefined the test will go forever */
4
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
91 #define DEATH_TIME_LIMIT 20
10
d3fbcdfa1b2f Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents: 8
diff changeset
92 /* #undef DEATH_TIME_LIMIT */
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
93
22
53104bbd5f99 Merge from eCos master repository on 1999-07-09-05:47:06-BST
jlarmour
parents: 10
diff changeset
94 // STACK_SIZE is typical +2kB for printf family calls which use big
36
e97d78785e2d Merge from eCos master repository on 1999-09-12-15:40:34-BST
jlarmour
parents: 28
diff changeset
95 // auto variables. Add more for handler which calls perform_stressful_tasks()
22
53104bbd5f99 Merge from eCos master repository on 1999-07-09-05:47:06-BST
jlarmour
parents: 10
diff changeset
96 #define STACK_SIZE (2*1024 + CYGNUM_HAL_STACK_SIZE_TYPICAL)
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
97 #define STACK_SIZE_HANDLER (STACK_SIZE + 30*CYGNUM_HAL_STACK_FRAME_SIZE)
36
e97d78785e2d Merge from eCos master repository on 1999-09-12-15:40:34-BST
jlarmour
parents: 28
diff changeset
98
e97d78785e2d Merge from eCos master repository on 1999-09-12-15:40:34-BST
jlarmour
parents: 28
diff changeset
99 #define N_MAIN 1
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
100
157
b65ec671dd4c Merge from eCos master repository on 2001-04-06-18:28:36-BST
jlarmour
parents: 151
diff changeset
101 // If we have instrumentation enabled, make the execution time in the
b65ec671dd4c Merge from eCos master repository on 2001-04-06-18:28:36-BST
jlarmour
parents: 151
diff changeset
102 // simulator even shorter that we were going to anyway.
b65ec671dd4c Merge from eCos master repository on 2001-04-06-18:28:36-BST
jlarmour
parents: 151
diff changeset
103 #ifdef CYGPKG_KERNEL_INSTRUMENT
b65ec671dd4c Merge from eCos master repository on 2001-04-06-18:28:36-BST
jlarmour
parents: 151
diff changeset
104 #define SIM_DELAY_DIVISOR 100
b65ec671dd4c Merge from eCos master repository on 2001-04-06-18:28:36-BST
jlarmour
parents: 151
diff changeset
105 #else
b65ec671dd4c Merge from eCos master repository on 2001-04-06-18:28:36-BST
jlarmour
parents: 151
diff changeset
106 #define SIM_DELAY_DIVISOR 10
b65ec671dd4c Merge from eCos master repository on 2001-04-06-18:28:36-BST
jlarmour
parents: 151
diff changeset
107 #endif
b65ec671dd4c Merge from eCos master repository on 2001-04-06-18:28:36-BST
jlarmour
parents: 151
diff changeset
108
36
e97d78785e2d Merge from eCos master repository on 1999-09-12-15:40:34-BST
jlarmour
parents: 28
diff changeset
109 //-----------------------------------------------------------------------
e97d78785e2d Merge from eCos master repository on 1999-09-12-15:40:34-BST
jlarmour
parents: 28
diff changeset
110 // Some targets need to define a smaller number of handlers due to
e97d78785e2d Merge from eCos master repository on 1999-09-12-15:40:34-BST
jlarmour
parents: 28
diff changeset
111 // memory restrictions.
78
59d97b6ba612 Merge from eCos master repository on 2000-03-28-19:50:47-BST
jlarmour
parents: 66
diff changeset
112 #if defined(CYGMEM_REGION_ram_SIZE) && (CYGMEM_REGION_ram_SIZE < 0x80000)
36
e97d78785e2d Merge from eCos master repository on 1999-09-12-15:40:34-BST
jlarmour
parents: 28
diff changeset
113 #define MAX_HANDLERS 4
e97d78785e2d Merge from eCos master repository on 1999-09-12-15:40:34-BST
jlarmour
parents: 28
diff changeset
114 #define N_LISTENERS 1
e97d78785e2d Merge from eCos master repository on 1999-09-12-15:40:34-BST
jlarmour
parents: 28
diff changeset
115 #define N_CLIENTS 1
e97d78785e2d Merge from eCos master repository on 1999-09-12-15:40:34-BST
jlarmour
parents: 28
diff changeset
116
e97d78785e2d Merge from eCos master repository on 1999-09-12-15:40:34-BST
jlarmour
parents: 28
diff changeset
117 #undef STACK_SIZE
e97d78785e2d Merge from eCos master repository on 1999-09-12-15:40:34-BST
jlarmour
parents: 28
diff changeset
118 #undef STACK_SIZE_HANDLER
e97d78785e2d Merge from eCos master repository on 1999-09-12-15:40:34-BST
jlarmour
parents: 28
diff changeset
119 #define STACK_SIZE (1024 + CYGNUM_HAL_STACK_SIZE_TYPICAL)
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
120 #define STACK_SIZE_HANDLER (STACK_SIZE + 10*CYGNUM_HAL_STACK_FRAME_SIZE)
36
e97d78785e2d Merge from eCos master repository on 1999-09-12-15:40:34-BST
jlarmour
parents: 28
diff changeset
121 #endif
e97d78785e2d Merge from eCos master repository on 1999-09-12-15:40:34-BST
jlarmour
parents: 28
diff changeset
122
e97d78785e2d Merge from eCos master repository on 1999-09-12-15:40:34-BST
jlarmour
parents: 28
diff changeset
123 //-----------------------------------------------------------------------
e97d78785e2d Merge from eCos master repository on 1999-09-12-15:40:34-BST
jlarmour
parents: 28
diff changeset
124 // If no target specific definitions, use defaults
e97d78785e2d Merge from eCos master repository on 1999-09-12-15:40:34-BST
jlarmour
parents: 28
diff changeset
125 #ifndef MAX_HANDLERS
4
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
126 #define MAX_HANDLERS 19
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
127 #define N_LISTENERS 4
4
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
128 #define N_CLIENTS 4
36
e97d78785e2d Merge from eCos master repository on 1999-09-12-15:40:34-BST
jlarmour
parents: 28
diff changeset
129 #endif
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
130
24
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
131 /* Allocate priorities in this order. This ensures that handlers
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
132 (which are the ones using the CPU) get enough CPU time to actually
62
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 40
diff changeset
133 complete their tasks.
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 40
diff changeset
134
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 40
diff changeset
135 The empty space ensures that if libc main() thread should happen to
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 40
diff changeset
136 be in the priority range of the handlers, no handlers are
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 40
diff changeset
137 accidently reduced so much in priority to get below
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 40
diff changeset
138 listeners/clients. */
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 40
diff changeset
139
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 40
diff changeset
140 #define P_MAIN_PROGRAM 1
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 40
diff changeset
141 #define P_MAIN_PROGRAM_E (P_MAIN_PROGRAM+N_MAIN)
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 40
diff changeset
142
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 40
diff changeset
143 #define P_BASE_HANDLER (P_MAIN_PROGRAM_E)
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 40
diff changeset
144 #define P_BASE_HANDLER_E (P_BASE_HANDLER+MAX_HANDLERS)
24
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
145
62
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 40
diff changeset
146 #define P_BASE_EMPTY (P_BASE_HANDLER_E)
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 40
diff changeset
147 #define P_BASE_EMPTY_E (P_BASE_EMPTY+2)
24
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
148
62
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 40
diff changeset
149 #define P_BASE_LISTENER (P_BASE_EMPTY_E)
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 40
diff changeset
150 #define P_BASE_LISTENER_E (P_BASE_LISTENER+N_LISTENERS)
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 40
diff changeset
151
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 40
diff changeset
152 #define P_BASE_CLIENT (P_BASE_LISTENER_E)
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 40
diff changeset
153 #define P_BASE_CLIENT_E (P_BASE_CLIENT+N_CLIENTS)
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 40
diff changeset
154
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 40
diff changeset
155 #define P_MAX (P_BASE_CLIENT_E)
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 40
diff changeset
156
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 40
diff changeset
157 /* Ensure there's room for what we request */
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 40
diff changeset
158 #if (CYGNUM_KERNEL_SCHED_PRIORITIES >= P_MAX)
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
159
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
160 /* if we use the bitmap scheduler we must make sure we don't use the
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
161 same priority more than once, so we must store those already in use */
24
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
162 static volatile char priority_in_use[P_MAX];
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
163
62
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 40
diff changeset
164 /* We may not get the priority we ask for (scheduler may decide to ignore
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 40
diff changeset
165 schedule hint). So keep a table of priorities actually assigned to
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 40
diff changeset
166 the threads. This information may come in handy for debugging - it's
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 40
diff changeset
167 not actively used by the code. */
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 40
diff changeset
168 static volatile int priority_translation[P_MAX];
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 40
diff changeset
169
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
170 /* now declare (and allocate space for) some kernel objects, like the
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
171 threads we will use */
4
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
172 cyg_thread main_thread_s;
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
173 cyg_thread handler_thread_s[MAX_HANDLERS];
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
174 cyg_thread listener_thread_s[N_LISTENERS];
4
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
175 cyg_thread client_thread_s[N_CLIENTS];
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
176
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
177 /* space for stacks for all threads */
4
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
178 char main_stack[STACK_SIZE];
36
e97d78785e2d Merge from eCos master repository on 1999-09-12-15:40:34-BST
jlarmour
parents: 28
diff changeset
179 char handler_stack[MAX_HANDLERS][STACK_SIZE_HANDLER];
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
180 char listener_stack[N_LISTENERS][STACK_SIZE];
4
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
181 char client_stack[N_CLIENTS][STACK_SIZE];
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
182
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
183 /* now the handles for the threads */
4
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
184 cyg_handle_t mainH;
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
185 cyg_handle_t handlerH[MAX_HANDLERS];
4
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
186 cyg_handle_t listenerH[N_LISTENERS];
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
187 cyg_handle_t clientH[N_CLIENTS];
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
188
24
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
189 /* space for thread names */
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
190 char thread_name[P_MAX][20];
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
191
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
192 /* and now variables for the procedure which is the thread */
4
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
193 cyg_thread_entry_t main_program, client_program, listener_program,
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
194 handler_program;
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
195
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
196 /* a few mutexes used in the code */
4
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
197 cyg_mutex_t client_request_lock, handler_slot_lock, statistics_print_lock,
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
198 free_handler_lock;
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
199
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
200 /* global variables with which the handler IDs and thread priorities
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
201 to free are communicated from handlers to main_program. Access to
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
202 these are protected by free_handler_lock. An id of -1 means the
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
203 that the variables are empty. */
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
204 volatile int free_handler_pri = 0;
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
205 volatile int free_handler_id = -1;
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
206
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
207 /* a global variable with which the client and server coordinate */
38
e7ba79f6d3a8 Merge from eCos master repository on 1999-09-23-20:10:25-BST
jlarmour
parents: 36
diff changeset
208 volatile int client_makes_request = 0;
e7ba79f6d3a8 Merge from eCos master repository on 1999-09-23-20:10:25-BST
jlarmour
parents: 36
diff changeset
209
e7ba79f6d3a8 Merge from eCos master repository on 1999-09-23-20:10:25-BST
jlarmour
parents: 36
diff changeset
210 /* if this is true, clients will not make requests */
e7ba79f6d3a8 Merge from eCos master repository on 1999-09-23-20:10:25-BST
jlarmour
parents: 36
diff changeset
211 volatile int clients_paused = 0;
e7ba79f6d3a8 Merge from eCos master repository on 1999-09-23-20:10:25-BST
jlarmour
parents: 36
diff changeset
212
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
213
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
214 /* indicates that it's time to print out a report */
38
e7ba79f6d3a8 Merge from eCos master repository on 1999-09-23-20:10:25-BST
jlarmour
parents: 36
diff changeset
215 volatile int time_to_report = 0;
24
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
216 /* print status after a delay of this many secs. */
10
d3fbcdfa1b2f Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents: 8
diff changeset
217 int time_report_delay;
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
218
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
219 /*** now application-specific variables ***/
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
220 /* an array that stores whether the handler threads are in use */
38
e7ba79f6d3a8 Merge from eCos master repository on 1999-09-23-20:10:25-BST
jlarmour
parents: 36
diff changeset
221 volatile int handler_thread_in_use[MAX_HANDLERS];
e7ba79f6d3a8 Merge from eCos master repository on 1999-09-23-20:10:25-BST
jlarmour
parents: 36
diff changeset
222 /* total count of active handlers */
e7ba79f6d3a8 Merge from eCos master repository on 1999-09-23-20:10:25-BST
jlarmour
parents: 36
diff changeset
223 volatile int handler_thread_in_use_count;
e7ba79f6d3a8 Merge from eCos master repository on 1999-09-23-20:10:25-BST
jlarmour
parents: 36
diff changeset
224
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
225
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
226 /***** statistics-gathering variables *****/
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
227 struct s_statistics {
10
d3fbcdfa1b2f Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents: 8
diff changeset
228 /* store the number of times each handler has been invoked */
d3fbcdfa1b2f Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents: 8
diff changeset
229 unsigned long handler_invocation_histogram[MAX_HANDLERS];
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
230
10
d3fbcdfa1b2f Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents: 8
diff changeset
231 /* store how many times malloc has been attempted and how many times
d3fbcdfa1b2f Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents: 8
diff changeset
232 it has failed */
d3fbcdfa1b2f Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents: 8
diff changeset
233 unsigned long malloc_tries, malloc_failures;
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
234
10
d3fbcdfa1b2f Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents: 8
diff changeset
235 /* how many threads have been created */
d3fbcdfa1b2f Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents: 8
diff changeset
236 unsigned long thread_creations, thread_exits;
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
237 };
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
238
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
239 struct s_statistics statistics;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
240
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
241 /* some function prototypes; those with the sc_ prefix are
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
242 "statistics-collecting" versions of the cyg_ primitives */
62
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 40
diff changeset
243 cyg_addrword_t sc_thread_create(
4
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
244 cyg_addrword_t sched_info, /* scheduling info (eg pri) */
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
245 cyg_thread_entry_t *entry, /* entry point function */
4
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
246 cyg_addrword_t entry_data, /* entry data */
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
247 char *name, /* optional thread name */
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
248 void *stack_base, /* stack base, NULL = alloc */
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
249 cyg_ucount32 stack_size, /* stack size, 0 = default */
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
250 cyg_handle_t *handle, /* returned thread handle */
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
251 cyg_thread *thread /* put thread here */
24
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
252 );
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
253
38
e7ba79f6d3a8 Merge from eCos master repository on 1999-09-23-20:10:25-BST
jlarmour
parents: 36
diff changeset
254 void start_handler(void);
e7ba79f6d3a8 Merge from eCos master repository on 1999-09-23-20:10:25-BST
jlarmour
parents: 36
diff changeset
255 void stop_handler(int handler_id, int handler_pri);
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
256 void perform_stressful_tasks(void);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
257 void permute_array(char a[], int size, int seed);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
258 void setup_death_alarm(cyg_addrword_t data, cyg_handle_t *deathHp,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
259 cyg_alarm *death_alarm_p, int *killed_p);
10
d3fbcdfa1b2f Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents: 8
diff changeset
260 void print_statistics(int print_full);
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
261
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
262 /* we need to declare the alarm handling function (which is defined
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
263 below), so that we can pass it to cyg_alarm_initialize() */
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
264 cyg_alarm_t report_alarm_func, death_alarm_func;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
265
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
266 /* handle and alarm for the report alarm */
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
267 cyg_handle_t report_alarmH, counterH, system_clockH;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
268 cyg_alarm report_alarm;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
269
22
53104bbd5f99 Merge from eCos master repository on 1999-07-09-05:47:06-BST
jlarmour
parents: 10
diff changeset
270 /* main launches all the threads of the test */
53104bbd5f99 Merge from eCos master repository on 1999-07-09-05:47:06-BST
jlarmour
parents: 10
diff changeset
271 int
53104bbd5f99 Merge from eCos master repository on 1999-07-09-05:47:06-BST
jlarmour
parents: 10
diff changeset
272 main(void)
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
273 {
24
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
274 int i;
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
275
24
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
276 CYG_TEST_INIT();
40
a3cc6665b684 Merge from eCos master repository on 1999-10-01-07:47:04-BST
jlarmour
parents: 38
diff changeset
277 CYG_TEST_INFO("Stress threads test compiled on " __DATE__);
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
278
24
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
279 cyg_mutex_init(&client_request_lock);
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
280 cyg_mutex_init(&statistics_print_lock);
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
281 cyg_mutex_init(&free_handler_lock);
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
282
24
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
283 /* initialize statistics */
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
284 memset(&statistics, 0, sizeof(statistics));
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
285
24
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
286 /* clear priority table */
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
287 for (i = 0; i < sizeof(priority_in_use); i++)
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
288 priority_in_use[i] = 0;
4
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
289
24
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
290 /* initialize main thread */
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
291 {
62
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 40
diff changeset
292 priority_translation[P_MAIN_PROGRAM] =
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 40
diff changeset
293 sc_thread_create(P_MAIN_PROGRAM, main_program, (cyg_addrword_t) 0,
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 40
diff changeset
294 "main_program", (void *) main_stack, STACK_SIZE,
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 40
diff changeset
295 &mainH, &main_thread_s);
24
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
296 priority_in_use[P_MAIN_PROGRAM]++;
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
297 }
4
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
298
24
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
299 /* initialize all handler threads to not be in use */
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
300 for (i = 0; i < MAX_HANDLERS; ++i) {
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
301 handler_thread_in_use[i] = 0;
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
302 }
38
e7ba79f6d3a8 Merge from eCos master repository on 1999-09-23-20:10:25-BST
jlarmour
parents: 36
diff changeset
303 handler_thread_in_use_count = 0;
24
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
304 for (i = 0; i < N_LISTENERS; ++i) {
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
305 int prio = P_BASE_LISTENER + i;
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
306 char* name = &thread_name[prio][0];
62
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 40
diff changeset
307 sprintf(name, "listener-%02d", i);
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 40
diff changeset
308 priority_translation[prio] =
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 40
diff changeset
309 sc_thread_create(prio, listener_program, (cyg_addrword_t) i,
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 40
diff changeset
310 name, (void *) listener_stack[i], STACK_SIZE,
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 40
diff changeset
311 &listenerH[i], &listener_thread_s[i]);
24
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
312 CYG_ASSERT(0 == priority_in_use[prio], "Priority already in use!");
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
313 priority_in_use[prio]++;
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
314 }
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
315 for (i = 0; i < N_CLIENTS; ++i) {
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
316 int prio = P_BASE_CLIENT + i;
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
317 char* name = &thread_name[prio][0];
62
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 40
diff changeset
318 sprintf(name, "client-%02d", i);
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 40
diff changeset
319 priority_translation[prio] =
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 40
diff changeset
320 sc_thread_create(prio, client_program, (cyg_addrword_t) i,
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 40
diff changeset
321 name, (void *) client_stack[i], STACK_SIZE,
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 40
diff changeset
322 &(clientH[i]), &client_thread_s[i]);
24
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
323 CYG_ASSERT(0 == priority_in_use[prio], "Priority already in use!");
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
324 priority_in_use[prio]++;
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
325 }
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
326
24
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
327 cyg_thread_resume(mainH);
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
328 for (i = 0; i < N_CLIENTS; ++i) {
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
329 cyg_thread_resume(clientH[i]);
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
330 }
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
331 for (i = 0; i < N_LISTENERS; ++i) {
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
332 cyg_thread_resume(listenerH[i]);
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
333 }
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
334
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
335 /* set up the alarm which gives periodic wakeups to say "time to
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
336 print a report */
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
337 system_clockH = cyg_real_time_clock();
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
338 cyg_clock_to_counter(system_clockH, &counterH);
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
339
24
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
340 cyg_alarm_create(counterH, report_alarm_func,
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
341 (cyg_addrword_t) 4000,
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
342 &report_alarmH, &report_alarm);
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
343 if (cyg_test_is_simulator) {
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
344 time_report_delay = 2;
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
345 } else {
36
e97d78785e2d Merge from eCos master repository on 1999-09-12-15:40:34-BST
jlarmour
parents: 28
diff changeset
346 time_report_delay = 60;
24
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
347 }
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
348
24
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
349 cyg_alarm_initialize(report_alarmH, cyg_current_time()+200,
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
350 time_report_delay*100);
10
d3fbcdfa1b2f Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents: 8
diff changeset
351
24
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
352 return 0;
4
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
353 }
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
354
4
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
355 /* main_program() -- frees resources and prints status. */
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
356 void main_program(cyg_addrword_t data)
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
357 {
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
358 #ifdef DEATH_TIME_LIMIT
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
359 cyg_handle_t deathH;
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
360 cyg_alarm death_alarm;
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
361 int is_dead = 0;
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
362
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
363 setup_death_alarm(0, &deathH, &death_alarm, &is_dead);
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
364 #endif /* DEATH_TIME_LIMIT */
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
365
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
366 for (;;) {
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
367 int handler_id = -1;
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
368 int handler_pri = 0;
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
369
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
370 cyg_mutex_lock(&free_handler_lock); {
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
371 // If any handler has left its ID, copy the ID and
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
372 // priority values to local variables, and free up the
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
373 // global communication variables again.
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
374 if (-1 != free_handler_id) {
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
375 handler_id = free_handler_id;
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
376 handler_pri = free_handler_pri;
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
377 free_handler_id = -1;
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
378 }
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
379 } cyg_mutex_unlock(&free_handler_lock);
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
380
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
381 if (-1 != handler_id) {
38
e7ba79f6d3a8 Merge from eCos master repository on 1999-09-23-20:10:25-BST
jlarmour
parents: 36
diff changeset
382 stop_handler(handler_id, handler_pri);
4
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
383 }
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
384
38
e7ba79f6d3a8 Merge from eCos master repository on 1999-09-23-20:10:25-BST
jlarmour
parents: 36
diff changeset
385 // If it's time to report status or quit, set pause flag and
e7ba79f6d3a8 Merge from eCos master repository on 1999-09-23-20:10:25-BST
jlarmour
parents: 36
diff changeset
386 // keep looping until all handlers have stopped.
4
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
387 if (time_to_report) {
38
e7ba79f6d3a8 Merge from eCos master repository on 1999-09-23-20:10:25-BST
jlarmour
parents: 36
diff changeset
388 // Pause clients
e7ba79f6d3a8 Merge from eCos master repository on 1999-09-23-20:10:25-BST
jlarmour
parents: 36
diff changeset
389 cyg_mutex_lock(&client_request_lock); {
e7ba79f6d3a8 Merge from eCos master repository on 1999-09-23-20:10:25-BST
jlarmour
parents: 36
diff changeset
390 clients_paused = 1;
e7ba79f6d3a8 Merge from eCos master repository on 1999-09-23-20:10:25-BST
jlarmour
parents: 36
diff changeset
391 } cyg_mutex_unlock(&client_request_lock);
e7ba79f6d3a8 Merge from eCos master repository on 1999-09-23-20:10:25-BST
jlarmour
parents: 36
diff changeset
392
e7ba79f6d3a8 Merge from eCos master repository on 1999-09-23-20:10:25-BST
jlarmour
parents: 36
diff changeset
393 // When all handlers have stopped, we can print statistics
e7ba79f6d3a8 Merge from eCos master repository on 1999-09-23-20:10:25-BST
jlarmour
parents: 36
diff changeset
394 // knowing that all (handler allocated) resources should have
e7ba79f6d3a8 Merge from eCos master repository on 1999-09-23-20:10:25-BST
jlarmour
parents: 36
diff changeset
395 // been freed. That is, we should be able to determine leaks.
e7ba79f6d3a8 Merge from eCos master repository on 1999-09-23-20:10:25-BST
jlarmour
parents: 36
diff changeset
396 if (0 == handler_thread_in_use_count) {
e7ba79f6d3a8 Merge from eCos master repository on 1999-09-23-20:10:25-BST
jlarmour
parents: 36
diff changeset
397 print_statistics(0);
e7ba79f6d3a8 Merge from eCos master repository on 1999-09-23-20:10:25-BST
jlarmour
parents: 36
diff changeset
398
e7ba79f6d3a8 Merge from eCos master repository on 1999-09-23-20:10:25-BST
jlarmour
parents: 36
diff changeset
399 // We've done the printing now. Resume the system.
e7ba79f6d3a8 Merge from eCos master repository on 1999-09-23-20:10:25-BST
jlarmour
parents: 36
diff changeset
400 time_to_report = 0;
e7ba79f6d3a8 Merge from eCos master repository on 1999-09-23-20:10:25-BST
jlarmour
parents: 36
diff changeset
401 cyg_mutex_lock(&client_request_lock); {
e7ba79f6d3a8 Merge from eCos master repository on 1999-09-23-20:10:25-BST
jlarmour
parents: 36
diff changeset
402 clients_paused = 0;
e7ba79f6d3a8 Merge from eCos master repository on 1999-09-23-20:10:25-BST
jlarmour
parents: 36
diff changeset
403 } cyg_mutex_unlock(&client_request_lock);
e7ba79f6d3a8 Merge from eCos master repository on 1999-09-23-20:10:25-BST
jlarmour
parents: 36
diff changeset
404 }
4
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
405 }
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
406
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
407 #ifdef DEATH_TIME_LIMIT
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
408 // Stop test if time.
4
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
409 if (is_dead) {
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
410 // Pause clients
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
411 cyg_mutex_lock(&client_request_lock); {
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
412 clients_paused = 1;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
413 } cyg_mutex_unlock(&client_request_lock);
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
414
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
415 // When all handlers have stopped, we can print statistics
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
416 // knowing that all (handler allocated) resources should have
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
417 // been freed. That is, we should be able to determine leaks.
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
418 if (0 == handler_thread_in_use_count) {
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
419 print_statistics(1);
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
420 CYG_TEST_PASS_FINISH("Kernel thread stress test OK");
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
421 }
4
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
422 }
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
423 #endif /* DEATH_TIME_LIMIT */
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
424
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
425 cyg_thread_delay(3);
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
426 }
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
427 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
428
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
429 /* client_program() -- an obnoxious client which makes a lot of requests */
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
430 void client_program(cyg_addrword_t data)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
431 {
24
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
432 int delay;
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
433
24
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
434 system_clockH = cyg_real_time_clock();
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
435 cyg_clock_to_counter(system_clockH, &counterH);
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
436
24
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
437 for (;;) {
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
438 delay = (rand() % 20);
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
439
24
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
440 /* now send a request to the server */
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
441 cyg_mutex_lock(&client_request_lock); {
38
e7ba79f6d3a8 Merge from eCos master repository on 1999-09-23-20:10:25-BST
jlarmour
parents: 36
diff changeset
442 if (0 == clients_paused)
e7ba79f6d3a8 Merge from eCos master repository on 1999-09-23-20:10:25-BST
jlarmour
parents: 36
diff changeset
443 client_makes_request++;
24
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
444 } cyg_mutex_unlock(&client_request_lock);
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
445
24
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
446 cyg_thread_delay(10+delay);
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
447 }
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
448 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
449
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
450 /* listener_program() -- listens for a request and spawns a handler to
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
451 take care of the request */
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
452 void listener_program(cyg_addrword_t data)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
453 {
4
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
454 for (;;) {
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
455 int make_request = 0;
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
456 cyg_mutex_lock(&client_request_lock); {
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
457 if (client_makes_request > 0) {
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
458 --client_makes_request;
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
459 make_request = 1;
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
460 }
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
461 } cyg_mutex_unlock(&client_request_lock);
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
462
38
e7ba79f6d3a8 Merge from eCos master repository on 1999-09-23-20:10:25-BST
jlarmour
parents: 36
diff changeset
463 if (make_request)
e7ba79f6d3a8 Merge from eCos master repository on 1999-09-23-20:10:25-BST
jlarmour
parents: 36
diff changeset
464 start_handler();
e7ba79f6d3a8 Merge from eCos master repository on 1999-09-23-20:10:25-BST
jlarmour
parents: 36
diff changeset
465
4
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
466 cyg_thread_delay(2 + (rand() % 10));
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
467 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
468 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
469
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
470 /* handler_program() -- is spawned to handle each incoming request */
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
471 void handler_program(cyg_addrword_t data)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
472 {
24
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
473 /* here is where we perform specific stressful tasks */
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
474 perform_stressful_tasks();
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
475
24
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
476 cyg_thread_delay(4 + (int) (0.5*log(1.0 + fabs((rand() % 1000000)))));
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
477
24
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
478 {
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
479 // Loop until the handler id and priority can be communicated to
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
480 // the main_program.
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
481 int freed = 0;
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
482 do {
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
483 cyg_mutex_lock(&free_handler_lock); {
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
484 if (-1 == free_handler_id) {
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
485 free_handler_id = data;
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
486 free_handler_pri = P_BASE_HANDLER+(int) data;
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
487 freed = 1;
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
488 }
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
489 } cyg_mutex_unlock(&free_handler_lock);
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
490 if (!freed)
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
491 cyg_thread_delay(2);
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
492 } while (!freed);
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
493 }
4
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
494
24
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
495 // Then exit.
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
496 cyg_thread_exit();
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
497 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
498
38
e7ba79f6d3a8 Merge from eCos master repository on 1999-09-23-20:10:25-BST
jlarmour
parents: 36
diff changeset
499 /* start a new handler */
e7ba79f6d3a8 Merge from eCos master repository on 1999-09-23-20:10:25-BST
jlarmour
parents: 36
diff changeset
500 void start_handler(void)
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
501 {
38
e7ba79f6d3a8 Merge from eCos master repository on 1999-09-23-20:10:25-BST
jlarmour
parents: 36
diff changeset
502 int prio;
e7ba79f6d3a8 Merge from eCos master repository on 1999-09-23-20:10:25-BST
jlarmour
parents: 36
diff changeset
503 char* name;
191
678094f34118 Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents: 161
diff changeset
504 int handler_slot = 0;
4
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
505 int found = 0;
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
506
4
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
507 while (!found) {
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
508 cyg_mutex_lock(&handler_slot_lock); {
38
e7ba79f6d3a8 Merge from eCos master repository on 1999-09-23-20:10:25-BST
jlarmour
parents: 36
diff changeset
509 for (handler_slot = 0; handler_slot < MAX_HANDLERS;++handler_slot){
e7ba79f6d3a8 Merge from eCos master repository on 1999-09-23-20:10:25-BST
jlarmour
parents: 36
diff changeset
510 if (!handler_thread_in_use[handler_slot]) {
4
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
511 found = 1;
38
e7ba79f6d3a8 Merge from eCos master repository on 1999-09-23-20:10:25-BST
jlarmour
parents: 36
diff changeset
512 handler_thread_in_use[handler_slot]++;
e7ba79f6d3a8 Merge from eCos master repository on 1999-09-23-20:10:25-BST
jlarmour
parents: 36
diff changeset
513 handler_thread_in_use_count++;
4
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
514 break;
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
515 }
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
516 }
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
517 } cyg_mutex_unlock(&handler_slot_lock);
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
518 if (!found)
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
519 cyg_thread_delay(1);
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
520 }
4
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
521
38
e7ba79f6d3a8 Merge from eCos master repository on 1999-09-23-20:10:25-BST
jlarmour
parents: 36
diff changeset
522 CYG_ASSERT(1 == handler_thread_in_use[handler_slot],
e7ba79f6d3a8 Merge from eCos master repository on 1999-09-23-20:10:25-BST
jlarmour
parents: 36
diff changeset
523 "Handler usage count wrong!");
e7ba79f6d3a8 Merge from eCos master repository on 1999-09-23-20:10:25-BST
jlarmour
parents: 36
diff changeset
524
e7ba79f6d3a8 Merge from eCos master repository on 1999-09-23-20:10:25-BST
jlarmour
parents: 36
diff changeset
525 prio = P_BASE_HANDLER+handler_slot;
e7ba79f6d3a8 Merge from eCos master repository on 1999-09-23-20:10:25-BST
jlarmour
parents: 36
diff changeset
526 CYG_ASSERT(0 == priority_in_use[prio], "Priority already in use!");
e7ba79f6d3a8 Merge from eCos master repository on 1999-09-23-20:10:25-BST
jlarmour
parents: 36
diff changeset
527 priority_in_use[prio]++;
e7ba79f6d3a8 Merge from eCos master repository on 1999-09-23-20:10:25-BST
jlarmour
parents: 36
diff changeset
528
e7ba79f6d3a8 Merge from eCos master repository on 1999-09-23-20:10:25-BST
jlarmour
parents: 36
diff changeset
529 name = &thread_name[prio][0];
e7ba79f6d3a8 Merge from eCos master repository on 1999-09-23-20:10:25-BST
jlarmour
parents: 36
diff changeset
530 sprintf(name, "handler-%02d/%02d", handler_slot, prio);
e7ba79f6d3a8 Merge from eCos master repository on 1999-09-23-20:10:25-BST
jlarmour
parents: 36
diff changeset
531
62
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 40
diff changeset
532 priority_translation[prio] =
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 40
diff changeset
533 sc_thread_create(prio, handler_program,
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 40
diff changeset
534 (cyg_addrword_t) handler_slot,
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 40
diff changeset
535 name, (void *) handler_stack[handler_slot],
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 40
diff changeset
536 STACK_SIZE_HANDLER, &handlerH[handler_slot],
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 40
diff changeset
537 &handler_thread_s[handler_slot]);
38
e7ba79f6d3a8 Merge from eCos master repository on 1999-09-23-20:10:25-BST
jlarmour
parents: 36
diff changeset
538 cyg_thread_resume(handlerH[handler_slot]);
e7ba79f6d3a8 Merge from eCos master repository on 1999-09-23-20:10:25-BST
jlarmour
parents: 36
diff changeset
539 ++statistics.handler_invocation_histogram[handler_slot];
e7ba79f6d3a8 Merge from eCos master repository on 1999-09-23-20:10:25-BST
jlarmour
parents: 36
diff changeset
540 }
4
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
541
38
e7ba79f6d3a8 Merge from eCos master repository on 1999-09-23-20:10:25-BST
jlarmour
parents: 36
diff changeset
542 /* free a locked handler thread */
e7ba79f6d3a8 Merge from eCos master repository on 1999-09-23-20:10:25-BST
jlarmour
parents: 36
diff changeset
543 void stop_handler(int handler_id, int handler_pri)
e7ba79f6d3a8 Merge from eCos master repository on 1999-09-23-20:10:25-BST
jlarmour
parents: 36
diff changeset
544 {
e7ba79f6d3a8 Merge from eCos master repository on 1999-09-23-20:10:25-BST
jlarmour
parents: 36
diff changeset
545 // Finally delete the handler thread. This must be done in a
e7ba79f6d3a8 Merge from eCos master repository on 1999-09-23-20:10:25-BST
jlarmour
parents: 36
diff changeset
546 // loop, waiting for the call to return true. If it returns
e7ba79f6d3a8 Merge from eCos master repository on 1999-09-23-20:10:25-BST
jlarmour
parents: 36
diff changeset
547 // false, go to sleep for a bit, so the killed thread gets a
e7ba79f6d3a8 Merge from eCos master repository on 1999-09-23-20:10:25-BST
jlarmour
parents: 36
diff changeset
548 // chance to run and complete its business.
e7ba79f6d3a8 Merge from eCos master repository on 1999-09-23-20:10:25-BST
jlarmour
parents: 36
diff changeset
549 while (!cyg_thread_delete(handlerH[handler_id])) {
e7ba79f6d3a8 Merge from eCos master repository on 1999-09-23-20:10:25-BST
jlarmour
parents: 36
diff changeset
550 cyg_thread_delay(1);
e7ba79f6d3a8 Merge from eCos master repository on 1999-09-23-20:10:25-BST
jlarmour
parents: 36
diff changeset
551 }
e7ba79f6d3a8 Merge from eCos master repository on 1999-09-23-20:10:25-BST
jlarmour
parents: 36
diff changeset
552 ++statistics.thread_exits;
e7ba79f6d3a8 Merge from eCos master repository on 1999-09-23-20:10:25-BST
jlarmour
parents: 36
diff changeset
553
e7ba79f6d3a8 Merge from eCos master repository on 1999-09-23-20:10:25-BST
jlarmour
parents: 36
diff changeset
554 // Free the handler resources.
e7ba79f6d3a8 Merge from eCos master repository on 1999-09-23-20:10:25-BST
jlarmour
parents: 36
diff changeset
555 cyg_mutex_lock(&handler_slot_lock); {
e7ba79f6d3a8 Merge from eCos master repository on 1999-09-23-20:10:25-BST
jlarmour
parents: 36
diff changeset
556 handler_thread_in_use[handler_id]--;
e7ba79f6d3a8 Merge from eCos master repository on 1999-09-23-20:10:25-BST
jlarmour
parents: 36
diff changeset
557 handler_thread_in_use_count--;
e7ba79f6d3a8 Merge from eCos master repository on 1999-09-23-20:10:25-BST
jlarmour
parents: 36
diff changeset
558 priority_in_use[handler_pri]--;
e7ba79f6d3a8 Merge from eCos master repository on 1999-09-23-20:10:25-BST
jlarmour
parents: 36
diff changeset
559 CYG_ASSERT(0 == priority_in_use[handler_pri],
e7ba79f6d3a8 Merge from eCos master repository on 1999-09-23-20:10:25-BST
jlarmour
parents: 36
diff changeset
560 "Priority not in use!");
e7ba79f6d3a8 Merge from eCos master repository on 1999-09-23-20:10:25-BST
jlarmour
parents: 36
diff changeset
561 CYG_ASSERT(0 == handler_thread_in_use[handler_id],
e7ba79f6d3a8 Merge from eCos master repository on 1999-09-23-20:10:25-BST
jlarmour
parents: 36
diff changeset
562 "Handler not in use!");
e7ba79f6d3a8 Merge from eCos master repository on 1999-09-23-20:10:25-BST
jlarmour
parents: 36
diff changeset
563 CYG_ASSERT(0 <= handler_thread_in_use_count,
e7ba79f6d3a8 Merge from eCos master repository on 1999-09-23-20:10:25-BST
jlarmour
parents: 36
diff changeset
564 "Stopped more handlers than was started!");
e7ba79f6d3a8 Merge from eCos master repository on 1999-09-23-20:10:25-BST
jlarmour
parents: 36
diff changeset
565 } cyg_mutex_unlock(&handler_slot_lock);
e7ba79f6d3a8 Merge from eCos master repository on 1999-09-23-20:10:25-BST
jlarmour
parents: 36
diff changeset
566
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
567 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
568
38
e7ba79f6d3a8 Merge from eCos master repository on 1999-09-23-20:10:25-BST
jlarmour
parents: 36
diff changeset
569
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
570 /* do things which will stress the system */
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
571 void perform_stressful_tasks()
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
572 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
573 #define MAX_MALLOCED_SPACES 100 /* do this many mallocs at most */
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
574 #define MALLOCED_BASE_SIZE 1 /* basic size in bytes */
24
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
575 char *spaces[MAX_MALLOCED_SPACES];
38
e7ba79f6d3a8 Merge from eCos master repository on 1999-09-23-20:10:25-BST
jlarmour
parents: 36
diff changeset
576 int sizes[MAX_MALLOCED_SPACES];
e7ba79f6d3a8 Merge from eCos master repository on 1999-09-23-20:10:25-BST
jlarmour
parents: 36
diff changeset
577 unsigned int i, j, size;
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
578
24
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
579 cyg_uint8 pool_space[10][100];
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
580 cyg_handle_t mempool_handles[10];
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
581 cyg_mempool_fix mempool_objects[10];
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
582
24
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
583 /* here I use malloc, which uses the kernel's variable memory pools.
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
584 note that malloc/free is a bit simple-minded here: it does not
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
585 try to really fragment things, and it does not try to make the
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
586 allocation/deallocation concurrent with other thread execution
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
587 (although I'm about to throw in a yield()) */
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
588 for (i = 0; i < MAX_MALLOCED_SPACES; ++i) {
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
589 ++statistics.malloc_tries;
38
e7ba79f6d3a8 Merge from eCos master repository on 1999-09-23-20:10:25-BST
jlarmour
parents: 36
diff changeset
590 size = (i*2+1)*MALLOCED_BASE_SIZE;
e7ba79f6d3a8 Merge from eCos master repository on 1999-09-23-20:10:25-BST
jlarmour
parents: 36
diff changeset
591 spaces[i] = (char *) malloc(size);
e7ba79f6d3a8 Merge from eCos master repository on 1999-09-23-20:10:25-BST
jlarmour
parents: 36
diff changeset
592 sizes[i] = size;
e7ba79f6d3a8 Merge from eCos master repository on 1999-09-23-20:10:25-BST
jlarmour
parents: 36
diff changeset
593
e7ba79f6d3a8 Merge from eCos master repository on 1999-09-23-20:10:25-BST
jlarmour
parents: 36
diff changeset
594 if (spaces[i] != NULL) {
e7ba79f6d3a8 Merge from eCos master repository on 1999-09-23-20:10:25-BST
jlarmour
parents: 36
diff changeset
595 // Fill with a known value (differs between chunk).
e7ba79f6d3a8 Merge from eCos master repository on 1999-09-23-20:10:25-BST
jlarmour
parents: 36
diff changeset
596 for (j = 0; j < size; ++j) {
e7ba79f6d3a8 Merge from eCos master repository on 1999-09-23-20:10:25-BST
jlarmour
parents: 36
diff changeset
597 spaces[i][j] = 0x50 | ((j+i) & 0x0f);
e7ba79f6d3a8 Merge from eCos master repository on 1999-09-23-20:10:25-BST
jlarmour
parents: 36
diff changeset
598 }
e7ba79f6d3a8 Merge from eCos master repository on 1999-09-23-20:10:25-BST
jlarmour
parents: 36
diff changeset
599 }
e7ba79f6d3a8 Merge from eCos master repository on 1999-09-23-20:10:25-BST
jlarmour
parents: 36
diff changeset
600
24
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
601 if (i % (MAX_MALLOCED_SPACES/10) == 0) {
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
602 cyg_thread_yield();
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
603 }
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
604 if (i % (MAX_MALLOCED_SPACES/15) == 0) {
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
605 cyg_thread_delay(i % 5);
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
606 }
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
607 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
608
38
e7ba79f6d3a8 Merge from eCos master repository on 1999-09-23-20:10:25-BST
jlarmour
parents: 36
diff changeset
609 cyg_thread_delay(5);
e7ba79f6d3a8 Merge from eCos master repository on 1999-09-23-20:10:25-BST
jlarmour
parents: 36
diff changeset
610
24
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
611 /* now free it all up */
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
612 for (i = 0; i < MAX_MALLOCED_SPACES; ++i) {
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
613 if (spaces[i] != NULL) {
38
e7ba79f6d3a8 Merge from eCos master repository on 1999-09-23-20:10:25-BST
jlarmour
parents: 36
diff changeset
614 size = sizes[i];
e7ba79f6d3a8 Merge from eCos master repository on 1999-09-23-20:10:25-BST
jlarmour
parents: 36
diff changeset
615 for (j = 0; j < size; ++j) {
e7ba79f6d3a8 Merge from eCos master repository on 1999-09-23-20:10:25-BST
jlarmour
parents: 36
diff changeset
616 // Validate chunk data.
e7ba79f6d3a8 Merge from eCos master repository on 1999-09-23-20:10:25-BST
jlarmour
parents: 36
diff changeset
617 if ((0x50 | ((j+i) & 0x0f)) != spaces[i][j]) {
e7ba79f6d3a8 Merge from eCos master repository on 1999-09-23-20:10:25-BST
jlarmour
parents: 36
diff changeset
618 printf("Bad byte in chunk\n");
e7ba79f6d3a8 Merge from eCos master repository on 1999-09-23-20:10:25-BST
jlarmour
parents: 36
diff changeset
619 }
24
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
620 spaces[i][j] = 0xAA; /* write a bit pattern */
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
621 }
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
622 free(spaces[i]);
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
623 } else {
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
624 ++statistics.malloc_failures;
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
625 }
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
626 }
38
e7ba79f6d3a8 Merge from eCos master repository on 1999-09-23-20:10:25-BST
jlarmour
parents: 36
diff changeset
627
24
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
628 /* now allocate and then free some fixed-size memory pools; for
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
629 now this is simple-minded because it does not have many threads
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
630 sharing the memory pools and racing for memory. */
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
631 for (i = 0; i < 10; ++i) {
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
632 cyg_mempool_fix_create(pool_space[i], 100, (i+1)*3,
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
633 &mempool_handles[i], &mempool_objects[i]);
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
634 }
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
635
24
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
636 for (i = 0; i < 10; ++i) {
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
637 spaces[i] = cyg_mempool_fix_try_alloc(mempool_handles[i]);
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
638 }
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
639
24
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
640 for (i = 0; i < 10; ++i) {
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
641 if (spaces[i]) {
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
642 cyg_mempool_fix_delete(mempool_handles[i]);
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
643 }
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
644 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
645 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
646
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
647 /* report_alarm_func() is invoked as an alarm handler, so it should be
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
648 quick and simple. in this case it sets a global flag which is
4
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
649 checked by main_program. */
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
650 void report_alarm_func(cyg_handle_t alarmH, cyg_addrword_t data)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
651 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
652 time_to_report = 1;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
653 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
654
10
d3fbcdfa1b2f Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents: 8
diff changeset
655 #ifdef DEATH_TIME_LIMIT
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
656 /* this sets up death alarms. it gets the handle and alarm from the
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
657 caller, since they must persist for the life of the alarm */
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
658 void setup_death_alarm(cyg_addrword_t data, cyg_handle_t *deathHp,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
659 cyg_alarm *death_alarm_p, int *killed_p)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
660 {
24
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
661 cyg_handle_t system_clockH, counterH;
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
662 cyg_resolution_t rtc_res;
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
663
24
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
664 system_clockH = cyg_real_time_clock();
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
665 cyg_clock_to_counter(system_clockH, &counterH);
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
666
24
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
667 cyg_alarm_create(counterH, death_alarm_func,
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
668 (cyg_addrword_t) killed_p,
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
669 deathHp, death_alarm_p);
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
670 rtc_res = cyg_clock_get_resolution(system_clockH);
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
671 {
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
672 cyg_tick_count_t tick_delay;
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
673 tick_delay = (long long)
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
674 ((1000000000.0*rtc_res.divisor)
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
675 *((double)DEATH_TIME_LIMIT)/((double)rtc_res.dividend));
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
676 if ( cyg_test_is_simulator )
157
b65ec671dd4c Merge from eCos master repository on 2001-04-06-18:28:36-BST
jlarmour
parents: 151
diff changeset
677 tick_delay /= SIM_DELAY_DIVISOR;
161
ac086aa3217e Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents: 157
diff changeset
678 #ifdef CYGPKG_HAL_SYNTH
24
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
679 // 20 seconds is a long time compared to the run time of other tests.
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
680 // Reduce to 10 seconds, allowing more tests to get run.
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
681 tick_delay /= 2;
4
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
682 #endif
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
683
24
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
684 cyg_alarm_initialize(*deathHp, cyg_current_time() + tick_delay, 0);
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
685 }
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
686 }
10
d3fbcdfa1b2f Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents: 8
diff changeset
687 #endif
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
688
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
689 /* death_alarm_func() is the alarm handler that kills the current
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
690 thread after a specified timeout. It does so by setting a flag the
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
691 thread is constantly checking. */
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
692 void death_alarm_func(cyg_handle_t alarmH, cyg_addrword_t data)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
693 {
24
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
694 int *killed_p;
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
695 killed_p = (int *) data;
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
696 *killed_p = 1;
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
697 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
698
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
699 /* now I write the sc_ versions of the cyg_functions */
62
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 40
diff changeset
700 cyg_addrword_t sc_thread_create(
4
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
701 cyg_addrword_t sched_info, /* scheduling info (eg pri) */
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
702 cyg_thread_entry_t *entry, /* entry point function */
4
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
703 cyg_addrword_t entry_data, /* entry data */
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
704 char *name, /* optional thread name */
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
705 void *stack_base, /* stack base, NULL = alloc */
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
706 cyg_ucount32 stack_size, /* stack size, 0 = default */
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
707 cyg_handle_t *handle, /* returned thread handle */
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
708 cyg_thread *thread /* put thread here */
24
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
709 )
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
710 {
24
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
711 ++statistics.thread_creations;
62
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 40
diff changeset
712
24
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
713 cyg_thread_create(sched_info, entry, entry_data, name,
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
714 stack_base, stack_size, handle, thread);
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
715
62
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 40
diff changeset
716 return cyg_thread_get_priority(*handle);
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
717 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
718
10
d3fbcdfa1b2f Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents: 8
diff changeset
719
36
e97d78785e2d Merge from eCos master repository on 1999-09-12-15:40:34-BST
jlarmour
parents: 28
diff changeset
720 #define MINS_HOUR (60)
e97d78785e2d Merge from eCos master repository on 1999-09-12-15:40:34-BST
jlarmour
parents: 28
diff changeset
721 #define MINS_DAY (60*24)
e97d78785e2d Merge from eCos master repository on 1999-09-12-15:40:34-BST
jlarmour
parents: 28
diff changeset
722
10
d3fbcdfa1b2f Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents: 8
diff changeset
723 void print_statistics(int print_full)
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
724 {
24
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
725 int i;
36
e97d78785e2d Merge from eCos master repository on 1999-09-12-15:40:34-BST
jlarmour
parents: 28
diff changeset
726 static int stat_dumps = 0;
24
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
727 static int print_count = 0;
36
e97d78785e2d Merge from eCos master repository on 1999-09-12-15:40:34-BST
jlarmour
parents: 28
diff changeset
728 static int shift_count = 0;
e97d78785e2d Merge from eCos master repository on 1999-09-12-15:40:34-BST
jlarmour
parents: 28
diff changeset
729 int minutes;
e97d78785e2d Merge from eCos master repository on 1999-09-12-15:40:34-BST
jlarmour
parents: 28
diff changeset
730
e97d78785e2d Merge from eCos master repository on 1999-09-12-15:40:34-BST
jlarmour
parents: 28
diff changeset
731 stat_dumps++;
e97d78785e2d Merge from eCos master repository on 1999-09-12-15:40:34-BST
jlarmour
parents: 28
diff changeset
732
e97d78785e2d Merge from eCos master repository on 1999-09-12-15:40:34-BST
jlarmour
parents: 28
diff changeset
733 // Find number of minutes.
e97d78785e2d Merge from eCos master repository on 1999-09-12-15:40:34-BST
jlarmour
parents: 28
diff changeset
734 minutes = time_report_delay*stat_dumps / 60;
e97d78785e2d Merge from eCos master repository on 1999-09-12-15:40:34-BST
jlarmour
parents: 28
diff changeset
735
e97d78785e2d Merge from eCos master repository on 1999-09-12-15:40:34-BST
jlarmour
parents: 28
diff changeset
736 if (!print_full) {
e97d78785e2d Merge from eCos master repository on 1999-09-12-15:40:34-BST
jlarmour
parents: 28
diff changeset
737 // Return if time/minutes not integer.
e97d78785e2d Merge from eCos master repository on 1999-09-12-15:40:34-BST
jlarmour
parents: 28
diff changeset
738 if ((time_report_delay*stat_dumps % 60) != 0)
e97d78785e2d Merge from eCos master repository on 1999-09-12-15:40:34-BST
jlarmour
parents: 28
diff changeset
739 return;
10
d3fbcdfa1b2f Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents: 8
diff changeset
740
36
e97d78785e2d Merge from eCos master repository on 1999-09-12-15:40:34-BST
jlarmour
parents: 28
diff changeset
741 // After the first day, only dump stat once per day. Do print
e97d78785e2d Merge from eCos master repository on 1999-09-12-15:40:34-BST
jlarmour
parents: 28
diff changeset
742 // a . on the hour though.
e97d78785e2d Merge from eCos master repository on 1999-09-12-15:40:34-BST
jlarmour
parents: 28
diff changeset
743 if ((minutes > MINS_DAY) && ((minutes % MINS_DAY) != 0)) {
40
a3cc6665b684 Merge from eCos master repository on 1999-10-01-07:47:04-BST
jlarmour
parents: 38
diff changeset
744 if ((minutes % MINS_HOUR) == 0) {
36
e97d78785e2d Merge from eCos master repository on 1999-09-12-15:40:34-BST
jlarmour
parents: 28
diff changeset
745 printf(".");
40
a3cc6665b684 Merge from eCos master repository on 1999-10-01-07:47:04-BST
jlarmour
parents: 38
diff changeset
746 fflush(stdout);
a3cc6665b684 Merge from eCos master repository on 1999-10-01-07:47:04-BST
jlarmour
parents: 38
diff changeset
747 }
36
e97d78785e2d Merge from eCos master repository on 1999-09-12-15:40:34-BST
jlarmour
parents: 28
diff changeset
748 return;
e97d78785e2d Merge from eCos master repository on 1999-09-12-15:40:34-BST
jlarmour
parents: 28
diff changeset
749 }
e97d78785e2d Merge from eCos master repository on 1999-09-12-15:40:34-BST
jlarmour
parents: 28
diff changeset
750
e97d78785e2d Merge from eCos master repository on 1999-09-12-15:40:34-BST
jlarmour
parents: 28
diff changeset
751 // After the first hour of the first day, only dump stat once
e97d78785e2d Merge from eCos master repository on 1999-09-12-15:40:34-BST
jlarmour
parents: 28
diff changeset
752 // per hour. Do print . each minute though.
e97d78785e2d Merge from eCos master repository on 1999-09-12-15:40:34-BST
jlarmour
parents: 28
diff changeset
753 if ((minutes < MINS_DAY) && (minutes > MINS_HOUR)
e97d78785e2d Merge from eCos master repository on 1999-09-12-15:40:34-BST
jlarmour
parents: 28
diff changeset
754 && ((minutes % MINS_HOUR) != 0)) {
e97d78785e2d Merge from eCos master repository on 1999-09-12-15:40:34-BST
jlarmour
parents: 28
diff changeset
755 printf(".");
40
a3cc6665b684 Merge from eCos master repository on 1999-10-01-07:47:04-BST
jlarmour
parents: 38
diff changeset
756 fflush(stdout);
36
e97d78785e2d Merge from eCos master repository on 1999-09-12-15:40:34-BST
jlarmour
parents: 28
diff changeset
757 return;
e97d78785e2d Merge from eCos master repository on 1999-09-12-15:40:34-BST
jlarmour
parents: 28
diff changeset
758 }
e97d78785e2d Merge from eCos master repository on 1999-09-12-15:40:34-BST
jlarmour
parents: 28
diff changeset
759 }
e97d78785e2d Merge from eCos master repository on 1999-09-12-15:40:34-BST
jlarmour
parents: 28
diff changeset
760
e97d78785e2d Merge from eCos master repository on 1999-09-12-15:40:34-BST
jlarmour
parents: 28
diff changeset
761 printf("\nState dump %d (%d hours, %d minutes) [numbers >>%d]\n",
38
e7ba79f6d3a8 Merge from eCos master repository on 1999-09-23-20:10:25-BST
jlarmour
parents: 36
diff changeset
762 ++print_count, minutes / MINS_HOUR, minutes % MINS_HOUR,
e7ba79f6d3a8 Merge from eCos master repository on 1999-09-23-20:10:25-BST
jlarmour
parents: 36
diff changeset
763 shift_count);
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
764
24
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
765 cyg_mutex_lock(&statistics_print_lock); {
36
e97d78785e2d Merge from eCos master repository on 1999-09-12-15:40:34-BST
jlarmour
parents: 28
diff changeset
766 //--------------------------------
e97d78785e2d Merge from eCos master repository on 1999-09-12-15:40:34-BST
jlarmour
parents: 28
diff changeset
767 // Information private to this test:
24
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
768 printf(" Handler-invocations: ");
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
769 for (i = 0; i < MAX_HANDLERS; ++i) {
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
770 printf("%4lu ", statistics.handler_invocation_histogram[i]);
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
771 }
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
772 printf("\n");
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
773 printf(" malloc()-tries/failures: -- %7lu %7lu\n",
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
774 statistics.malloc_tries, statistics.malloc_failures);
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
775 printf(" client_makes_request: %d\n", client_makes_request);
36
e97d78785e2d Merge from eCos master repository on 1999-09-12-15:40:34-BST
jlarmour
parents: 28
diff changeset
776
e97d78785e2d Merge from eCos master repository on 1999-09-12-15:40:34-BST
jlarmour
parents: 28
diff changeset
777 // Check for big numbers and reduce if getting close to overflow
e97d78785e2d Merge from eCos master repository on 1999-09-12-15:40:34-BST
jlarmour
parents: 28
diff changeset
778 if (statistics.malloc_tries > 0x40000000) {
e97d78785e2d Merge from eCos master repository on 1999-09-12-15:40:34-BST
jlarmour
parents: 28
diff changeset
779 shift_count++;
e97d78785e2d Merge from eCos master repository on 1999-09-12-15:40:34-BST
jlarmour
parents: 28
diff changeset
780 for (i = 0; i < MAX_HANDLERS; ++i) {
e97d78785e2d Merge from eCos master repository on 1999-09-12-15:40:34-BST
jlarmour
parents: 28
diff changeset
781 statistics.handler_invocation_histogram[i] >>= 1;
e97d78785e2d Merge from eCos master repository on 1999-09-12-15:40:34-BST
jlarmour
parents: 28
diff changeset
782 }
e97d78785e2d Merge from eCos master repository on 1999-09-12-15:40:34-BST
jlarmour
parents: 28
diff changeset
783 statistics.malloc_tries >>= 1;
e97d78785e2d Merge from eCos master repository on 1999-09-12-15:40:34-BST
jlarmour
parents: 28
diff changeset
784 statistics.malloc_failures >>= 1;
e97d78785e2d Merge from eCos master repository on 1999-09-12-15:40:34-BST
jlarmour
parents: 28
diff changeset
785 }
38
e7ba79f6d3a8 Merge from eCos master repository on 1999-09-23-20:10:25-BST
jlarmour
parents: 36
diff changeset
786 } cyg_mutex_unlock(&statistics_print_lock);
36
e97d78785e2d Merge from eCos master repository on 1999-09-12-15:40:34-BST
jlarmour
parents: 28
diff changeset
787
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
788 #if CYGINT_ISO_MALLINFO
38
e7ba79f6d3a8 Merge from eCos master repository on 1999-09-23-20:10:25-BST
jlarmour
parents: 36
diff changeset
789 //--------------------------------
e7ba79f6d3a8 Merge from eCos master repository on 1999-09-23-20:10:25-BST
jlarmour
parents: 36
diff changeset
790 // System information
e7ba79f6d3a8 Merge from eCos master repository on 1999-09-23-20:10:25-BST
jlarmour
parents: 36
diff changeset
791 {
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
792 struct mallinfo mem_info;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
793
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
794 mem_info = mallinfo();
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
795
38
e7ba79f6d3a8 Merge from eCos master repository on 1999-09-23-20:10:25-BST
jlarmour
parents: 36
diff changeset
796 printf(" Memory system: Total=0x%08x Free=0x%08x Max=0x%08x\n",
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
797 mem_info.arena, mem_info.fordblks, mem_info.maxfree);
38
e7ba79f6d3a8 Merge from eCos master repository on 1999-09-23-20:10:25-BST
jlarmour
parents: 36
diff changeset
798 }
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
799 #endif
24
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
800
36
e97d78785e2d Merge from eCos master repository on 1999-09-12-15:40:34-BST
jlarmour
parents: 28
diff changeset
801 // Dump stack status
e97d78785e2d Merge from eCos master repository on 1999-09-12-15:40:34-BST
jlarmour
parents: 28
diff changeset
802 printf(" Stack usage:\n");
e97d78785e2d Merge from eCos master repository on 1999-09-12-15:40:34-BST
jlarmour
parents: 28
diff changeset
803 cyg_test_dump_interrupt_stack_stats( " Interrupt" );
e97d78785e2d Merge from eCos master repository on 1999-09-12-15:40:34-BST
jlarmour
parents: 28
diff changeset
804 cyg_test_dump_idlethread_stack_stats( " Idle" );
e97d78785e2d Merge from eCos master repository on 1999-09-12-15:40:34-BST
jlarmour
parents: 28
diff changeset
805
e97d78785e2d Merge from eCos master repository on 1999-09-12-15:40:34-BST
jlarmour
parents: 28
diff changeset
806 cyg_test_dump_stack_stats(" Main", main_stack,
e97d78785e2d Merge from eCos master repository on 1999-09-12-15:40:34-BST
jlarmour
parents: 28
diff changeset
807 main_stack + sizeof(main_stack));
e97d78785e2d Merge from eCos master repository on 1999-09-12-15:40:34-BST
jlarmour
parents: 28
diff changeset
808 for (i = 0; i < MAX_HANDLERS; i++) {
e97d78785e2d Merge from eCos master repository on 1999-09-12-15:40:34-BST
jlarmour
parents: 28
diff changeset
809 cyg_test_dump_stack_stats(" Handler", handler_stack[i],
e97d78785e2d Merge from eCos master repository on 1999-09-12-15:40:34-BST
jlarmour
parents: 28
diff changeset
810 handler_stack[i] + sizeof(handler_stack[i]));
e97d78785e2d Merge from eCos master repository on 1999-09-12-15:40:34-BST
jlarmour
parents: 28
diff changeset
811 }
e97d78785e2d Merge from eCos master repository on 1999-09-12-15:40:34-BST
jlarmour
parents: 28
diff changeset
812 for (i = 0; i < N_LISTENERS; i++) {
e97d78785e2d Merge from eCos master repository on 1999-09-12-15:40:34-BST
jlarmour
parents: 28
diff changeset
813 cyg_test_dump_stack_stats(" Listener", listener_stack[i],
e97d78785e2d Merge from eCos master repository on 1999-09-12-15:40:34-BST
jlarmour
parents: 28
diff changeset
814 listener_stack[i] + sizeof(listener_stack[i]));
e97d78785e2d Merge from eCos master repository on 1999-09-12-15:40:34-BST
jlarmour
parents: 28
diff changeset
815 }
e97d78785e2d Merge from eCos master repository on 1999-09-12-15:40:34-BST
jlarmour
parents: 28
diff changeset
816 for (i = 0; i < N_CLIENTS; i++) {
e97d78785e2d Merge from eCos master repository on 1999-09-12-15:40:34-BST
jlarmour
parents: 28
diff changeset
817 cyg_test_dump_stack_stats(" Client", client_stack[i],
e97d78785e2d Merge from eCos master repository on 1999-09-12-15:40:34-BST
jlarmour
parents: 28
diff changeset
818 client_stack[i] + sizeof(client_stack[i]));
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
819 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
820 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
821
4
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
822 #else /* (CYGNUM_KERNEL_SCHED_PRIORITIES >= */
24
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
823 /* (N_MAIN+N_CLIENTS+N_LISTENERS+MAX_HANDLERS)) */
4
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
824 #define N_A_MSG "not enough priorities available"
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
825 #endif /* (CYGNUM_KERNEL_SCHED_PRIORITIES >= */
24
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
826 /* (N_MAIN+N_CLIENTS+N_LISTENERS+MAX_HANDLERS)) */
4
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
827
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
828 #else /* CYGINT_ISO_MALLOC */
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
829 # define N_A_MSG "this test needs malloc"
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
830 #endif /* CYGINT_ISO_MALLOC */
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
831
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
832 #else /* CYGFUN_KERNEL_THREADS_TIMER */
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
833 # define N_A_MSG "this test needs kernel threads timer"
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
834 #endif /* CYGFUN_KERNEL_THREADS_TIMER */
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
835
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
836 #else /* CYGPKG_LIBM */
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
837 # define N_A_MSG "this test needs libm"
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
838 #endif /* CYGPKG_LIBM */
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
839
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
840 #else /* CYGINT_ISO_STDIO_FORMATTED_IO */
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
841 # define N_A_MSG "this test needs stdio formatted I/O"
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
842 #endif /* CYGINT_ISO_STDIO_FORMATTED_IO */
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
843
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
844 #else // def CYGFUN_KERNEL_API_C
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
845 # define N_A_MSG "this test needs Kernel C API"
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
846 #endif
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
847
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
848 #else // def CYGPKG_KERNEL && CYGPKG_IO && CYGPKG_ISOINFRA
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
849 # define N_A_MSG "this tests needs Kernel, isoinfra and IO"
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
850 #endif
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
851
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
852 #ifdef N_A_MSG
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
853 externC void
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
854 cyg_start( void )
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
855 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
856 CYG_TEST_INIT();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
857 CYG_TEST_NA( N_A_MSG);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
858 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
859 #endif // N_A_MSG