annotate packages/kernel/current/tests/stress_threads.c @ 78:59d97b6ba612 ecos-sw-2000-03-28

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