]> git.kernelconcepts.de Git - karo-tx-redboot.git/blob - packages/kernel/v2_0/tests/thread1.cxx
Initial revision
[karo-tx-redboot.git] / packages / kernel / v2_0 / tests / thread1.cxx
1 //==========================================================================
2 //
3 //        thread1.cxx
4 //
5 //        Thread test 1
6 //
7 //==========================================================================
8 //####ECOSGPLCOPYRIGHTBEGIN####
9 // -------------------------------------------
10 // This file is part of eCos, the Embedded Configurable Operating System.
11 // Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.
12 //
13 // eCos is free software; you can redistribute it and/or modify it under
14 // the terms of the GNU General Public License as published by the Free
15 // Software Foundation; either version 2 or (at your option) any later version.
16 //
17 // eCos is distributed in the hope that it will be useful, but WITHOUT ANY
18 // WARRANTY; without even the implied warranty of MERCHANTABILITY or
19 // FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
20 // for more details.
21 //
22 // You should have received a copy of the GNU General Public License along
23 // with eCos; if not, write to the Free Software Foundation, Inc.,
24 // 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
25 //
26 // As a special exception, if other files instantiate templates or use macros
27 // or inline functions from this file, or you compile this file and link it
28 // with other works to produce a work based on this file, this file does not
29 // by itself cause the resulting work to be covered by the GNU General Public
30 // License. However the source code for this file must still be made available
31 // in accordance with section (3) of the GNU General Public License.
32 //
33 // This exception does not invalidate any other reasons why a work based on
34 // this file might be covered by the GNU General Public License.
35 //
36 // Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.
37 // at http://sources.redhat.com/ecos/ecos-license/
38 // -------------------------------------------
39 //####ECOSGPLCOPYRIGHTEND####
40 //==========================================================================
41 //#####DESCRIPTIONBEGIN####
42 //
43 // Author(s):     dsm
44 // Contributors:    dsm
45 // Date:          1998-02-11
46 // Description:   Tests some basic thread functions.
47 // Omissions:     Cyg_ThreadTimer
48 //                Cyg_Thread
49 //                  exit -- not necessarily called
50 //                  yield
51 //                  set_priority
52 //                  get_priority
53 //                  get/set_sleep_reason
54 //                  get/set_wake_reason
55 //                  set/clear_timer
56 //                Cyg_ThreadQueue
57 //               
58 //####DESCRIPTIONEND####
59
60 #include <pkgconf/kernel.h>
61
62 #include <cyg/kernel/sched.hxx>
63 #include <cyg/kernel/thread.hxx>
64
65 #include <cyg/infra/testcase.h>
66
67 #ifdef CYGFUN_KERNEL_THREADS_TIMER
68
69 #include <cyg/kernel/sched.inl>
70 #include <cyg/kernel/thread.inl>
71
72 #include "testaux.hxx"
73
74 #ifdef CYGNUM_HAL_STACK_SIZE_TYPICAL
75 #define STACKSIZE CYGNUM_HAL_STACK_SIZE_TYPICAL
76 #else
77 #define STACKSIZE 2000
78 #endif
79
80 static char stack[2][STACKSIZE];
81
82 static char thread[2][sizeof(Cyg_Thread)];
83
84 static Cyg_Thread *pt0,*pt1;
85 static cyg_uint16 uid0,uid1;
86
87
88 static void entry0( CYG_ADDRWORD data )
89 {
90     CHECK( 222 == data );
91
92     uid0 = pt0->get_unique_id();
93
94     pt1->suspend();       
95     pt1->resume();
96
97     do {
98         pt0->delay(1);
99     } while( Cyg_Thread::RUNNING == pt1->get_state() );
100     
101     CHECK( Cyg_Thread::SLEEPING == pt1->get_state() );
102
103     pt1->wake();
104
105     CHECK( uid0 != uid1 );
106
107     CYG_TEST_PASS_FINISH("Thread 1 OK");
108 }
109
110 static void entry1( CYG_ADDRWORD data )
111 {
112     CHECK( 333 == data );
113
114     uid1 = pt1->get_unique_id();
115
116     Cyg_Thread *self = Cyg_Thread::self();
117    
118     CHECK( self == pt1 );
119
120     pt1->sleep();
121     pt1->suspend();
122
123     Cyg_Thread::exit();         // no guarantee this will be called
124 }
125
126 void thread1_main( void )
127 {
128     CYG_TEST_INIT();
129
130     pt0 = new((void *)&thread[0])
131             Cyg_Thread(CYG_SCHED_DEFAULT_INFO,
132                        entry0, 222, 
133                        "thread 0",
134                        (CYG_ADDRESS)stack[0], STACKSIZE );
135     pt1 = new((void *)&thread[1])
136             Cyg_Thread(CYG_SCHED_DEFAULT_INFO,
137                        entry1, 333, 
138                        "thread 1",
139                        (CYG_ADDRESS)stack[1], STACKSIZE );
140
141     CYG_ASSERTCLASS( pt0, "error" );
142     CYG_ASSERTCLASS( pt1, "error" );
143
144     pt0->resume();
145     pt1->resume();
146
147     Cyg_Scheduler::start();
148
149     CYG_TEST_FAIL_FINISH("Not reached");
150 }
151
152 externC void
153 cyg_start( void )
154 {
155 #ifdef CYGSEM_HAL_STOP_CONSTRUCTORS_ON_FLAG
156     cyg_hal_invoke_constructors();
157 #endif
158     thread1_main();
159 }
160
161 #else // ifdef CYGFUN_KERNEL_THREADS_TIMER
162
163 externC void
164 cyg_start( void )
165 {
166     CYG_TEST_INIT();
167     CYG_TEST_NA("Kernel threads timer disabled");
168 }
169
170 #endif // ifdef CYGFUN_KERNEL_THREADS_TIMER
171
172 // EOF thread1.cxx