annotate packages/kernel/current/tests/kmutex4.c @ 1507:92cf4ff674de

* tests/kmutex3.c (cyg_start): Use CYG_TEST_NA. * tests/kmutex4.c (cyg_start): Ditto. * tests/mutex2.cxx (cyg_start): Ditto. * tests/mutex3.cxx (cyg_start): Ditto. * tests/sync3.cxx (cyg_start): Ditto. * tests/thread2.cxx (cyg_start): Ditto. * tests/fptest.c (cyg_start): Use one line NA msg. * tests/smp.cxx (cyg_start): Ditto. * tests/timeslice.c (cyg_start): Ditto. * tests/tm_basic.cxx (cyg_start): Ditto.
author jlarmour
date Thu, 19 Feb 2004 10:57:36 +0000
parents d2c90368aeef
children 74dbf4c3f2e1
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
181
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
1 //==========================================================================
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
2 //
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
3 // kmutex4.c
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
4 //
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
5 // Mutex test 4 - dynamic priority inheritance protocol
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
6 //
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
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####
181
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
40 //==========================================================================
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
41 //#####DESCRIPTIONBEGIN####
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
42 //
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
43 // Author(s): hmt
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
44 // Contributors: hmt
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
45 // Date: 2000-01-06, 2001-08-10, 2001-08-21
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
46 // Description: Tests mutex priority inheritance. This is an extension of
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
47 // kmutex3.c, to test the new "set the protocol at run-time"
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
48 // extensions.
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
49 //####DESCRIPTIONEND####
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
50
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
51 #include <pkgconf/hal.h>
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
52 #include <pkgconf/kernel.h>
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
53
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
54 #include <cyg/infra/testcase.h>
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
55
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
56 #include <cyg/hal/hal_arch.h> // CYGNUM_HAL_STACK_SIZE_TYPICAL
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
57
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
58 #include <cyg/infra/diag.h> // diag_printf
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
59
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
60 #ifdef CYGSEM_HAL_STOP_CONSTRUCTORS_ON_FLAG
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
61 externC void
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
62 cyg_hal_invoke_constructors();
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
63 #endif
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
64
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
65 // ------------------------------------------------------------------------
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
66 //
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
67 // These checks should be enough; any other scheduler which has priorities
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
68 // should manifest as having no priority inheritance, but otherwise fine,
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
69 // so the test should work correctly.
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
70
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
71 #if defined(CYGVAR_KERNEL_COUNTERS_CLOCK) && \
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
72 (CYGNUM_KERNEL_SCHED_PRIORITIES > 20) && \
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
73 defined(CYGFUN_KERNEL_API_C) && \
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
74 !defined(CYGPKG_KERNEL_SMP_SUPPORT) && \
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
75 defined(CYGSEM_KERNEL_SYNCH_MUTEX_PRIORITY_INVERSION_PROTOCOL_DYNAMIC) \
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
76
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
77 #include <cyg/kernel/kapi.h>
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
78
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
79 #include <cyg/infra/cyg_ass.h>
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
80 #include <cyg/infra/cyg_trac.h>
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
81 #include <cyg/infra/diag.h> // diag_printf
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
82
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
83 // ------------------------------------------------------------------------
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
84
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
85 #define nVERBOSE
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
86
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
87 // ------------------------------------------------------------------------
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
88 // We have dynamic protocol choice, so we can set the protocol to whatever
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
89 // we want. We'll do these combinations:
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
90 // NONE
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
91 // INHERIT
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
92 // CEILING = 4 = higher than any thread === INHERIT in behaviour
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
93 // CEILING = 11 = mixed in with threads === cannot check anything
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
94 // CEILING = 17 = lower than any threads === NONE in behaviour
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
95
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
96 #define PROTO_NONE (0)
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
97 #define PROTO_INHERIT (1)
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
98 #define PROTO_CEILING_HIGH (2)
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
99 #define PROTO_CEILING_MID (3)
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
100 #define PROTO_CEILING_LOW (4)
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
101
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
102 int proto;
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
103
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
104 static char * protnames[] = {
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
105 "none",
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
106 "inherit",
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
107 "high ceiling",
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
108 "medium ceiling",
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
109 "low ceiling",
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
110 };
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
111
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
112 // ------------------------------------------------------------------------
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
113 // Management functions
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
114 //
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
115 // Stolen from testaux.hxx and copied in here because I want to be able to
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
116 // reset the world also.
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
117 //
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
118 // Translated into KAPI also.
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
119
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
120 #define NTHREADS 7
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
121
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
122 #define STACKSIZE CYGNUM_HAL_STACK_SIZE_TYPICAL
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
123
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
124 static cyg_handle_t thread[NTHREADS] = { 0 };
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
125
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
126 typedef cyg_uint64 CYG_ALIGNMENT_TYPE;
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
127
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
128 static cyg_thread thread_obj[NTHREADS];
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
129
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
130 static CYG_ALIGNMENT_TYPE stack[NTHREADS] [
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
131 (STACKSIZE+sizeof(CYG_ALIGNMENT_TYPE)-1)
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
132 / sizeof(CYG_ALIGNMENT_TYPE) ];
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
133
191
678094f34118 Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents: 181
diff changeset
134 static volatile int nthreads = 0;
181
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
135
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
136 #undef NULL
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
137 #define NULL (0)
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
138
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
139 static cyg_handle_t new_thread( cyg_thread_entry_t *entry,
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
140 cyg_addrword_t data,
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
141 cyg_addrword_t priority,
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
142 int do_resume,
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
143 char *name )
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
144 {
191
678094f34118 Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents: 181
diff changeset
145 int _nthreads = nthreads++;
678094f34118 Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents: 181
diff changeset
146
678094f34118 Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents: 181
diff changeset
147 CYG_ASSERT(_nthreads < NTHREADS,
181
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
148 "Attempt to create more than NTHREADS threads");
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
149
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
150 cyg_thread_create( priority,
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
151 entry,
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
152 data,
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
153 name,
191
678094f34118 Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents: 181
diff changeset
154 (void *)(stack[_nthreads]),
181
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
155 STACKSIZE,
191
678094f34118 Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents: 181
diff changeset
156 &thread[_nthreads],
678094f34118 Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents: 181
diff changeset
157 &thread_obj[_nthreads] );
181
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
158
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
159 if ( do_resume )
191
678094f34118 Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents: 181
diff changeset
160 cyg_thread_resume( thread[_nthreads] );
181
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
161
191
678094f34118 Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents: 181
diff changeset
162 return thread[_nthreads];
181
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
163 }
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
164
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
165
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
166 static void kill_threads( void )
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
167 {
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
168 CYG_ASSERT(nthreads <= NTHREADS,
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
169 "More than NTHREADS threads");
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
170 CYG_ASSERT( cyg_thread_self() == thread[0],
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
171 "kill_threads() not called from thread 0");
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
172 while ( nthreads > 1 ) {
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
173 nthreads--;
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
174 if ( NULL != thread[nthreads] ) {
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
175 do
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
176 cyg_thread_kill( thread[nthreads] );
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
177 while ( ! cyg_thread_delete ( thread[nthreads] ) );
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
178 thread[nthreads] = NULL;
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
179 }
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
180 }
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
181 CYG_ASSERT(nthreads == 1,
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
182 "No threads left");
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
183 }
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
184
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
185 // ------------------------------------------------------------------------
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
186
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
187 #define DELAYFACTOR 1 // for debugging
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
188
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
189 // ------------------------------------------------------------------------
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
190
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
191 static cyg_mutex_t mutex_obj;
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
192 static cyg_mutex_t *mutex;
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
193
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
194 // These are for reporting back to the master thread
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
195 volatile int got_it = 0;
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
196 volatile int t3ran = 0;
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
197 volatile int t3ended = 0;
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
198 volatile int extras[4] = {0,0,0,0};
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
199
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
200 volatile int go_flag = 0; // but this one controls thread 3 from thread 2
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
201
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
202 // ------------------------------------------------------------------------
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
203 // 0 to 3 of these run generally to interfere with the other processing,
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
204 // to cause multiple prio inheritances, and clashes in any orders.
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
205
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
206 static void extra_thread( cyg_addrword_t data )
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
207 {
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
208 cyg_handle_t self = cyg_thread_self();
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
209
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
210
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
211 #ifdef VERBOSE
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
212 #define xXINFO( z ) \
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
213 do { z[13] = '0' + data; CYG_TEST_INFO( z ); } while ( 0 )
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
214
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
215 static char running[] = "Extra thread Xa running";
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
216 static char exiting[] = "Extra thread Xa exiting";
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
217 static char resumed[] = "Extra thread Xa resumed";
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
218 static char locked[] = "Extra thread Xa locked";
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
219 static char unlocked[] = "Extra thread Xa unlocked";
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
220 #else
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
221 #define XINFO( z ) /* nothing */
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
222 #endif
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
223
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
224 XINFO( running );
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
225
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
226 cyg_thread_suspend( self );
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
227
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
228 XINFO( resumed );
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
229
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
230 cyg_mutex_lock( mutex );
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
231
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
232 XINFO( locked );
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
233
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
234 cyg_mutex_unlock( mutex );
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
235
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
236 XINFO( unlocked );
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
237
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
238 extras[ data ] ++;
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
239
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
240 XINFO( exiting );
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
241
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
242 }
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
243
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
244 // ------------------------------------------------------------------------
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
245
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
246 static void t1( cyg_addrword_t data )
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
247 {
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
248 cyg_handle_t self = cyg_thread_self();
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
249 #ifdef VERBOSE
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
250 CYG_TEST_INFO( "Thread 1 running" );
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
251 #endif
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
252 cyg_thread_suspend( self );
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
253
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
254 cyg_mutex_lock( mutex );
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
255
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
256 got_it++;
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
257
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
258 CYG_TEST_CHECK( 0 == t3ended, "T3 ended prematurely [T1,1]" );
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
259
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
260 cyg_mutex_unlock( mutex );
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
261
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
262 CYG_TEST_CHECK( 0 == t3ended, "T3 ended prematurely [T1,2]" );
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
263
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
264 // That's all.
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
265 #ifdef VERBOSE
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
266 CYG_TEST_INFO( "Thread 1 exit" );
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
267 #endif
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
268 }
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
269
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
270 // ------------------------------------------------------------------------
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
271
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
272 static void t2( cyg_addrword_t data )
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
273 {
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
274 cyg_handle_t self = cyg_thread_self();
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
275 int i;
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
276 cyg_tick_count_t then, now;
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
277 #ifdef VERBOSE
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
278 CYG_TEST_INFO( "Thread 2 running" );
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
279 #endif
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
280 CYG_TEST_CHECK( 0 == (data & ~0x77), "Bad T2 arg: extra bits" );
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
281 CYG_TEST_CHECK( 0 == (data & (data >> 4)), "Bad T2 arg: overlap" );
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
282
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
283 cyg_thread_suspend( self );
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
284
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
285 // depending on our config argument, optionally restart some of the
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
286 // extra threads to throw noise into the scheduler:
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
287 for ( i = 0; i < 3; i++ )
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
288 if ( (1 << i) & data ) // bits 0-2 control
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
289 cyg_thread_resume( thread[i+4] ); // extras are thread[4-6]
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
290
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
291 cyg_thread_delay( DELAYFACTOR * 10 ); // let those threads run
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
292
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
293 cyg_scheduler_lock(); // do this next lot atomically
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
294
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
295 go_flag = 1; // unleash thread 3
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
296 cyg_thread_resume( thread[1] ); // resume thread 1
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
297
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
298 // depending on our config argument, optionally restart some of the
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
299 // extra threads to throw noise into the scheduler at this later point:
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
300 for ( i = 4; i < 7; i++ )
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
301 if ( (1 << i) & data ) // bits 4-6 control
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
302 cyg_thread_resume( thread[i] ); // extras are thread[4-6]
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
303
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
304 cyg_scheduler_unlock(); // let scheduling proceed
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
305
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
306 // Need a delay (but not a CPU yield) to allow t3 to awaken and act on
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
307 // the go_flag, otherwise we check these details below too soon.
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
308 // Actually, waiting for the clock to tick a couple of times would be
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
309 // better, so that is what we will do. Must be a busy-wait.
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
310 then = cyg_current_time();
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
311 do {
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
312 now = cyg_current_time();
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
313 // Wait longer than the delay in t3 waiting on go_flag
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
314 } while ( now < (then + 3) );
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
315
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
316 // Check for whatever result we expect from the protocol selected:
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
317 // This mirrors what is done in configury in kmutex3.c and mutex3.cxx
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
318 if ( PROTO_CEILING_MID == proto ) {
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
319 CYG_TEST_INFO( "Not checking: ceiling mid value" );
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
320 }
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
321 else if ( PROTO_INHERIT == proto ||
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
322 PROTO_CEILING_HIGH == proto ) {
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
323 CYG_TEST_INFO( "Checking priority scheme operating" );
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
324 CYG_TEST_CHECK( 1 == t3ran, "Thread 3 did not run" );
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
325 CYG_TEST_CHECK( 1 == got_it, "Thread 1 did not get the mutex" );
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
326 }
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
327 else {
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
328 CYG_TEST_INFO( "Checking NO priority scheme operating" );
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
329 CYG_TEST_CHECK( 0 == t3ran, "Thread 3 DID run" );
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
330 CYG_TEST_CHECK( 0 == got_it, "Thread 1 DID get the mutex" );
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
331 }
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
332
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
333 CYG_TEST_CHECK( 0 == t3ended, "Thread 3 ended prematurely [T2,1]" );
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
334
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
335 cyg_thread_delay( DELAYFACTOR * 20 ); // let those threads run
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
336
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
337 CYG_TEST_CHECK( 1 == t3ran, "Thread 3 did not run" );
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
338 CYG_TEST_CHECK( 1 == got_it, "Thread 1 did not get the mutex" );
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
339 CYG_TEST_CHECK( 1 == t3ended, "Thread 3 has not ended" );
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
340
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
341 for ( i = 0; i < 3; i++ )
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
342 if ( (1 << i) & (data | data >> 4) ) // bits 0-2 and 4-6 control
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
343 CYG_TEST_CHECK( 1 == extras[i+1], "Extra thread did not run" );
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
344 else
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
345 CYG_TEST_CHECK( 0 == extras[i+1], "Extra thread ran" );
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
346
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
347 CYG_TEST_PASS( "Thread 2 exiting, AOK" );
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
348 // That's all: restart the control thread.
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
349 cyg_thread_resume( thread[0] );
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
350 }
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
351
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
352 // ------------------------------------------------------------------------
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
353
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
354 static void t3( cyg_addrword_t data )
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
355 {
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
356 #ifdef VERBOSE
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
357 CYG_TEST_INFO( "Thread 3 running" );
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
358 #endif
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
359 cyg_mutex_lock( mutex );
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
360
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
361 cyg_thread_delay( DELAYFACTOR * 5 ); // let thread 3a run
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
362
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
363 cyg_thread_resume( thread[2] ); // resume thread 2
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
364
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
365 while ( 0 == go_flag )
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
366 cyg_thread_delay(1); // wait until we are told to go
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
367
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
368 t3ran ++; // record the fact
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
369
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
370 CYG_TEST_CHECK( 0 == got_it, "Thread 1 claims to have got my mutex" );
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
371
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
372 cyg_mutex_unlock( mutex );
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
373
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
374 t3ended ++; // record that we came back
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
375
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
376 CYG_TEST_CHECK( 1 == got_it, "Thread 1 did not get the mutex" );
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
377 #ifdef VERBOSE
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
378 CYG_TEST_INFO( "Thread 3 exit" );
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
379 #endif
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
380 }
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
381
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
382 // ------------------------------------------------------------------------
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
383
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
384 static void control_thread( cyg_addrword_t data )
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
385 {
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
386 cyg_handle_t self = cyg_thread_self();
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
387 int i, z;
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
388
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
389 CYG_TEST_INIT();
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
390 CYG_TEST_INFO( "Control Thread running" );
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
391
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
392 // Go through the 27 possibilities of resuming the extra threads
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
393 // 0: not at all
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
394 // 1: early in the process
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
395 // 2: later on
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
396 // which are represented by bits 0-3 and 4-6 resp in the argument to
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
397 // thread 2 (none set means no resume at all).
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
398 for ( i = 0; i < 27; i++ ) {
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
399 static int xx[] = { 0, 1, 16 };
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
400 int j = i % 3;
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
401 int k = (i / 3) % 3;
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
402 int l = (i / 9) % 3;
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
403
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
404 int d = xx[j] | (xx[k]<<1) | (xx[l]<<2) ;
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
405
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
406 if ( cyg_test_is_simulator && (0 != i && 13 != i && 26 != i) )
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
407 continue; // 13 is 111 base 3, 26 is 222 base 3
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
408
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
409 // Go through all these priority inversion prevention protocols:
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
410 // (if supported in this configuration)
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
411 // PROTO_NONE (0)
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
412 // PROTO_INHERIT (1)
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
413 // PROTO_CEILING_HIGH (2)
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
414 // PROTO_CEILING_MID (3)
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
415 // PROTO_CEILING_LOW (4)
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
416 for ( proto = PROTO_NONE; proto <= PROTO_CEILING_LOW; proto++ ) {
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
417
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
418 // If no priority inheritance at all, running threads 1a and 2a is
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
419 // OK, but not thread 3a; it blocks the world.
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
420 if ( PROTO_NONE == proto ||
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
421 PROTO_CEILING_MID == proto ||
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
422 PROTO_CEILING_LOW == proto )
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
423 if ( l ) // Cannot run thread 3a if no
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
424 continue; // priority inheritance at all.
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
425
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
426 mutex = &mutex_obj;
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
427
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
428 switch ( proto ) {
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
429 #ifdef CYGSEM_KERNEL_SYNCH_MUTEX_PRIORITY_INVERSION_PROTOCOL_NONE
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
430 case PROTO_NONE:
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
431 cyg_mutex_init( mutex );
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
432 cyg_mutex_set_protocol( mutex, CYG_MUTEX_NONE );
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
433 break;
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
434 #endif
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
435 #ifdef CYGSEM_KERNEL_SYNCH_MUTEX_PRIORITY_INVERSION_PROTOCOL_INHERIT
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
436 case PROTO_INHERIT:
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
437 cyg_mutex_init( mutex );
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
438 cyg_mutex_set_protocol( mutex, CYG_MUTEX_INHERIT );
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
439 break;
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
440 #endif
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
441 #ifdef CYGSEM_KERNEL_SYNCH_MUTEX_PRIORITY_INVERSION_PROTOCOL_CEILING
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
442 case PROTO_CEILING_HIGH:
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
443 cyg_mutex_init( mutex );
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
444 cyg_mutex_set_protocol( mutex, CYG_MUTEX_CEILING );
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
445 cyg_mutex_set_ceiling( mutex, (cyg_priority_t) 4 );
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
446 break;
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
447 case PROTO_CEILING_MID:
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
448 cyg_mutex_init( mutex );
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
449 cyg_mutex_set_protocol( mutex, CYG_MUTEX_CEILING );
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
450 cyg_mutex_set_ceiling( mutex, (cyg_priority_t) 11 );
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
451 break;
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
452 case PROTO_CEILING_LOW:
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
453 cyg_mutex_init( mutex );
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
454 cyg_mutex_set_protocol( mutex, CYG_MUTEX_CEILING );
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
455 cyg_mutex_set_ceiling( mutex, (cyg_priority_t) 17 );
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
456 break;
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
457 #endif
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
458 default:
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
459 continue; // Break out of the prio for loop - do nothing
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
460 }
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
461
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
462 got_it = 0;
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
463 t3ran = 0;
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
464 t3ended = 0;
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
465 for ( z = 0; z < 4; z++ ) extras[z] = 0;
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
466 go_flag = 0;
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
467
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
468 new_thread( t1, 0, 5, 1, "test 1" ); // Slot 1
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
469 new_thread( t2, d, 10, 1, "test 2" ); // Slot 2
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
470 new_thread( t3, 0, 15, 1, "test 3" ); // Slot 3
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
471
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
472 new_thread( extra_thread, 1, 8, j, "extra 1" ); // Slot 4
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
473 new_thread( extra_thread, 2, 12, k, "extra 2" ); // Slot 5
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
474 new_thread( extra_thread, 3, 17, l, "extra 3" ); // Slot 6
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
475
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
476 {
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
477 static char *a[] = { "inactive", "run early", "run late" };
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
478 diag_printf( "\n----- %s [%2d] New Cycle: 0x%02x, Threads 1a %s, 2a %s, 3a %s -----\n",
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
479 protnames[proto], i, d, a[j], a[k], a[l] );
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
480 }
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
481
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
482 cyg_thread_suspend( self );
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
483
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
484 kill_threads();
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
485 cyg_mutex_destroy( mutex );
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
486 }
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
487 }
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
488 CYG_TEST_EXIT( "Control Thread exit" );
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
489 }
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
490
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
491 // ------------------------------------------------------------------------
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
492
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
493 externC void
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
494 cyg_user_start( void )
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
495 {
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
496 #ifdef CYGSEM_HAL_STOP_CONSTRUCTORS_ON_FLAG
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
497 cyg_hal_invoke_constructors();
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
498 #endif
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
499 new_thread( control_thread, 0, 2, 1, "control thread" );
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
500 }
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
501
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
502 #else // CYGVAR_KERNEL_COUNTERS_CLOCK &c
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
503
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
504 externC void
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
505 cyg_start( void )
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
506 {
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
507 CYG_TEST_INIT();
1507
92cf4ff674de * tests/kmutex3.c (cyg_start): Use CYG_TEST_NA.
jlarmour
parents: 210
diff changeset
508 CYG_TEST_INFO("KMutex4 test requires:\n"
181
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
509 "CYGFUN_KERNEL_API_C &&\n"
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
510 "CYGVAR_KERNEL_COUNTERS_CLOCK &&\n"
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
511 "(CYGNUM_KERNEL_SCHED_PRIORITIES > 20) &&\n"
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
512 "!defined(CYGPKG_KERNEL_SMP_SUPPORT) &&\n"
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
513 "defined(CYGSEM_KERNEL_SYNCH_MUTEX_PRIORITY_INVERSION_PROTOCOL_DYNAMIC)\n"
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
514 );
1507
92cf4ff674de * tests/kmutex3.c (cyg_start): Use CYG_TEST_NA.
jlarmour
parents: 210
diff changeset
515 CYG_TEST_NA("KMutex4 test requirements");
181
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
516 }
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
517 #endif // CYGVAR_KERNEL_COUNTERS_CLOCK &c
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
518
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
519
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
520 // ------------------------------------------------------------------------
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
521 // Documentation: enclosed is the design of this test.
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
522 //
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
523 // See mutex3.cxx or kmutex3.c
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
524
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
525 // ------------------------------------------------------------------------
d61da071934c Merge from eCos master repository on 2001-08-22-06:38:55-BST
jlarmour
parents:
diff changeset
526 // EOF mutex4.c