annotate packages/kernel/current/tests/stress_threads.c @ 4:1d7f19c9e4d1 ecos-sw-1999-05-11

Merge from eCos master repository on 1999-05-11-21:11:10-BST
author jlarmour
date Tue, 11 May 1999 14:07:25 +0000
parents 443894e2e912
children ece80412419a
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
1 //==========================================================================
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
2 //
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
3 // stress_threads.cxx
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
4 //
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
5 // Basic thread stress test
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
6 //
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
7 //==========================================================================
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
8 //####COPYRIGHTBEGIN####
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
9 //
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
10 // -------------------------------------------
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
11 // The contents of this file are subject to the Cygnus eCos Public License
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
12 // Version 1.0 (the "License"); you may not use this file except in
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
13 // compliance with the License. You may obtain a copy of the License at
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
14 // http://sourceware.cygnus.com/ecos
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
15 //
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
16 // Software distributed under the License is distributed on an "AS IS"
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
17 // basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
18 // License for the specific language governing rights and limitations under
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
19 // the License.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
20 //
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
21 // The Original Code is eCos - Embedded Cygnus Operating System, released
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
22 // September 30, 1998.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
23 //
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
24 // The Initial Developer of the Original Code is Cygnus. Portions created
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
25 // by Cygnus are Copyright (C) 1998,1999 Cygnus Solutions. All Rights Reserved.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
26 // -------------------------------------------
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
27 //
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
28 //####COPYRIGHTEND####
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
29 //==========================================================================
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
30 //#####DESCRIPTIONBEGIN####
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
31 //
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
32 // Author(s): rosalia
4
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
33 // Contributors: rosalia, jskov
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
34 // Date: 1999-04-13
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
35 // Description: Very simple thread stress test, with some memory
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
36 // allocation and alarm handling.
4
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
37 //
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
38 // Notes:
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
39 // 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
40 // 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
41 // 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
42 //
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
43 // 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
44 // 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
45 // should spread out.
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
46 //####DESCRIPTIONEND####
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
47
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
48 #include <pkgconf/system.h>
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
49 #include <cyg/infra/testcase.h>
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
50
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
51 #include <cyg/hal/hal_arch.h>
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
52
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
53 #if defined(CYGPKG_KERNEL) && defined(CYGPKG_IO) && defined(CYGPKG_LIBC)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
54
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
55 #include <pkgconf/kernel.h>
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
56 #include <pkgconf/libc.h>
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
57
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
58 #if defined(CYGFUN_KERNEL_API_C)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
59
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
60 #include <cyg/kernel/kapi.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 #ifdef CYGPKG_LIBC_STDIO
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
63
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
64 #include <stdio.h>
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
65 #include <stdlib.h>
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
66
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
67 #if defined(CYGPKG_LIBM)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
68
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
69 #include <math.h>
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
70 #include <assert.h>
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 #if defined(CYGFUN_KERNEL_THREADS_TIMER)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
73 #if defined(CYGPKG_LIBC_MALLOC)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
74
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
75 /* 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
76 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
77 #define DEATH_TIME_LIMIT 20
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
78 /* #undef DEATH_TIME_LIMIT */
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 #define STACK_SIZE (CYGNUM_HAL_STACK_SIZE_TYPICAL)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
81 #define STACK_SIZE2 (8*1024 + CYGNUM_HAL_STACK_SIZE_TYPICAL)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
82
4
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
83 /* Allocate priorities in this order. This ensures that handlers
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
84 (which are the ones using the CPU) get enough CPU time to actually
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
85 complete their tasks. */
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
86 #define N_MAIN 1
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
87 #define MAX_HANDLERS 19
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
88 #define N_LISTENERS 4
4
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
89 #define N_CLIENTS 4
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
90
4
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
91 #if (CYGNUM_KERNEL_SCHED_PRIORITIES >= (N_MAIN+MAX_HANDLERS+N_LISTENERS+N_CLIENTS))
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
92
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
93 /* 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
94 same priority more than once, so we must store those already in use */
4
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
95 static volatile char priority_in_use[N_MAIN+MAX_HANDLERS+N_LISTENERS+N_CLIENTS];
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
96
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
97 /* now declare (and allocate space for) some kernel objects, like the
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
98 threads we will use */
4
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
99 cyg_thread main_thread_s;
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
100 cyg_thread handler_thread_s[MAX_HANDLERS];
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
101 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
102 cyg_thread client_thread_s[N_CLIENTS];
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
103
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
104 /* 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
105 char main_stack[STACK_SIZE];
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
106 char handler_stack[MAX_HANDLERS][STACK_SIZE2];
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
107 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
108 char client_stack[N_CLIENTS][STACK_SIZE];
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
109
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
110 /* 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
111 cyg_handle_t mainH;
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
112 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
113 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
114 cyg_handle_t clientH[N_CLIENTS];
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
115
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
116 /* 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
117 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
118 handler_program;
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
119
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
120 /* 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
121 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
122 free_handler_lock;
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
123
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
124 /* 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
125 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
126 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
127 that the variables are empty. */
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
128 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
129 volatile int free_handler_id = -1;
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
130
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
131 /* a global variable with which the client and server coordinate */
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
132 int client_makes_request = 0;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
133
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
134 /* indicates that it's time to print out a report */
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
135 int time_to_report = 0;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
136
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
137 /*** now application-specific variables ***/
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
138 /* an array that stores whether the handler threads are in use */
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
139 int handler_thread_in_use[MAX_HANDLERS];
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
140
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
141 /***** statistics-gathering variables *****/
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
142 struct s_statistics {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
143 /* store the number of times each handler has been invoked */
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
144 unsigned long handler_invocation_histogram[MAX_HANDLERS];
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
145
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
146 /* store how many times malloc has been attempted and how many times
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
147 it has failed */
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
148 unsigned long malloc_tries, malloc_failures;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
149
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
150 /* how many threads have been created */
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
151 unsigned long thread_creations, thread_exits;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
152 };
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
153
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
154 struct s_statistics statistics;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
155
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
156 /* some function prototypes; those with the sc_ prefix are
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
157 "statistics-collecting" versions of the cyg_ primitives */
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
158 void sc_thread_create(
4
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
159 cyg_addrword_t sched_info, /* scheduling info (eg pri) */
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
160 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
161 cyg_addrword_t entry_data, /* entry data */
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
162 char *name, /* optional thread name */
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
163 void *stack_base, /* stack base, NULL = alloc */
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
164 cyg_ucount32 stack_size, /* stack size, 0 = default */
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
165 cyg_handle_t *handle, /* returned thread handle */
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
166 cyg_thread *thread /* put thread here */
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
167 );
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
168
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
169 int get_handler_slot(cyg_handle_t current_threadH);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
170 void perform_stressful_tasks(void);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
171 void permute_array(char a[], int size, int seed);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
172 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
173 cyg_alarm *death_alarm_p, int *killed_p);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
174 void print_statistics(void);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
175
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
176 /* we need to declare the alarm handling function (which is defined
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
177 below), so that we can pass it to cyg_alarm_initialize() */
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
178 cyg_alarm_t report_alarm_func, death_alarm_func;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
179
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
180 /* handle and alarm for the report alarm */
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
181 cyg_handle_t report_alarmH, counterH, system_clockH;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
182 cyg_alarm report_alarm;
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 /* we install our own startup routine which sets up threads */
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
185 void cyg_user_start(void)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
186 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
187 int i;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
188
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
189 CYG_TEST_INIT();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
190 CYG_TEST_INFO("# Entering stress's cyg_user_start() function");
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
191
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
192 cyg_mutex_init(&client_request_lock);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
193 cyg_mutex_init(&statistics_print_lock);
4
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
194 cyg_mutex_init(&free_handler_lock);
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
195
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
196 /* initialize statistics */
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
197 memset(&statistics, 0, sizeof(statistics));
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
198
4
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
199 /* clear priority table */
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
200 for (i = 0; i < sizeof(priority_in_use); i++)
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
201 priority_in_use[i] = 0;
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
202
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
203 /* initialize main thread */
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
204 {
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
205 char thread_name[] = "main";
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
206
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
207 sc_thread_create(0, main_program, (cyg_addrword_t) 0,
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
208 thread_name, (void *) main_stack, STACK_SIZE,
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
209 &mainH, &main_thread_s);
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
210 priority_in_use[0]++;
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
211 }
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
212
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
213 /* initialize all handler threads to not be in use */
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
214 for (i = 0; i < MAX_HANDLERS; ++i) {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
215 handler_thread_in_use[i] = 0;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
216 }
4
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
217 for (i = 0; i < N_LISTENERS; ++i) {
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
218 int prio;
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
219 char thread_name[20];
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
220 sprintf(thread_name, "listener-%02d", i);
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
221 prio = N_MAIN + MAX_HANDLERS + i;
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
222 sc_thread_create(prio, listener_program, (cyg_addrword_t) i,
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
223 thread_name, (void *) listener_stack[i], STACK_SIZE,
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
224 &listenerH[i], &listener_thread_s[i]);
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
225 CYG_ASSERT(0 == priority_in_use[prio], "Priority already in use!");
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
226 priority_in_use[prio]++;
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
227 }
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
228 for (i = 0; i < N_CLIENTS; ++i) {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
229 int prio;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
230 char thread_name[20];
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
231 sprintf(thread_name, "client-%02d", i);
4
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
232 prio = N_MAIN + MAX_HANDLERS + N_LISTENERS + i;
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
233 sc_thread_create(prio, client_program, (cyg_addrword_t) i,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
234 thread_name, (void *) client_stack[i], STACK_SIZE,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
235 &(clientH[i]), &client_thread_s[i]);
4
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
236 CYG_ASSERT(0 == priority_in_use[prio], "Priority already in use!");
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
237 priority_in_use[prio]++;
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
4
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
240 cyg_thread_resume(mainH);
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
241 for (i = 0; i < N_CLIENTS; ++i) {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
242 cyg_thread_resume(clientH[i]);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
243 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
244 for (i = 0; i < N_LISTENERS; ++i) {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
245 cyg_thread_resume(listenerH[i]);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
246 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
247
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
248 /* set up the alarm which gives periodic wakeups to say "time to
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
249 print a report */
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
250 system_clockH = cyg_real_time_clock();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
251 cyg_clock_to_counter(system_clockH, &counterH);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
252
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
253 cyg_alarm_create(counterH, report_alarm_func,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
254 (cyg_addrword_t) 4000,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
255 &report_alarmH, &report_alarm);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
256 if (cyg_test_is_simulator) {
4
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
257 cyg_alarm_initialize(report_alarmH, cyg_current_time()+200, 200);
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
258 } else {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
259 cyg_alarm_initialize(report_alarmH, cyg_current_time()+300, 4000);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
260 }
4
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
261 }
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
262
4
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
263 /* 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
264 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
265 {
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
266 #ifdef DEATH_TIME_LIMIT
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
267 cyg_handle_t deathH;
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
268 cyg_alarm death_alarm;
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
269 int is_dead = 0;
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
270
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
271 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
272 #endif /* DEATH_TIME_LIMIT */
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
273
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
274 printf("# Starting main\n");
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
275
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
276 for (;;) {
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
277 int handler_id = -1;
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
278 int handler_pri = 0;
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
279
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
280 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
281 // 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
282 // 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
283 // global communication variables again.
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
284 if (-1 != free_handler_id) {
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
285 handler_id = free_handler_id;
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
286 handler_pri = free_handler_pri;
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
287 free_handler_id = -1;
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
288 }
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
289 } 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
290
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
291 if (-1 != handler_id) {
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
292 // Free the handler resources. This is done outside of the
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
293 // free_handler_lock to avoid deadlocks.
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
294 cyg_mutex_lock(&handler_slot_lock); {
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
295 CYG_ASSERT(1 == priority_in_use[handler_pri],
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
296 "Priority not in use!");
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
297 CYG_ASSERT(1 == handler_thread_in_use[handler_id],
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
298 "Handler not in use!");
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
299 handler_thread_in_use[handler_id]--;
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
300 priority_in_use[handler_pri]--;
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
301 // Finally delete the handler thread.
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
302 {
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
303 // workaround for PRs 20054-20058/20065
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
304 cyg_thread_kill(handlerH[handler_id]);
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
305 }
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
306 cyg_thread_delete(handlerH[handler_id]);
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
307 } 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
308 }
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
309
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
310 // Print status if time.
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
311 if (time_to_report) {
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
312 time_to_report = 0;
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
313 print_statistics();
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
314 }
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
315
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
316 #ifdef DEATH_TIME_LIMIT
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
317 // Stop test if time.
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
318 if (is_dead) {
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
319 print_statistics();
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
320 CYG_TEST_PASS_FINISH("Kernel thread stress test OK");
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
321 }
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
322 #endif /* DEATH_TIME_LIMIT */
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
323
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
324 cyg_thread_delay(3);
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
325 }
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
326 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
327
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
328 /* client_program() -- an obnoxious client which makes a lot of requests */
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
329 void client_program(cyg_addrword_t data)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
330 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
331 int delay;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
332
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
333 printf("# Starting client-%d\n", (int) data);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
334
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
335 system_clockH = cyg_real_time_clock();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
336 cyg_clock_to_counter(system_clockH, &counterH);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
337
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
338 for (;;) {
4
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
339 delay = (rand() % 20);
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
340
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
341 /* now send a request to the server */
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
342 cyg_mutex_lock(&client_request_lock); {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
343 ++client_makes_request;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
344 /* printf("client_makes_request %d\n", client_makes_request); */
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
345 } cyg_mutex_unlock(&client_request_lock);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
346
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
347 cyg_thread_delay(10+delay);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
348 /* cyg_thread_delay(0); */
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
349 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
350 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
351
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
352 /* listener_program() -- listens for a request and spawns a handler to
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
353 take care of the request */
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
354 void listener_program(cyg_addrword_t data)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
355 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
356 /* int message = (int) data; */
4
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
357 int handler_slot;
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
358
4
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
359 printf("# Beginning execution; thread data is %d\n", (int) data);
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
360
4
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
361 for (;;) {
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
362 int make_request = 0;
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
363 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
364 if (client_makes_request > 0) {
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
365 --client_makes_request;
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
366 make_request = 1;
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
367 }
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
368 } 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
369
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
370 if (make_request) {
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
371 int prio;
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
372 /* printf("just got a request from a client (count = %d)\n", */
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
373 /* client_makes_request); */
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
374
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
375 handler_slot = get_handler_slot(listenerH[(int) data]);
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
376 prio = N_MAIN+handler_slot;
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
377
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
378 CYG_ASSERT(0 == priority_in_use[prio], "Priority already in use!");
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
379 priority_in_use[prio]++;
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
380 sc_thread_create(prio, handler_program,
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
381 (cyg_addrword_t) handler_slot,
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
382 "handler", (void *) handler_stack[handler_slot],
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
383 STACK_SIZE2, &handlerH[handler_slot],
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
384 &handler_thread_s[handler_slot]);
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
385 cyg_thread_resume(handlerH[handler_slot]);
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
386 ++statistics.handler_invocation_histogram[handler_slot];
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
387 }
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
388
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
389 cyg_thread_delay(2 + (rand() % 10));
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
390 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
391 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
392
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
393 /* handler_program() -- is spawned to handle each incoming request */
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
394 void handler_program(cyg_addrword_t data)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
395 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
396 /* here is where we perform specific stressful tasks */
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
397 perform_stressful_tasks();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
398
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
399 cyg_thread_delay(4 + (int) (0.5*log(1.0 + fabs((rand() % 1000000)))));
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
400 /* cyg_thread_delay(0); */
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
401
4
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
402 ++statistics.thread_exits;
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
403 {
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
404 // Loop until the handler id and priority can be communicated to
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
405 // the main_program.
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
406 int freed = 0;
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
407 do {
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
408 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
409 if (-1 == free_handler_id) {
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
410 free_handler_id = data;
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
411 free_handler_pri = N_MAIN+(int) data;
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
412 freed = 1;
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
413 }
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
414 } 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
415 if (!freed)
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
416 cyg_thread_delay(2);
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
417 } while (!freed);
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
418 }
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
419
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
420 // Then wait for the main_program to kill us.
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
421 for (;;) {
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
422 cyg_thread_delay(100);
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
423 }
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
424 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
425
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
426 /* look for an available handler thread */
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
427 int get_handler_slot(cyg_handle_t current_threadH)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
428 {
4
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
429 int i;
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
430 int found = 0;
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
431
4
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
432 while (!found) {
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
433 cyg_mutex_lock(&handler_slot_lock); {
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
434 for (i = 0; i < MAX_HANDLERS; ++i) {
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
435 if (!handler_thread_in_use[i]) {
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
436 found = 1;
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
437 handler_thread_in_use[i]++;
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
438 break;
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
439 }
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
440 }
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
441 } 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
442 if (!found)
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
443 cyg_thread_delay(1);
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
444 }
4
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
445
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
446 CYG_ASSERT(1 == handler_thread_in_use[i], "Handler usage count wrong!");
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
447
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
448 return i;
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 /* do things which will stress the system */
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
452 void perform_stressful_tasks()
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
453 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
454 #define MAX_MALLOCED_SPACES 100 /* do this many mallocs at most */
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
455 #define MALLOCED_BASE_SIZE 1 /* basic size in bytes */
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
456 char *spaces[MAX_MALLOCED_SPACES];
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
457 unsigned int i;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
458
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
459 cyg_mutex_t tmp_lock;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
460
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
461 cyg_uint8 pool_space[10][100];
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
462 cyg_handle_t mempool_handles[10];
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
463 cyg_mempool_fix mempool_objects[10];
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
464
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
465 cyg_mutex_init(&tmp_lock);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
466
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
467 /* here I use malloc, which uses the kernel's variable memory pools.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
468 note that malloc/free is a bit simple-minded here: it does not
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
469 try to really fragment things, and it does not try to make the
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
470 allocation/deallocation concurrent with other thread execution
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
471 (although I'm about to throw in a yield()) */
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
472 for (i = 0; i < MAX_MALLOCED_SPACES; ++i) {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
473 ++statistics.malloc_tries;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
474 /* spaces[i] = (char *) malloc(((int)(sqrt(i*2.0))+1)*MALLOCED_BASE_SIZE); */
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
475 spaces[i] = (char *) malloc(((int)i*2.0+1)*MALLOCED_BASE_SIZE);
4
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
476 if (i % (MAX_MALLOCED_SPACES/10) == 0) {
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
477 cyg_thread_yield();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
478 }
4
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
479 if (i % (MAX_MALLOCED_SPACES/15) == 0) {
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
480 cyg_thread_delay(i % 5);
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
481 }
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
482 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
483
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
484 /* now free it all up */
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
485 for (i = 0; i < MAX_MALLOCED_SPACES; ++i) {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
486 if (spaces[i] != NULL) {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
487 unsigned int j;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
488 for (j = 0; j < (i*2+1)*MALLOCED_BASE_SIZE; ++j) {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
489 spaces[i][j] = 0xAA; /* write a bit pattern */
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
490 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
491 free(spaces[i]);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
492 } else {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
493 ++statistics.malloc_failures;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
494 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
495 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
496 /* now allocate and then free some fixed-size memory pools; for
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
497 now this is simple-minded because it does not have many threads
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
498 sharing the memory pools and racing for memory. */
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
499 for (i = 0; i < 10; ++i) {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
500 cyg_mempool_fix_create(pool_space[i], 100, (i+1)*3,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
501 &mempool_handles[i], &mempool_objects[i]);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
502 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
503
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
504 for (i = 0; i < 10; ++i) {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
505 spaces[i] = cyg_mempool_fix_try_alloc(mempool_handles[i]);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
506 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
507
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
508 for (i = 0; i < 10; ++i) {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
509 if (spaces[i]) {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
510 cyg_mempool_fix_delete(mempool_handles[i]);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
511 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
512 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
513
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
514 cyg_mutex_destroy(&tmp_lock);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
515 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
516
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
517 /* 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
518 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
519 checked by main_program. */
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
520 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
521 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
522 time_to_report = 1;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
523 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
524
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
525 /* 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
526 caller, since they must persist for the life of the alarm */
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
527 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
528 cyg_alarm *death_alarm_p, int *killed_p)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
529 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
530 cyg_handle_t system_clockH, counterH;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
531 cyg_resolution_t rtc_res;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
532
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
533 system_clockH = cyg_real_time_clock();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
534 cyg_clock_to_counter(system_clockH, &counterH);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
535
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
536 cyg_alarm_create(counterH, death_alarm_func,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
537 (cyg_addrword_t) killed_p,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
538 deathHp, death_alarm_p);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
539 rtc_res = cyg_clock_get_resolution(system_clockH);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
540 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
541 cyg_tick_count_t tick_delay;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
542 tick_delay = (long long)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
543 ((1000000000.0*rtc_res.divisor)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
544 *((double)DEATH_TIME_LIMIT)/((double)rtc_res.dividend));
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
545 if ( cyg_test_is_simulator )
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
546 tick_delay /= 10;
4
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
547 #ifdef CYGPKG_HAL_I386_LINUX
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
548 // 20 seconds is a long time compared to the run time of other tests.
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
549 // Reduce to 10 seconds, allowing more tests to get run.
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
550 tick_delay /= 2;
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
551 #endif
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
552
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
553 cyg_alarm_initialize(*deathHp, cyg_current_time() + tick_delay, 0);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
554 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
555 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
556
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
557 /* death_alarm_func() is the alarm handler that kills the current
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
558 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
559 thread is constantly checking. */
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
560 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
561 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
562 int *killed_p;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
563 killed_p = (int *) data;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
564 *killed_p = 1;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
565 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
566
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
567 /* now I write the sc_ versions of the cyg_functions */
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
568 void sc_thread_create(
4
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
569 cyg_addrword_t sched_info, /* scheduling info (eg pri) */
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
570 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
571 cyg_addrword_t entry_data, /* entry data */
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
572 char *name, /* optional thread name */
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
573 void *stack_base, /* stack base, NULL = alloc */
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
574 cyg_ucount32 stack_size, /* stack size, 0 = default */
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
575 cyg_handle_t *handle, /* returned thread handle */
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
576 cyg_thread *thread /* put thread here */
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
577 )
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
578 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
579 /*printf("Creating a thread -- priority is %lu\n", (unsigned long) sched_info);*/
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
580 /* fflush(stdout); */
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
581 ++statistics.thread_creations;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
582 cyg_thread_create(sched_info, entry, entry_data, name,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
583 stack_base, stack_size, handle, thread);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
584 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
585
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
586 void print_statistics(void)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
587 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
588 int i;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
589
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
590 cyg_mutex_lock(&statistics_print_lock); {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
591 printf("Handler-invocations: ");
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
592 for (i = 0; i < MAX_HANDLERS; ++i) {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
593 printf("%4lu ", statistics.handler_invocation_histogram[i]);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
594 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
595 printf("\n");
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
596 printf("malloc()-tries/failures: -- %7lu %7lu\n",
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
597 statistics.malloc_tries, statistics.malloc_failures);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
598 printf("client_makes_request: %d\n", client_makes_request);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
599 } cyg_mutex_unlock(&statistics_print_lock);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
600 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
601
4
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
602 #else /* (CYGNUM_KERNEL_SCHED_PRIORITIES >= */
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
603 /* (N_MAIN+N_CLIENTS+N_LISTENERS+MAX_HANDLERS)) */
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
604 #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
605 #endif /* (CYGNUM_KERNEL_SCHED_PRIORITIES >= */
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
606 /* (N_MAIN+N_CLIENTS+N_LISTENERS+MAX_HANDLERS)) */
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
607
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
608 #else /* CYGSEM_LIBC_MALLOC */
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
609 # define N_A_MSG "this test needs malloc"
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
610 #endif /* CYGSEM_LIBC_MALLOC */
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
611
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
612 #else /* CYGFUN_KERNEL_THREADS_TIMER */
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
613 # define N_A_MSG "this test needs kernel threads timer"
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
614 #endif /* CYGFUN_KERNEL_THREADS_TIMER */
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
615
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
616 #else /* CYGPKG_LIBM */
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
617 # define N_A_MSG "this test needs libm"
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
618 #endif /* CYGPKG_LIBM */
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
619
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
620 #else /* CYGSEM_LIBC_STDIO */
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
621 # define N_A_MSG "this test needs stdio"
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
622 #endif /* CYGSEM_LIBC_STDIO */
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
623
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
624 #else // def CYGFUN_KERNEL_API_C
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
625 # define N_A_MSG "this test needs Kernel C API"
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
626 #endif
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
627
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
628 #else // def CYGPKG_KERNEL && CYGPKG_IO && CYGPKG_LIBC
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
629 # define N_A_MSG "this tests needs Kernel, libc and IO"
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
630 #endif
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
631
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
632 #ifdef N_A_MSG
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
633 externC void
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
634 cyg_start( void )
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
635 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
636 CYG_TEST_INIT();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
637 CYG_TEST_NA( N_A_MSG);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
638 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
639 #endif // N_A_MSG