annotate packages/kernel/current/tests/stress_threads.c @ 66:bf00f99aec69 ecos-sw-2000-02-02

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