annotate packages/kernel/current/tests/stress_threads.c @ 2197:eb767a98013a

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