annotate packages/kernel/current/tests/stress_threads.c @ 161:ac086aa3217e

Merge from eCos master repository on 2001-06-08-21:11:51-BST
author jlarmour
date Sun, 10 Jun 2001 19:35:23 +0000
parents b65ec671dd4c
children 678094f34118
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 //==========================================================================
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
8 //####COPYRIGHTBEGIN####
64
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 62
diff changeset
9 //
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 62
diff changeset
10 // -------------------------------------------
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 62
diff changeset
11 // The contents of this file are subject to the Red Hat eCos Public License
66
bf00f99aec69 Merge from eCos master repository on 2000-02-02-19:16:44-GMT
jlarmour
parents: 64
diff changeset
12 // Version 1.1 (the "License"); you may not use this file except in
64
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 62
diff changeset
13 // compliance with the License. You may obtain a copy of the License at
66
bf00f99aec69 Merge from eCos master repository on 2000-02-02-19:16:44-GMT
jlarmour
parents: 64
diff changeset
14 // http://www.redhat.com/
64
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 62
diff changeset
15 //
66
bf00f99aec69 Merge from eCos master repository on 2000-02-02-19:16:44-GMT
jlarmour
parents: 64
diff changeset
16 // Software distributed under the License is distributed on an "AS IS"
64
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 62
diff changeset
17 // basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 62
diff changeset
18 // License for the specific language governing rights and limitations under
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 62
diff changeset
19 // the License.
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 62
diff changeset
20 //
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 62
diff changeset
21 // The Original Code is eCos - Embedded Configurable Operating System,
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 62
diff changeset
22 // released September 30, 1998.
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 62
diff changeset
23 //
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 62
diff changeset
24 // The Initial Developer of the Original Code is Red Hat.
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 62
diff changeset
25 // Portions created by Red Hat are
161
ac086aa3217e Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents: 157
diff changeset
26 // Copyright (C) 1998, 1999, 2000, 2001 Red Hat, Inc.
64
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 62
diff changeset
27 // All Rights Reserved.
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 62
diff changeset
28 // -------------------------------------------
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 62
diff changeset
29 //
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
30 //####COPYRIGHTEND####
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
31 //==========================================================================
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
32 //#####DESCRIPTIONBEGIN####
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
33 //
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
34 // Author(s): rosalia
4
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
35 // Contributors: rosalia, jskov
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
36 // Date: 1999-04-13
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
37 // Description: Very simple thread stress test, with some memory
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
38 // allocation and alarm handling.
4
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
39 //
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
40 // Notes:
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
41 // 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
42 // 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
43 // 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
44 //
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
45 // 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
46 // 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
47 // should spread out.
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
48 //####DESCRIPTIONEND####
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
49
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
50 #include <pkgconf/system.h>
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
51 #include <cyg/infra/testcase.h>
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
52
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
53 #include <cyg/hal/hal_arch.h>
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
54
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
55 #if defined(CYGPKG_KERNEL) && defined(CYGPKG_IO) && defined(CYGPKG_ISOINFRA)
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
56
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
57 #include <pkgconf/kernel.h>
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
58 #include <pkgconf/isoinfra.h>
78
59d97b6ba612 Merge from eCos master repository on 2000-03-28-19:50:47-BST
jlarmour
parents: 66
diff changeset
59 #include CYGHWR_MEMORY_LAYOUT_H
2
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 #if defined(CYGFUN_KERNEL_API_C)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
62
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
63 #include <cyg/kernel/kapi.h>
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
64
151
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents: 115
diff changeset
65 #ifdef CYGINT_ISO_STDIO_FORMATTED_IO
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
66
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
67 #include <stdio.h>
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
68 #include <stdlib.h>
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
69
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
70 #if defined(CYGPKG_LIBM)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
71
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
72 #include <math.h>
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
73 #include <assert.h>
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
74
10
d3fbcdfa1b2f Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents: 8
diff changeset
75 #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
76
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
77 #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
78 #if CYGINT_ISO_MALLOC
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
79
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
80 /* 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
81 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
82 #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
83 /* #undef DEATH_TIME_LIMIT */
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
84
22
53104bbd5f99 Merge from eCos master repository on 1999-07-09-05:47:06-BST
jlarmour
parents: 10
diff changeset
85 // 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
86 // 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
87 #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
88 #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
89
e97d78785e2d Merge from eCos master repository on 1999-09-12-15:40:34-BST
jlarmour
parents: 28
diff changeset
90 #define N_MAIN 1
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
91
157
b65ec671dd4c Merge from eCos master repository on 2001-04-06-18:28:36-BST
jlarmour
parents: 151
diff changeset
92 // 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
93 // 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
94 #ifdef CYGPKG_KERNEL_INSTRUMENT
b65ec671dd4c Merge from eCos master repository on 2001-04-06-18:28:36-BST
jlarmour
parents: 151
diff changeset
95 #define SIM_DELAY_DIVISOR 100
b65ec671dd4c Merge from eCos master repository on 2001-04-06-18:28:36-BST
jlarmour
parents: 151
diff changeset
96 #else
b65ec671dd4c Merge from eCos master repository on 2001-04-06-18:28:36-BST
jlarmour
parents: 151
diff changeset
97 #define SIM_DELAY_DIVISOR 10
b65ec671dd4c Merge from eCos master repository on 2001-04-06-18:28:36-BST
jlarmour
parents: 151
diff changeset
98 #endif
b65ec671dd4c Merge from eCos master repository on 2001-04-06-18:28:36-BST
jlarmour
parents: 151
diff changeset
99
36
e97d78785e2d Merge from eCos master repository on 1999-09-12-15:40:34-BST
jlarmour
parents: 28
diff changeset
100 //-----------------------------------------------------------------------
e97d78785e2d Merge from eCos master repository on 1999-09-12-15:40:34-BST
jlarmour
parents: 28
diff changeset
101 // 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
102 // memory restrictions.
78
59d97b6ba612 Merge from eCos master repository on 2000-03-28-19:50:47-BST
jlarmour
parents: 66
diff changeset
103 #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
104 #define MAX_HANDLERS 4
e97d78785e2d Merge from eCos master repository on 1999-09-12-15:40:34-BST
jlarmour
parents: 28
diff changeset
105 #define N_LISTENERS 1
e97d78785e2d Merge from eCos master repository on 1999-09-12-15:40:34-BST
jlarmour
parents: 28
diff changeset
106 #define N_CLIENTS 1
e97d78785e2d Merge from eCos master repository on 1999-09-12-15:40:34-BST
jlarmour
parents: 28
diff changeset
107
e97d78785e2d Merge from eCos master repository on 1999-09-12-15:40:34-BST
jlarmour
parents: 28
diff changeset
108 #undef STACK_SIZE
e97d78785e2d Merge from eCos master repository on 1999-09-12-15:40:34-BST
jlarmour
parents: 28
diff changeset
109 #undef STACK_SIZE_HANDLER
e97d78785e2d Merge from eCos master repository on 1999-09-12-15:40:34-BST
jlarmour
parents: 28
diff changeset
110 #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
111 #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
112 #endif
e97d78785e2d Merge from eCos master repository on 1999-09-12-15:40:34-BST
jlarmour
parents: 28
diff changeset
113
e97d78785e2d Merge from eCos master repository on 1999-09-12-15:40:34-BST
jlarmour
parents: 28
diff changeset
114 //-----------------------------------------------------------------------
e97d78785e2d Merge from eCos master repository on 1999-09-12-15:40:34-BST
jlarmour
parents: 28
diff changeset
115 // 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
116 #ifndef MAX_HANDLERS
4
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
117 #define MAX_HANDLERS 19
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
118 #define N_LISTENERS 4
4
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
119 #define N_CLIENTS 4
36
e97d78785e2d Merge from eCos master repository on 1999-09-12-15:40:34-BST
jlarmour
parents: 28
diff changeset
120 #endif
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
121
24
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
122 /* 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
123 (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
124 complete their tasks.
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 40
diff changeset
125
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 40
diff changeset
126 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
127 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
128 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
129 listeners/clients. */
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 40
diff changeset
130
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 40
diff changeset
131 #define P_MAIN_PROGRAM 1
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 40
diff changeset
132 #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
133
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 40
diff changeset
134 #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
135 #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
136
62
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 40
diff changeset
137 #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
138 #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
139
62
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 40
diff changeset
140 #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
141 #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
142
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 40
diff changeset
143 #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
144 #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
145
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 40
diff changeset
146 #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
147
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 40
diff changeset
148 /* 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
149 #if (CYGNUM_KERNEL_SCHED_PRIORITIES >= P_MAX)
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
150
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
151 /* 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
152 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
153 static volatile char priority_in_use[P_MAX];
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
154
62
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 40
diff changeset
155 /* 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
156 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
157 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
158 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
159 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
160
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
161 /* now declare (and allocate space for) some kernel objects, like the
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
162 threads we will use */
4
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
163 cyg_thread main_thread_s;
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
164 cyg_thread handler_thread_s[MAX_HANDLERS];
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
165 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
166 cyg_thread client_thread_s[N_CLIENTS];
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
167
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
168 /* 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
169 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
170 char handler_stack[MAX_HANDLERS][STACK_SIZE_HANDLER];
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
171 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
172 char client_stack[N_CLIENTS][STACK_SIZE];
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
173
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
174 /* 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
175 cyg_handle_t mainH;
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
176 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
177 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
178 cyg_handle_t clientH[N_CLIENTS];
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
179
24
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
180 /* space for thread names */
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
181 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
182
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
183 /* 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
184 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
185 handler_program;
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
186
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
187 /* 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
188 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
189 free_handler_lock;
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
190
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
191 /* 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
192 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
193 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
194 that the variables are empty. */
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
195 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
196 volatile int free_handler_id = -1;
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
197
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
198 /* 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
199 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
200
e7ba79f6d3a8 Merge from eCos master repository on 1999-09-23-20:10:25-BST
jlarmour
parents: 36
diff changeset
201 /* 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
202 volatile int clients_paused = 0;
e7ba79f6d3a8 Merge from eCos master repository on 1999-09-23-20:10:25-BST
jlarmour
parents: 36
diff changeset
203
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
204
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
205 /* 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
206 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
207 /* 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
208 int time_report_delay;
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
209
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
210 /*** now application-specific variables ***/
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
211 /* 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
212 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
213 /* total count of active handlers */
e7ba79f6d3a8 Merge from eCos master repository on 1999-09-23-20:10:25-BST
jlarmour
parents: 36
diff changeset
214 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
215
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
216
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
217 /***** statistics-gathering variables *****/
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
218 struct s_statistics {
10
d3fbcdfa1b2f Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents: 8
diff changeset
219 /* 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
220 unsigned long handler_invocation_histogram[MAX_HANDLERS];
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
221
10
d3fbcdfa1b2f Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents: 8
diff changeset
222 /* 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
223 it has failed */
d3fbcdfa1b2f Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents: 8
diff changeset
224 unsigned long malloc_tries, malloc_failures;
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
225
10
d3fbcdfa1b2f Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents: 8
diff changeset
226 /* 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
227 unsigned long thread_creations, thread_exits;
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
228 };
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
229
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
230 struct s_statistics statistics;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
231
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
232 /* some function prototypes; those with the sc_ prefix are
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
233 "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
234 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
235 cyg_addrword_t sched_info, /* scheduling info (eg pri) */
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
236 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
237 cyg_addrword_t entry_data, /* entry data */
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
238 char *name, /* optional thread name */
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
239 void *stack_base, /* stack base, NULL = alloc */
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
240 cyg_ucount32 stack_size, /* stack size, 0 = default */
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
241 cyg_handle_t *handle, /* returned thread handle */
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
242 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
243 );
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
244
38
e7ba79f6d3a8 Merge from eCos master repository on 1999-09-23-20:10:25-BST
jlarmour
parents: 36
diff changeset
245 void start_handler(void);
e7ba79f6d3a8 Merge from eCos master repository on 1999-09-23-20:10:25-BST
jlarmour
parents: 36
diff changeset
246 void stop_handler(int handler_id, int handler_pri);
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
247 void perform_stressful_tasks(void);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
248 void permute_array(char a[], int size, int seed);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
249 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
250 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
251 void print_statistics(int print_full);
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
252
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
253 /* we need to declare the alarm handling function (which is defined
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
254 below), so that we can pass it to cyg_alarm_initialize() */
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
255 cyg_alarm_t report_alarm_func, death_alarm_func;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
256
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
257 /* handle and alarm for the report alarm */
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
258 cyg_handle_t report_alarmH, counterH, system_clockH;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
259 cyg_alarm report_alarm;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
260
22
53104bbd5f99 Merge from eCos master repository on 1999-07-09-05:47:06-BST
jlarmour
parents: 10
diff changeset
261 /* 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
262 int
53104bbd5f99 Merge from eCos master repository on 1999-07-09-05:47:06-BST
jlarmour
parents: 10
diff changeset
263 main(void)
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
264 {
24
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
265 int i;
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
266
24
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
267 CYG_TEST_INIT();
40
a3cc6665b684 Merge from eCos master repository on 1999-10-01-07:47:04-BST
jlarmour
parents: 38
diff changeset
268 CYG_TEST_INFO("Stress threads test compiled on " __DATE__);
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
269
24
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
270 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
271 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
272 cyg_mutex_init(&free_handler_lock);
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 /* initialize statistics */
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
275 memset(&statistics, 0, sizeof(statistics));
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
276
24
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
277 /* clear priority table */
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
278 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
279 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
280
24
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
281 /* initialize main thread */
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
282 {
62
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 40
diff changeset
283 priority_translation[P_MAIN_PROGRAM] =
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 40
diff changeset
284 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
285 "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
286 &mainH, &main_thread_s);
24
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
287 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
288 }
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 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
291 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
292 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
293 }
38
e7ba79f6d3a8 Merge from eCos master repository on 1999-09-23-20:10:25-BST
jlarmour
parents: 36
diff changeset
294 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
295 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
296 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
297 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
298 sprintf(name, "listener-%02d", i);
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 40
diff changeset
299 priority_translation[prio] =
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 40
diff changeset
300 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
301 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
302 &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
303 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
304 priority_in_use[prio]++;
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
305 }
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
306 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
307 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
308 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
309 sprintf(name, "client-%02d", i);
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 40
diff changeset
310 priority_translation[prio] =
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 40
diff changeset
311 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
312 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
313 &(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
314 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
315 priority_in_use[prio]++;
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
316 }
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
317
24
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
318 cyg_thread_resume(mainH);
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
319 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
320 cyg_thread_resume(clientH[i]);
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
321 }
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
322 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
323 cyg_thread_resume(listenerH[i]);
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
324 }
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
325
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
326 /* 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
327 print a report */
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
328 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
329 cyg_clock_to_counter(system_clockH, &counterH);
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
330
24
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
331 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
332 (cyg_addrword_t) 4000,
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
333 &report_alarmH, &report_alarm);
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
334 if (cyg_test_is_simulator) {
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
335 time_report_delay = 2;
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
336 } else {
36
e97d78785e2d Merge from eCos master repository on 1999-09-12-15:40:34-BST
jlarmour
parents: 28
diff changeset
337 time_report_delay = 60;
24
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
338 }
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_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
341 time_report_delay*100);
10
d3fbcdfa1b2f Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents: 8
diff changeset
342
24
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
343 return 0;
4
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
344 }
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
345
4
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
346 /* 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
347 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
348 {
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
349 #ifdef DEATH_TIME_LIMIT
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
350 cyg_handle_t deathH;
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
351 cyg_alarm death_alarm;
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
352 int is_dead = 0;
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
353
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
354 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
355 #endif /* DEATH_TIME_LIMIT */
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
356
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
357 for (;;) {
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
358 int handler_id = -1;
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
359 int handler_pri = 0;
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
360
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
361 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
362 // 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
363 // 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
364 // global communication variables again.
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
365 if (-1 != free_handler_id) {
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
366 handler_id = free_handler_id;
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
367 handler_pri = free_handler_pri;
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
368 free_handler_id = -1;
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_unlock(&free_handler_lock);
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
371
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
372 if (-1 != handler_id) {
38
e7ba79f6d3a8 Merge from eCos master repository on 1999-09-23-20:10:25-BST
jlarmour
parents: 36
diff changeset
373 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
374 }
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
375
38
e7ba79f6d3a8 Merge from eCos master repository on 1999-09-23-20:10:25-BST
jlarmour
parents: 36
diff changeset
376 // 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
377 // 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
378 if (time_to_report) {
38
e7ba79f6d3a8 Merge from eCos master repository on 1999-09-23-20:10:25-BST
jlarmour
parents: 36
diff changeset
379 // Pause clients
e7ba79f6d3a8 Merge from eCos master repository on 1999-09-23-20:10:25-BST
jlarmour
parents: 36
diff changeset
380 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
381 clients_paused = 1;
e7ba79f6d3a8 Merge from eCos master repository on 1999-09-23-20:10:25-BST
jlarmour
parents: 36
diff changeset
382 } 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
383
e7ba79f6d3a8 Merge from eCos master repository on 1999-09-23-20:10:25-BST
jlarmour
parents: 36
diff changeset
384 // 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
385 // 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
386 // 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
387 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
388 print_statistics(0);
e7ba79f6d3a8 Merge from eCos master repository on 1999-09-23-20:10:25-BST
jlarmour
parents: 36
diff changeset
389
e7ba79f6d3a8 Merge from eCos master repository on 1999-09-23-20:10:25-BST
jlarmour
parents: 36
diff changeset
390 // 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
391 time_to_report = 0;
e7ba79f6d3a8 Merge from eCos master repository on 1999-09-23-20:10:25-BST
jlarmour
parents: 36
diff changeset
392 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
393 clients_paused = 0;
e7ba79f6d3a8 Merge from eCos master repository on 1999-09-23-20:10:25-BST
jlarmour
parents: 36
diff changeset
394 } 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
395 }
4
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
396 }
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
397
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
398 #ifdef DEATH_TIME_LIMIT
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
399 // Stop test if time.
4
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
400 if (is_dead) {
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
401 // Pause clients
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
402 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
403 clients_paused = 1;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
404 } 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
405
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
406 // 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
407 // 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
408 // 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
409 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
410 print_statistics(1);
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
411 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
412 }
4
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
413 }
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
414 #endif /* DEATH_TIME_LIMIT */
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
415
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
416 cyg_thread_delay(3);
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
417 }
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
418 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
419
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
420 /* client_program() -- an obnoxious client which makes a lot of requests */
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
421 void client_program(cyg_addrword_t data)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
422 {
24
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
423 int delay;
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
424
24
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
425 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
426 cyg_clock_to_counter(system_clockH, &counterH);
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
427
24
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
428 for (;;) {
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
429 delay = (rand() % 20);
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
430
24
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
431 /* 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
432 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
433 if (0 == clients_paused)
e7ba79f6d3a8 Merge from eCos master repository on 1999-09-23-20:10:25-BST
jlarmour
parents: 36
diff changeset
434 client_makes_request++;
24
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
435 } cyg_mutex_unlock(&client_request_lock);
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 cyg_thread_delay(10+delay);
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
438 }
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
439 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
440
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
441 /* listener_program() -- listens for a request and spawns a handler to
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
442 take care of the request */
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
443 void listener_program(cyg_addrword_t data)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
444 {
4
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
445 for (;;) {
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
446 int make_request = 0;
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
447 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
448 if (client_makes_request > 0) {
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
449 --client_makes_request;
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
450 make_request = 1;
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
451 }
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
452 } 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
453
38
e7ba79f6d3a8 Merge from eCos master repository on 1999-09-23-20:10:25-BST
jlarmour
parents: 36
diff changeset
454 if (make_request)
e7ba79f6d3a8 Merge from eCos master repository on 1999-09-23-20:10:25-BST
jlarmour
parents: 36
diff changeset
455 start_handler();
e7ba79f6d3a8 Merge from eCos master repository on 1999-09-23-20:10:25-BST
jlarmour
parents: 36
diff changeset
456
4
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
457 cyg_thread_delay(2 + (rand() % 10));
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
458 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
459 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
460
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
461 /* handler_program() -- is spawned to handle each incoming request */
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
462 void handler_program(cyg_addrword_t data)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
463 {
24
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
464 /* 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
465 perform_stressful_tasks();
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
466
24
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
467 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
468
24
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
469 {
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
470 // 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
471 // the main_program.
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
472 int freed = 0;
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
473 do {
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
474 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
475 if (-1 == free_handler_id) {
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
476 free_handler_id = data;
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
477 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
478 freed = 1;
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
479 }
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
480 } 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
481 if (!freed)
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
482 cyg_thread_delay(2);
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
483 } while (!freed);
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
484 }
4
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
485
24
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
486 // Then exit.
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
487 cyg_thread_exit();
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
488 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
489
38
e7ba79f6d3a8 Merge from eCos master repository on 1999-09-23-20:10:25-BST
jlarmour
parents: 36
diff changeset
490 /* start a new handler */
e7ba79f6d3a8 Merge from eCos master repository on 1999-09-23-20:10:25-BST
jlarmour
parents: 36
diff changeset
491 void start_handler(void)
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
492 {
38
e7ba79f6d3a8 Merge from eCos master repository on 1999-09-23-20:10:25-BST
jlarmour
parents: 36
diff changeset
493 int prio;
e7ba79f6d3a8 Merge from eCos master repository on 1999-09-23-20:10:25-BST
jlarmour
parents: 36
diff changeset
494 char* name;
e7ba79f6d3a8 Merge from eCos master repository on 1999-09-23-20:10:25-BST
jlarmour
parents: 36
diff changeset
495 int handler_slot;
4
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
496 int found = 0;
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
497
4
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
498 while (!found) {
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
499 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
500 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
501 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
502 found = 1;
38
e7ba79f6d3a8 Merge from eCos master repository on 1999-09-23-20:10:25-BST
jlarmour
parents: 36
diff changeset
503 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
504 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
505 break;
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
506 }
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
507 }
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
508 } 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
509 if (!found)
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
510 cyg_thread_delay(1);
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
511 }
4
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
512
38
e7ba79f6d3a8 Merge from eCos master repository on 1999-09-23-20:10:25-BST
jlarmour
parents: 36
diff changeset
513 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
514 "Handler usage count wrong!");
e7ba79f6d3a8 Merge from eCos master repository on 1999-09-23-20:10:25-BST
jlarmour
parents: 36
diff changeset
515
e7ba79f6d3a8 Merge from eCos master repository on 1999-09-23-20:10:25-BST
jlarmour
parents: 36
diff changeset
516 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
517 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
518 priority_in_use[prio]++;
e7ba79f6d3a8 Merge from eCos master repository on 1999-09-23-20:10:25-BST
jlarmour
parents: 36
diff changeset
519
e7ba79f6d3a8 Merge from eCos master repository on 1999-09-23-20:10:25-BST
jlarmour
parents: 36
diff changeset
520 name = &thread_name[prio][0];
e7ba79f6d3a8 Merge from eCos master repository on 1999-09-23-20:10:25-BST
jlarmour
parents: 36
diff changeset
521 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
522
62
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 40
diff changeset
523 priority_translation[prio] =
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 40
diff changeset
524 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
525 (cyg_addrword_t) handler_slot,
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 40
diff changeset
526 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
527 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
528 &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
529 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
530 ++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
531 }
4
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
532
38
e7ba79f6d3a8 Merge from eCos master repository on 1999-09-23-20:10:25-BST
jlarmour
parents: 36
diff changeset
533 /* free a locked handler thread */
e7ba79f6d3a8 Merge from eCos master repository on 1999-09-23-20:10:25-BST
jlarmour
parents: 36
diff changeset
534 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
535 {
e7ba79f6d3a8 Merge from eCos master repository on 1999-09-23-20:10:25-BST
jlarmour
parents: 36
diff changeset
536 // 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
537 // 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
538 // 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
539 // 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
540 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
541 cyg_thread_delay(1);
e7ba79f6d3a8 Merge from eCos master repository on 1999-09-23-20:10:25-BST
jlarmour
parents: 36
diff changeset
542 }
e7ba79f6d3a8 Merge from eCos master repository on 1999-09-23-20:10:25-BST
jlarmour
parents: 36
diff changeset
543 ++statistics.thread_exits;
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 // Free the handler resources.
e7ba79f6d3a8 Merge from eCos master repository on 1999-09-23-20:10:25-BST
jlarmour
parents: 36
diff changeset
546 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
547 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
548 handler_thread_in_use_count--;
e7ba79f6d3a8 Merge from eCos master repository on 1999-09-23-20:10:25-BST
jlarmour
parents: 36
diff changeset
549 priority_in_use[handler_pri]--;
e7ba79f6d3a8 Merge from eCos master repository on 1999-09-23-20:10:25-BST
jlarmour
parents: 36
diff changeset
550 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
551 "Priority not in use!");
e7ba79f6d3a8 Merge from eCos master repository on 1999-09-23-20:10:25-BST
jlarmour
parents: 36
diff changeset
552 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
553 "Handler not in use!");
e7ba79f6d3a8 Merge from eCos master repository on 1999-09-23-20:10:25-BST
jlarmour
parents: 36
diff changeset
554 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
555 "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
556 } 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
557
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
558 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
559
38
e7ba79f6d3a8 Merge from eCos master repository on 1999-09-23-20:10:25-BST
jlarmour
parents: 36
diff changeset
560
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
561 /* do things which will stress the system */
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
562 void perform_stressful_tasks()
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
563 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
564 #define MAX_MALLOCED_SPACES 100 /* do this many mallocs at most */
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
565 #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
566 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
567 int sizes[MAX_MALLOCED_SPACES];
e7ba79f6d3a8 Merge from eCos master repository on 1999-09-23-20:10:25-BST
jlarmour
parents: 36
diff changeset
568 unsigned int i, j, size;
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
569
24
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
570 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
571 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
572 cyg_mempool_fix mempool_objects[10];
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
573
24
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
574 /* 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
575 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
576 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
577 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
578 (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
579 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
580 ++statistics.malloc_tries;
38
e7ba79f6d3a8 Merge from eCos master repository on 1999-09-23-20:10:25-BST
jlarmour
parents: 36
diff changeset
581 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
582 spaces[i] = (char *) malloc(size);
e7ba79f6d3a8 Merge from eCos master repository on 1999-09-23-20:10:25-BST
jlarmour
parents: 36
diff changeset
583 sizes[i] = size;
e7ba79f6d3a8 Merge from eCos master repository on 1999-09-23-20:10:25-BST
jlarmour
parents: 36
diff changeset
584
e7ba79f6d3a8 Merge from eCos master repository on 1999-09-23-20:10:25-BST
jlarmour
parents: 36
diff changeset
585 if (spaces[i] != NULL) {
e7ba79f6d3a8 Merge from eCos master repository on 1999-09-23-20:10:25-BST
jlarmour
parents: 36
diff changeset
586 // 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
587 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
588 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
589 }
e7ba79f6d3a8 Merge from eCos master repository on 1999-09-23-20:10:25-BST
jlarmour
parents: 36
diff changeset
590 }
e7ba79f6d3a8 Merge from eCos master repository on 1999-09-23-20:10:25-BST
jlarmour
parents: 36
diff changeset
591
24
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
592 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
593 cyg_thread_yield();
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
594 }
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
595 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
596 cyg_thread_delay(i % 5);
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
597 }
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
598 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
599
38
e7ba79f6d3a8 Merge from eCos master repository on 1999-09-23-20:10:25-BST
jlarmour
parents: 36
diff changeset
600 cyg_thread_delay(5);
e7ba79f6d3a8 Merge from eCos master repository on 1999-09-23-20:10:25-BST
jlarmour
parents: 36
diff changeset
601
24
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
602 /* now free it all up */
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
603 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
604 if (spaces[i] != NULL) {
38
e7ba79f6d3a8 Merge from eCos master repository on 1999-09-23-20:10:25-BST
jlarmour
parents: 36
diff changeset
605 size = sizes[i];
e7ba79f6d3a8 Merge from eCos master repository on 1999-09-23-20:10:25-BST
jlarmour
parents: 36
diff changeset
606 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
607 // Validate chunk data.
e7ba79f6d3a8 Merge from eCos master repository on 1999-09-23-20:10:25-BST
jlarmour
parents: 36
diff changeset
608 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
609 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
610 }
24
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
611 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
612 }
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
613 free(spaces[i]);
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
614 } else {
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
615 ++statistics.malloc_failures;
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
616 }
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
617 }
38
e7ba79f6d3a8 Merge from eCos master repository on 1999-09-23-20:10:25-BST
jlarmour
parents: 36
diff changeset
618
24
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
619 /* 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
620 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
621 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
622 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
623 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
624 &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
625 }
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
626
24
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
627 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
628 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
629 }
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
630
24
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 if (spaces[i]) {
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
633 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
634 }
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
635 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
636 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
637
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
638 /* 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
639 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
640 checked by main_program. */
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
641 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
642 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
643 time_to_report = 1;
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
10
d3fbcdfa1b2f Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents: 8
diff changeset
646 #ifdef DEATH_TIME_LIMIT
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
647 /* 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
648 caller, since they must persist for the life of the alarm */
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
649 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
650 cyg_alarm *death_alarm_p, int *killed_p)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
651 {
24
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
652 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
653 cyg_resolution_t rtc_res;
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
654
24
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
655 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
656 cyg_clock_to_counter(system_clockH, &counterH);
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
657
24
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
658 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
659 (cyg_addrword_t) killed_p,
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
660 deathHp, death_alarm_p);
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
661 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
662 {
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
663 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
664 tick_delay = (long long)
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
665 ((1000000000.0*rtc_res.divisor)
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
666 *((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
667 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
668 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
669 #ifdef CYGPKG_HAL_SYNTH
24
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
670 // 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
671 // 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
672 tick_delay /= 2;
4
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
673 #endif
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
674
24
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
675 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
676 }
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
677 }
10
d3fbcdfa1b2f Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents: 8
diff changeset
678 #endif
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
679
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
680 /* death_alarm_func() is the alarm handler that kills the current
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
681 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
682 thread is constantly checking. */
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
683 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
684 {
24
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
685 int *killed_p;
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
686 killed_p = (int *) data;
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
687 *killed_p = 1;
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
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
690 /* 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
691 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
692 cyg_addrword_t sched_info, /* scheduling info (eg pri) */
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
693 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
694 cyg_addrword_t entry_data, /* entry data */
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
695 char *name, /* optional thread name */
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
696 void *stack_base, /* stack base, NULL = alloc */
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
697 cyg_ucount32 stack_size, /* stack size, 0 = default */
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
698 cyg_handle_t *handle, /* returned thread handle */
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
699 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
700 )
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
701 {
24
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
702 ++statistics.thread_creations;
62
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 40
diff changeset
703
24
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
704 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
705 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
706
62
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 40
diff changeset
707 return cyg_thread_get_priority(*handle);
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
708 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
709
10
d3fbcdfa1b2f Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents: 8
diff changeset
710
36
e97d78785e2d Merge from eCos master repository on 1999-09-12-15:40:34-BST
jlarmour
parents: 28
diff changeset
711 #define MINS_HOUR (60)
e97d78785e2d Merge from eCos master repository on 1999-09-12-15:40:34-BST
jlarmour
parents: 28
diff changeset
712 #define MINS_DAY (60*24)
e97d78785e2d Merge from eCos master repository on 1999-09-12-15:40:34-BST
jlarmour
parents: 28
diff changeset
713
10
d3fbcdfa1b2f Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents: 8
diff changeset
714 void print_statistics(int print_full)
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
715 {
24
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
716 int i;
36
e97d78785e2d Merge from eCos master repository on 1999-09-12-15:40:34-BST
jlarmour
parents: 28
diff changeset
717 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
718 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
719 static int shift_count = 0;
e97d78785e2d Merge from eCos master repository on 1999-09-12-15:40:34-BST
jlarmour
parents: 28
diff changeset
720 int minutes;
e97d78785e2d Merge from eCos master repository on 1999-09-12-15:40:34-BST
jlarmour
parents: 28
diff changeset
721
e97d78785e2d Merge from eCos master repository on 1999-09-12-15:40:34-BST
jlarmour
parents: 28
diff changeset
722 stat_dumps++;
e97d78785e2d Merge from eCos master repository on 1999-09-12-15:40:34-BST
jlarmour
parents: 28
diff changeset
723
e97d78785e2d Merge from eCos master repository on 1999-09-12-15:40:34-BST
jlarmour
parents: 28
diff changeset
724 // Find number of minutes.
e97d78785e2d Merge from eCos master repository on 1999-09-12-15:40:34-BST
jlarmour
parents: 28
diff changeset
725 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
726
e97d78785e2d Merge from eCos master repository on 1999-09-12-15:40:34-BST
jlarmour
parents: 28
diff changeset
727 if (!print_full) {
e97d78785e2d Merge from eCos master repository on 1999-09-12-15:40:34-BST
jlarmour
parents: 28
diff changeset
728 // 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
729 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
730 return;
10
d3fbcdfa1b2f Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents: 8
diff changeset
731
36
e97d78785e2d Merge from eCos master repository on 1999-09-12-15:40:34-BST
jlarmour
parents: 28
diff changeset
732 // 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
733 // a . on the hour though.
e97d78785e2d Merge from eCos master repository on 1999-09-12-15:40:34-BST
jlarmour
parents: 28
diff changeset
734 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
735 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
736 printf(".");
40
a3cc6665b684 Merge from eCos master repository on 1999-10-01-07:47:04-BST
jlarmour
parents: 38
diff changeset
737 fflush(stdout);
a3cc6665b684 Merge from eCos master repository on 1999-10-01-07:47:04-BST
jlarmour
parents: 38
diff changeset
738 }
36
e97d78785e2d Merge from eCos master repository on 1999-09-12-15:40:34-BST
jlarmour
parents: 28
diff changeset
739 return;
e97d78785e2d Merge from eCos master repository on 1999-09-12-15:40:34-BST
jlarmour
parents: 28
diff changeset
740 }
e97d78785e2d Merge from eCos master repository on 1999-09-12-15:40:34-BST
jlarmour
parents: 28
diff changeset
741
e97d78785e2d Merge from eCos master repository on 1999-09-12-15:40:34-BST
jlarmour
parents: 28
diff changeset
742 // 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
743 // 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
744 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
745 && ((minutes % MINS_HOUR) != 0)) {
e97d78785e2d Merge from eCos master repository on 1999-09-12-15:40:34-BST
jlarmour
parents: 28
diff changeset
746 printf(".");
40
a3cc6665b684 Merge from eCos master repository on 1999-10-01-07:47:04-BST
jlarmour
parents: 38
diff changeset
747 fflush(stdout);
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
e97d78785e2d Merge from eCos master repository on 1999-09-12-15:40:34-BST
jlarmour
parents: 28
diff changeset
752 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
753 ++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
754 shift_count);
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
755
24
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
756 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
757 //--------------------------------
e97d78785e2d Merge from eCos master repository on 1999-09-12-15:40:34-BST
jlarmour
parents: 28
diff changeset
758 // 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
759 printf(" Handler-invocations: ");
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
760 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
761 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
762 }
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
763 printf("\n");
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
764 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
765 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
766 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
767
e97d78785e2d Merge from eCos master repository on 1999-09-12-15:40:34-BST
jlarmour
parents: 28
diff changeset
768 // 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
769 if (statistics.malloc_tries > 0x40000000) {
e97d78785e2d Merge from eCos master repository on 1999-09-12-15:40:34-BST
jlarmour
parents: 28
diff changeset
770 shift_count++;
e97d78785e2d Merge from eCos master repository on 1999-09-12-15:40:34-BST
jlarmour
parents: 28
diff changeset
771 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
772 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
773 }
e97d78785e2d Merge from eCos master repository on 1999-09-12-15:40:34-BST
jlarmour
parents: 28
diff changeset
774 statistics.malloc_tries >>= 1;
e97d78785e2d Merge from eCos master repository on 1999-09-12-15:40:34-BST
jlarmour
parents: 28
diff changeset
775 statistics.malloc_failures >>= 1;
e97d78785e2d Merge from eCos master repository on 1999-09-12-15:40:34-BST
jlarmour
parents: 28
diff changeset
776 }
38
e7ba79f6d3a8 Merge from eCos master repository on 1999-09-23-20:10:25-BST
jlarmour
parents: 36
diff changeset
777 } 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
778
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
779 #if CYGINT_ISO_MALLINFO
38
e7ba79f6d3a8 Merge from eCos master repository on 1999-09-23-20:10:25-BST
jlarmour
parents: 36
diff changeset
780 //--------------------------------
e7ba79f6d3a8 Merge from eCos master repository on 1999-09-23-20:10:25-BST
jlarmour
parents: 36
diff changeset
781 // System information
e7ba79f6d3a8 Merge from eCos master repository on 1999-09-23-20:10:25-BST
jlarmour
parents: 36
diff changeset
782 {
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
783 struct mallinfo mem_info;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
784
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
785 mem_info = mallinfo();
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
786
38
e7ba79f6d3a8 Merge from eCos master repository on 1999-09-23-20:10:25-BST
jlarmour
parents: 36
diff changeset
787 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
788 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
789 }
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
790 #endif
24
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 22
diff changeset
791
36
e97d78785e2d Merge from eCos master repository on 1999-09-12-15:40:34-BST
jlarmour
parents: 28
diff changeset
792 // Dump stack status
e97d78785e2d Merge from eCos master repository on 1999-09-12-15:40:34-BST
jlarmour
parents: 28
diff changeset
793 printf(" Stack usage:\n");
e97d78785e2d Merge from eCos master repository on 1999-09-12-15:40:34-BST
jlarmour
parents: 28
diff changeset
794 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
795 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
796
e97d78785e2d Merge from eCos master repository on 1999-09-12-15:40:34-BST
jlarmour
parents: 28
diff changeset
797 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
798 main_stack + sizeof(main_stack));
e97d78785e2d Merge from eCos master repository on 1999-09-12-15:40:34-BST
jlarmour
parents: 28
diff changeset
799 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
800 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
801 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
802 }
e97d78785e2d Merge from eCos master repository on 1999-09-12-15:40:34-BST
jlarmour
parents: 28
diff changeset
803 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
804 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
805 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
806 }
e97d78785e2d Merge from eCos master repository on 1999-09-12-15:40:34-BST
jlarmour
parents: 28
diff changeset
807 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
808 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
809 client_stack[i] + sizeof(client_stack[i]));
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
810 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
811 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
812
4
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
813 #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
814 /* (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
815 #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
816 #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
817 /* (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
818
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
819 #else /* CYGINT_ISO_MALLOC */
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
820 # 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
821 #endif /* CYGINT_ISO_MALLOC */
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
822
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
823 #else /* CYGFUN_KERNEL_THREADS_TIMER */
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
824 # define N_A_MSG "this test needs kernel threads timer"
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
825 #endif /* CYGFUN_KERNEL_THREADS_TIMER */
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
826
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
827 #else /* CYGPKG_LIBM */
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
828 # define N_A_MSG "this test needs libm"
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
829 #endif /* CYGPKG_LIBM */
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
830
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
831 #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
832 # 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
833 #endif /* CYGINT_ISO_STDIO_FORMATTED_IO */
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
834
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
835 #else // def CYGFUN_KERNEL_API_C
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
836 # define N_A_MSG "this test needs Kernel C API"
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
837 #endif
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
838
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
839 #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
840 # 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
841 #endif
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
842
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
843 #ifdef N_A_MSG
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
844 externC void
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
845 cyg_start( void )
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
846 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
847 CYG_TEST_INIT();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
848 CYG_TEST_NA( N_A_MSG);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
849 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
850 #endif // N_A_MSG