xref: /aoo4110/main/sal/qa/osl/process/osl_Thread.cxx (revision b1cdbd2c)
1*b1cdbd2cSJim Jagielski /**************************************************************
2*b1cdbd2cSJim Jagielski  *
3*b1cdbd2cSJim Jagielski  * Licensed to the Apache Software Foundation (ASF) under one
4*b1cdbd2cSJim Jagielski  * or more contributor license agreements.  See the NOTICE file
5*b1cdbd2cSJim Jagielski  * distributed with this work for additional information
6*b1cdbd2cSJim Jagielski  * regarding copyright ownership.  The ASF licenses this file
7*b1cdbd2cSJim Jagielski  * to you under the Apache License, Version 2.0 (the
8*b1cdbd2cSJim Jagielski  * "License"); you may not use this file except in compliance
9*b1cdbd2cSJim Jagielski  * with the License.  You may obtain a copy of the License at
10*b1cdbd2cSJim Jagielski  *
11*b1cdbd2cSJim Jagielski  *   http://www.apache.org/licenses/LICENSE-2.0
12*b1cdbd2cSJim Jagielski  *
13*b1cdbd2cSJim Jagielski  * Unless required by applicable law or agreed to in writing,
14*b1cdbd2cSJim Jagielski  * software distributed under the License is distributed on an
15*b1cdbd2cSJim Jagielski  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b1cdbd2cSJim Jagielski  * KIND, either express or implied.  See the License for the
17*b1cdbd2cSJim Jagielski  * specific language governing permissions and limitations
18*b1cdbd2cSJim Jagielski  * under the License.
19*b1cdbd2cSJim Jagielski  *
20*b1cdbd2cSJim Jagielski  *************************************************************/
21*b1cdbd2cSJim Jagielski 
22*b1cdbd2cSJim Jagielski 
23*b1cdbd2cSJim Jagielski 
24*b1cdbd2cSJim Jagielski // MARKER(update_precomp.py): autogen include statement, do not remove
25*b1cdbd2cSJim Jagielski #include "precompiled_sal.hxx"
26*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------
27*b1cdbd2cSJim Jagielski // include files
28*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------
29*b1cdbd2cSJim Jagielski #include <sal/types.h>
30*b1cdbd2cSJim Jagielski 
31*b1cdbd2cSJim Jagielski #ifndef _RTL_USTRING_HXX_
32*b1cdbd2cSJim Jagielski #include <rtl/string.hxx>
33*b1cdbd2cSJim Jagielski #endif
34*b1cdbd2cSJim Jagielski 
35*b1cdbd2cSJim Jagielski #ifndef _RTL_USTRING_HXX_
36*b1cdbd2cSJim Jagielski #include <rtl/strbuf.hxx>
37*b1cdbd2cSJim Jagielski #endif
38*b1cdbd2cSJim Jagielski 
39*b1cdbd2cSJim Jagielski #ifndef _OSL_THREAD_HXX
40*b1cdbd2cSJim Jagielski #include <osl/thread.hxx>
41*b1cdbd2cSJim Jagielski #endif
42*b1cdbd2cSJim Jagielski 
43*b1cdbd2cSJim Jagielski #ifndef _OSL_MUTEX_HXX
44*b1cdbd2cSJim Jagielski #include <osl/mutex.hxx>
45*b1cdbd2cSJim Jagielski #endif
46*b1cdbd2cSJim Jagielski #include <osl/time.h>
47*b1cdbd2cSJim Jagielski 
48*b1cdbd2cSJim Jagielski #include <testshl/simpleheader.hxx>
49*b1cdbd2cSJim Jagielski 
50*b1cdbd2cSJim Jagielski using namespace osl;
51*b1cdbd2cSJim Jagielski using namespace rtl;
52*b1cdbd2cSJim Jagielski 
53*b1cdbd2cSJim Jagielski #ifdef UNX
54*b1cdbd2cSJim Jagielski #include <unistd.h>
55*b1cdbd2cSJim Jagielski #include <time.h>
56*b1cdbd2cSJim Jagielski #endif
57*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
58*b1cdbd2cSJim Jagielski // Kleine Stopuhr
59*b1cdbd2cSJim Jagielski class StopWatch {
60*b1cdbd2cSJim Jagielski     TimeValue t1,t2;                                // Start und Stopzeit
61*b1cdbd2cSJim Jagielski 
62*b1cdbd2cSJim Jagielski protected:
63*b1cdbd2cSJim Jagielski     sal_Int32 m_nNanoSec;
64*b1cdbd2cSJim Jagielski     sal_Int32 m_nSeconds;
65*b1cdbd2cSJim Jagielski 
66*b1cdbd2cSJim Jagielski     bool m_bIsValid;                                   // TRUE, wenn gestartet und gestoppt
67*b1cdbd2cSJim Jagielski     bool m_bIsRunning;                                 // TRUE, wenn gestartet.
68*b1cdbd2cSJim Jagielski 
69*b1cdbd2cSJim Jagielski public:
70*b1cdbd2cSJim Jagielski     StopWatch();
~StopWatch()71*b1cdbd2cSJim Jagielski     ~StopWatch() {}
72*b1cdbd2cSJim Jagielski 
73*b1cdbd2cSJim Jagielski     void start();                                 // Startet Timer
74*b1cdbd2cSJim Jagielski     void stop();                                  // Stoppt Timer
75*b1cdbd2cSJim Jagielski 
76*b1cdbd2cSJim Jagielski     double getSeconds() const;
77*b1cdbd2cSJim Jagielski     double getTenthSec() const;
78*b1cdbd2cSJim Jagielski };
79*b1cdbd2cSJim Jagielski 
80*b1cdbd2cSJim Jagielski // ================================= Stop Watch =================================
81*b1cdbd2cSJim Jagielski 
82*b1cdbd2cSJim Jagielski // Eine kleine Stop-Uhr fuer den internen Gebrauch.
83*b1cdbd2cSJim Jagielski // (c) Lars Langhans 29.12.1996 22:10
84*b1cdbd2cSJim Jagielski 
StopWatch()85*b1cdbd2cSJim Jagielski StopWatch::StopWatch():m_bIsValid(false),m_bIsRunning(false) {}
86*b1cdbd2cSJim Jagielski 
start()87*b1cdbd2cSJim Jagielski void StopWatch::start()
88*b1cdbd2cSJim Jagielski {
89*b1cdbd2cSJim Jagielski // pre: %
90*b1cdbd2cSJim Jagielski // post: Start Timer
91*b1cdbd2cSJim Jagielski 
92*b1cdbd2cSJim Jagielski     m_bIsValid = false;
93*b1cdbd2cSJim Jagielski     m_bIsRunning = true;
94*b1cdbd2cSJim Jagielski     osl_getSystemTime( &t1 );
95*b1cdbd2cSJim Jagielski     t_print("# %d %d nsecs\n", t1.Seconds, t1.Nanosec);
96*b1cdbd2cSJim Jagielski     // gettimeofday(&t1, 0);
97*b1cdbd2cSJim Jagielski }
98*b1cdbd2cSJim Jagielski 
stop()99*b1cdbd2cSJim Jagielski void StopWatch::stop()
100*b1cdbd2cSJim Jagielski {
101*b1cdbd2cSJim Jagielski // pre: Timer should be started
102*b1cdbd2cSJim Jagielski // post: Timer will stopped
103*b1cdbd2cSJim Jagielski 
104*b1cdbd2cSJim Jagielski     // gettimeofday(&t2, 0);                         // Timer ausfragen
105*b1cdbd2cSJim Jagielski     osl_getSystemTime( &t2 );
106*b1cdbd2cSJim Jagielski     t_print("# %d %d nsecs\n", t2.Seconds, t2.Nanosec);
107*b1cdbd2cSJim Jagielski 
108*b1cdbd2cSJim Jagielski     if (m_bIsRunning)
109*b1cdbd2cSJim Jagielski     {                                // check ob gestartet.
110*b1cdbd2cSJim Jagielski // LLA: old         m_nNanoSec = static_cast<sal_Int32>(t2.Nanosec) - static_cast<sal_Int32>(t1.Nanosec);
111*b1cdbd2cSJim Jagielski // LLA: old         m_nSeconds = static_cast<sal_Int32>(t2.Seconds) - static_cast<sal_Int32>(t1.Seconds);
112*b1cdbd2cSJim Jagielski // LLA: old         if (m_nNanoSec < 0)
113*b1cdbd2cSJim Jagielski // LLA: old         {
114*b1cdbd2cSJim Jagielski // LLA: old             m_nNanoSec += 1000000000;
115*b1cdbd2cSJim Jagielski // LLA: old             m_nSeconds -= 1;
116*b1cdbd2cSJim Jagielski // LLA: old         }
117*b1cdbd2cSJim Jagielski         //m_nNanoSec = t2.Nanosec - t1.Nanosec;
118*b1cdbd2cSJim Jagielski         m_nSeconds = static_cast<sal_Int32>(t2.Seconds) - static_cast<sal_Int32>(t1.Seconds);
119*b1cdbd2cSJim Jagielski         if ( t2.Nanosec > t1.Nanosec )
120*b1cdbd2cSJim Jagielski        		m_nNanoSec = static_cast<sal_Int32>(t2.Nanosec) - static_cast<sal_Int32>(t1.Nanosec);
121*b1cdbd2cSJim Jagielski        	else
122*b1cdbd2cSJim Jagielski        	{
123*b1cdbd2cSJim Jagielski 		m_nNanoSec = 1000000000 + static_cast<sal_Int32>(t2.Nanosec) - static_cast<sal_Int32>(t1.Nanosec);
124*b1cdbd2cSJim Jagielski             	m_nSeconds -= 1;
125*b1cdbd2cSJim Jagielski 	}
126*b1cdbd2cSJim Jagielski 	t_print("# %d %d nsecs\n", m_nSeconds, m_nNanoSec );
127*b1cdbd2cSJim Jagielski         //if (m_nNanoSec < 0)
128*b1cdbd2cSJim Jagielski         //{
129*b1cdbd2cSJim Jagielski             //m_nNanoSec += 1000000000;
130*b1cdbd2cSJim Jagielski             //m_nSeconds -= 1;
131*b1cdbd2cSJim Jagielski         //}
132*b1cdbd2cSJim Jagielski         m_bIsValid = true;
133*b1cdbd2cSJim Jagielski         m_bIsRunning = false;
134*b1cdbd2cSJim Jagielski     }
135*b1cdbd2cSJim Jagielski }
136*b1cdbd2cSJim Jagielski 
getSeconds() const137*b1cdbd2cSJim Jagielski double StopWatch::getSeconds() const
138*b1cdbd2cSJim Jagielski {
139*b1cdbd2cSJim Jagielski // pre: gueltig = TRUE
140*b1cdbd2cSJim Jagielski // BACK: Zeit in Sekunden.
141*b1cdbd2cSJim Jagielski 
142*b1cdbd2cSJim Jagielski     double nValue = 0.0;
143*b1cdbd2cSJim Jagielski     if (m_bIsValid)
144*b1cdbd2cSJim Jagielski     {
145*b1cdbd2cSJim Jagielski         nValue = double(m_nNanoSec) / 1000000000.0 + m_nSeconds; // milli micro nano
146*b1cdbd2cSJim Jagielski     }
147*b1cdbd2cSJim Jagielski     return nValue;
148*b1cdbd2cSJim Jagielski }
149*b1cdbd2cSJim Jagielski 
getTenthSec() const150*b1cdbd2cSJim Jagielski double StopWatch::getTenthSec() const
151*b1cdbd2cSJim Jagielski {
152*b1cdbd2cSJim Jagielski     double nValue = 0.0;
153*b1cdbd2cSJim Jagielski     if (m_bIsValid)
154*b1cdbd2cSJim Jagielski     {
155*b1cdbd2cSJim Jagielski         nValue = double(m_nNanoSec) / 100000000.0 + m_nSeconds * 10;
156*b1cdbd2cSJim Jagielski     }
157*b1cdbd2cSJim Jagielski     return nValue ;
158*b1cdbd2cSJim Jagielski }
159*b1cdbd2cSJim Jagielski 
160*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
161*b1cdbd2cSJim Jagielski template <class T>
162*b1cdbd2cSJim Jagielski class ThreadSafeValue
163*b1cdbd2cSJim Jagielski {
164*b1cdbd2cSJim Jagielski     T   m_nFlag;
165*b1cdbd2cSJim Jagielski     Mutex   m_aMutex;
166*b1cdbd2cSJim Jagielski public:
ThreadSafeValue(T n=0)167*b1cdbd2cSJim Jagielski     ThreadSafeValue(T n = 0): m_nFlag(n) {}
getValue()168*b1cdbd2cSJim Jagielski     T getValue()
169*b1cdbd2cSJim Jagielski         {
170*b1cdbd2cSJim Jagielski             //block if already acquired by another thread.
171*b1cdbd2cSJim Jagielski             osl::MutexGuard g(m_aMutex);
172*b1cdbd2cSJim Jagielski             return m_nFlag;
173*b1cdbd2cSJim Jagielski         }
addValue(T n)174*b1cdbd2cSJim Jagielski     void addValue(T n)
175*b1cdbd2cSJim Jagielski         {
176*b1cdbd2cSJim Jagielski             //only one thread operate on the flag.
177*b1cdbd2cSJim Jagielski             osl::MutexGuard g(m_aMutex);
178*b1cdbd2cSJim Jagielski             m_nFlag += n;
179*b1cdbd2cSJim Jagielski         }
acquire()180*b1cdbd2cSJim Jagielski     void acquire() {m_aMutex.acquire();}
release()181*b1cdbd2cSJim Jagielski     void release() {m_aMutex.release();}
182*b1cdbd2cSJim Jagielski };
183*b1cdbd2cSJim Jagielski 
184*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
185*b1cdbd2cSJim Jagielski namespace ThreadHelper
186*b1cdbd2cSJim Jagielski {
187*b1cdbd2cSJim Jagielski     // typedef enum {
188*b1cdbd2cSJim Jagielski     //     QUIET=1,
189*b1cdbd2cSJim Jagielski     //     VERBOSE
190*b1cdbd2cSJim Jagielski     // } eSleepVerboseMode;
191*b1cdbd2cSJim Jagielski 
thread_sleep_tenth_sec(sal_Int32 _nTenthSec)192*b1cdbd2cSJim Jagielski     void thread_sleep_tenth_sec(sal_Int32 _nTenthSec/*, eSleepVerboseMode nVerbose = VERBOSE*/)
193*b1cdbd2cSJim Jagielski     {
194*b1cdbd2cSJim Jagielski         // if (nVerbose == VERBOSE)
195*b1cdbd2cSJim Jagielski         // {
196*b1cdbd2cSJim Jagielski         //     t_print("wait %d tenth seconds. ", _nTenthSec );
197*b1cdbd2cSJim Jagielski         //     fflush(stdout);
198*b1cdbd2cSJim Jagielski         // }
199*b1cdbd2cSJim Jagielski #ifdef WNT      //Windows
200*b1cdbd2cSJim Jagielski         Sleep(_nTenthSec * 100 );
201*b1cdbd2cSJim Jagielski #endif
202*b1cdbd2cSJim Jagielski #if ( defined UNX ) || ( defined OS2 )  //Unix
203*b1cdbd2cSJim Jagielski         TimeValue nTV;
204*b1cdbd2cSJim Jagielski         nTV.Seconds = static_cast<sal_uInt32>( _nTenthSec/10 );
205*b1cdbd2cSJim Jagielski         nTV.Nanosec = ( (_nTenthSec%10 ) * 100000000 );
206*b1cdbd2cSJim Jagielski         osl_waitThread(&nTV);
207*b1cdbd2cSJim Jagielski #endif
208*b1cdbd2cSJim Jagielski         // if (nVerbose == VERBOSE)
209*b1cdbd2cSJim Jagielski         // {
210*b1cdbd2cSJim Jagielski         //     t_print("done\n");
211*b1cdbd2cSJim Jagielski         // }
212*b1cdbd2cSJim Jagielski     }
213*b1cdbd2cSJim Jagielski 
outputPriority(oslThreadPriority const & _aPriority)214*b1cdbd2cSJim Jagielski     void outputPriority(oslThreadPriority const& _aPriority)
215*b1cdbd2cSJim Jagielski     {
216*b1cdbd2cSJim Jagielski         // LLA: output the priority
217*b1cdbd2cSJim Jagielski         if (_aPriority == osl_Thread_PriorityHighest)
218*b1cdbd2cSJim Jagielski         {
219*b1cdbd2cSJim Jagielski             t_print("Prio is High\n");
220*b1cdbd2cSJim Jagielski         }
221*b1cdbd2cSJim Jagielski         else if (_aPriority == osl_Thread_PriorityAboveNormal)
222*b1cdbd2cSJim Jagielski         {
223*b1cdbd2cSJim Jagielski             t_print("Prio is above normal\n");
224*b1cdbd2cSJim Jagielski         }
225*b1cdbd2cSJim Jagielski         else if (_aPriority == osl_Thread_PriorityNormal)
226*b1cdbd2cSJim Jagielski         {
227*b1cdbd2cSJim Jagielski             t_print("Prio is normal\n");
228*b1cdbd2cSJim Jagielski         }
229*b1cdbd2cSJim Jagielski         else if (_aPriority == osl_Thread_PriorityBelowNormal)
230*b1cdbd2cSJim Jagielski         {
231*b1cdbd2cSJim Jagielski             t_print("Prio is below normal\n");
232*b1cdbd2cSJim Jagielski         }
233*b1cdbd2cSJim Jagielski         else if (_aPriority == osl_Thread_PriorityLowest)
234*b1cdbd2cSJim Jagielski         {
235*b1cdbd2cSJim Jagielski             t_print("Prio is lowest\n");
236*b1cdbd2cSJim Jagielski         }
237*b1cdbd2cSJim Jagielski         else
238*b1cdbd2cSJim Jagielski         {
239*b1cdbd2cSJim Jagielski             t_print("Prio is unknown\n");
240*b1cdbd2cSJim Jagielski         }
241*b1cdbd2cSJim Jagielski     }
242*b1cdbd2cSJim Jagielski }
243*b1cdbd2cSJim Jagielski 
244*b1cdbd2cSJim Jagielski /** Simple thread for testing Thread-create.
245*b1cdbd2cSJim Jagielski 
246*b1cdbd2cSJim Jagielski     Just add 1 of value 0, and after running, result is 1.
247*b1cdbd2cSJim Jagielski  */
248*b1cdbd2cSJim Jagielski class myThread : public Thread
249*b1cdbd2cSJim Jagielski {
250*b1cdbd2cSJim Jagielski     ThreadSafeValue<sal_Int32> m_aFlag;
251*b1cdbd2cSJim Jagielski public:
getValue()252*b1cdbd2cSJim Jagielski     sal_Int32 getValue() { return m_aFlag.getValue(); }
253*b1cdbd2cSJim Jagielski protected:
254*b1cdbd2cSJim Jagielski     /** guarded value which initialized 0
255*b1cdbd2cSJim Jagielski 
256*b1cdbd2cSJim Jagielski         @see ThreadSafeValue
257*b1cdbd2cSJim Jagielski     */
run()258*b1cdbd2cSJim Jagielski     void SAL_CALL run()
259*b1cdbd2cSJim Jagielski         {
260*b1cdbd2cSJim Jagielski             while(schedule())
261*b1cdbd2cSJim Jagielski             {
262*b1cdbd2cSJim Jagielski                 m_aFlag.addValue(1);
263*b1cdbd2cSJim Jagielski                 ThreadHelper::thread_sleep_tenth_sec(1);
264*b1cdbd2cSJim Jagielski             }
265*b1cdbd2cSJim Jagielski         }
266*b1cdbd2cSJim Jagielski 
267*b1cdbd2cSJim Jagielski public:
268*b1cdbd2cSJim Jagielski 
suspend()269*b1cdbd2cSJim Jagielski     virtual void SAL_CALL suspend()
270*b1cdbd2cSJim Jagielski         {
271*b1cdbd2cSJim Jagielski             m_aFlag.acquire();
272*b1cdbd2cSJim Jagielski             ::osl::Thread::suspend();
273*b1cdbd2cSJim Jagielski             m_aFlag.release();
274*b1cdbd2cSJim Jagielski         }
275*b1cdbd2cSJim Jagielski 
~myThread()276*b1cdbd2cSJim Jagielski     ~myThread()
277*b1cdbd2cSJim Jagielski         {
278*b1cdbd2cSJim Jagielski             if (isRunning())
279*b1cdbd2cSJim Jagielski             {
280*b1cdbd2cSJim Jagielski                 t_print("error: not terminated.\n");
281*b1cdbd2cSJim Jagielski             }
282*b1cdbd2cSJim Jagielski         }
283*b1cdbd2cSJim Jagielski 
284*b1cdbd2cSJim Jagielski };
285*b1cdbd2cSJim Jagielski 
286*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
287*b1cdbd2cSJim Jagielski /** Thread which has a flag add 1 every second until 20
288*b1cdbd2cSJim Jagielski  */
289*b1cdbd2cSJim Jagielski class OCountThread : public Thread
290*b1cdbd2cSJim Jagielski {
291*b1cdbd2cSJim Jagielski     ThreadSafeValue<sal_Int32> m_aFlag;
292*b1cdbd2cSJim Jagielski public:
OCountThread()293*b1cdbd2cSJim Jagielski     OCountThread()
294*b1cdbd2cSJim Jagielski         {
295*b1cdbd2cSJim Jagielski             m_nWaitSec = 0;
296*b1cdbd2cSJim Jagielski             t_print("new OCountThread thread %d!\n", getIdentifier());
297*b1cdbd2cSJim Jagielski         }
getValue()298*b1cdbd2cSJim Jagielski     sal_Int32 getValue() { return m_aFlag.getValue(); }
299*b1cdbd2cSJim Jagielski 
setWait(sal_Int32 nSec)300*b1cdbd2cSJim Jagielski     void setWait(sal_Int32 nSec)
301*b1cdbd2cSJim Jagielski         {
302*b1cdbd2cSJim Jagielski             m_nWaitSec = nSec;
303*b1cdbd2cSJim Jagielski             //m_bWait = sal_True;
304*b1cdbd2cSJim Jagielski         }
305*b1cdbd2cSJim Jagielski 
suspend()306*b1cdbd2cSJim Jagielski     virtual void SAL_CALL suspend()
307*b1cdbd2cSJim Jagielski         {
308*b1cdbd2cSJim Jagielski             m_aFlag.acquire();
309*b1cdbd2cSJim Jagielski             ::osl::Thread::suspend();
310*b1cdbd2cSJim Jagielski             m_aFlag.release();
311*b1cdbd2cSJim Jagielski         }
312*b1cdbd2cSJim Jagielski 
313*b1cdbd2cSJim Jagielski protected:
314*b1cdbd2cSJim Jagielski     //sal_Bool m_bWait;
315*b1cdbd2cSJim Jagielski     sal_Int32 m_nWaitSec;
316*b1cdbd2cSJim Jagielski 
run()317*b1cdbd2cSJim Jagielski     void SAL_CALL run()
318*b1cdbd2cSJim Jagielski         {
319*b1cdbd2cSJim Jagielski             /// if the thread should terminate, schedule return false
320*b1cdbd2cSJim Jagielski             while (m_aFlag.getValue() < 20 && schedule() == sal_True)
321*b1cdbd2cSJim Jagielski             {
322*b1cdbd2cSJim Jagielski                 m_aFlag.addValue(1);
323*b1cdbd2cSJim Jagielski                 ThreadHelper::thread_sleep_tenth_sec(1);
324*b1cdbd2cSJim Jagielski                 // TimeValue nTV;
325*b1cdbd2cSJim Jagielski                 // nTV.Seconds = 1;
326*b1cdbd2cSJim Jagielski                 // nTV.Nanosec = 0;
327*b1cdbd2cSJim Jagielski                 // wait(nTV);
328*b1cdbd2cSJim Jagielski 
329*b1cdbd2cSJim Jagielski                 if (m_nWaitSec != 0)
330*b1cdbd2cSJim Jagielski                 {
331*b1cdbd2cSJim Jagielski                     //ThreadHelper::thread_sleep_tenth_sec(m_nWaitSec * 10);
332*b1cdbd2cSJim Jagielski                     TimeValue nTV;
333*b1cdbd2cSJim Jagielski                     nTV.Seconds = m_nWaitSec / 10 ;
334*b1cdbd2cSJim Jagielski                     nTV.Nanosec = ( m_nWaitSec%10 ) * 100000000 ;
335*b1cdbd2cSJim Jagielski                     wait( nTV );
336*b1cdbd2cSJim Jagielski                     m_nWaitSec = 0;
337*b1cdbd2cSJim Jagielski                 }
338*b1cdbd2cSJim Jagielski             }
339*b1cdbd2cSJim Jagielski         }
onTerminated()340*b1cdbd2cSJim Jagielski     void SAL_CALL onTerminated()
341*b1cdbd2cSJim Jagielski         {
342*b1cdbd2cSJim Jagielski             t_print("normally terminate this thread %d!\n", getIdentifier());
343*b1cdbd2cSJim Jagielski         }
344*b1cdbd2cSJim Jagielski public:
345*b1cdbd2cSJim Jagielski 
~OCountThread()346*b1cdbd2cSJim Jagielski     ~OCountThread()
347*b1cdbd2cSJim Jagielski         {
348*b1cdbd2cSJim Jagielski             if (isRunning())
349*b1cdbd2cSJim Jagielski             {
350*b1cdbd2cSJim Jagielski                 t_print("error: not terminated.\n");
351*b1cdbd2cSJim Jagielski             }
352*b1cdbd2cSJim Jagielski         }
353*b1cdbd2cSJim Jagielski 
354*b1cdbd2cSJim Jagielski };
355*b1cdbd2cSJim Jagielski 
356*b1cdbd2cSJim Jagielski /** call suspend in the run method
357*b1cdbd2cSJim Jagielski */
358*b1cdbd2cSJim Jagielski class OSuspendThread : public Thread
359*b1cdbd2cSJim Jagielski {
360*b1cdbd2cSJim Jagielski     ThreadSafeValue<sal_Int32> m_aFlag;
361*b1cdbd2cSJim Jagielski public:
OSuspendThread()362*b1cdbd2cSJim Jagielski     OSuspendThread(){ m_bSuspend = sal_False; }
getValue()363*b1cdbd2cSJim Jagielski     sal_Int32 getValue() { return m_aFlag.getValue(); }
setSuspend()364*b1cdbd2cSJim Jagielski     void setSuspend()
365*b1cdbd2cSJim Jagielski         {
366*b1cdbd2cSJim Jagielski             m_bSuspend = sal_True;
367*b1cdbd2cSJim Jagielski         }
suspend()368*b1cdbd2cSJim Jagielski     virtual void SAL_CALL suspend()
369*b1cdbd2cSJim Jagielski         {
370*b1cdbd2cSJim Jagielski             m_aFlag.acquire();
371*b1cdbd2cSJim Jagielski             ::osl::Thread::suspend();
372*b1cdbd2cSJim Jagielski             m_aFlag.release();
373*b1cdbd2cSJim Jagielski         }
374*b1cdbd2cSJim Jagielski protected:
375*b1cdbd2cSJim Jagielski     sal_Bool m_bSuspend;
run()376*b1cdbd2cSJim Jagielski     void SAL_CALL run()
377*b1cdbd2cSJim Jagielski         {
378*b1cdbd2cSJim Jagielski             //if the thread should terminate, schedule return false
379*b1cdbd2cSJim Jagielski             while (schedule() == sal_True)
380*b1cdbd2cSJim Jagielski             {
381*b1cdbd2cSJim Jagielski                 m_aFlag.addValue(1);
382*b1cdbd2cSJim Jagielski 
383*b1cdbd2cSJim Jagielski                 ThreadHelper::thread_sleep_tenth_sec(1);
384*b1cdbd2cSJim Jagielski                 // m_bWait =    sal_False;
385*b1cdbd2cSJim Jagielski                 // TimeValue nTV;
386*b1cdbd2cSJim Jagielski                 // nTV.Seconds = 1;
387*b1cdbd2cSJim Jagielski                 // nTV.Nanosec = 0;
388*b1cdbd2cSJim Jagielski                 // wait(nTV);
389*b1cdbd2cSJim Jagielski                 if (m_bSuspend == sal_True)
390*b1cdbd2cSJim Jagielski                 {
391*b1cdbd2cSJim Jagielski                     suspend();
392*b1cdbd2cSJim Jagielski                     m_bSuspend  = sal_False;
393*b1cdbd2cSJim Jagielski                 }
394*b1cdbd2cSJim Jagielski             }
395*b1cdbd2cSJim Jagielski         }
396*b1cdbd2cSJim Jagielski public:
397*b1cdbd2cSJim Jagielski 
~OSuspendThread()398*b1cdbd2cSJim Jagielski     ~OSuspendThread()
399*b1cdbd2cSJim Jagielski         {
400*b1cdbd2cSJim Jagielski             if (isRunning())
401*b1cdbd2cSJim Jagielski             {
402*b1cdbd2cSJim Jagielski                 t_print("error: not terminated.\n");
403*b1cdbd2cSJim Jagielski             }
404*b1cdbd2cSJim Jagielski         }
405*b1cdbd2cSJim Jagielski 
406*b1cdbd2cSJim Jagielski };
407*b1cdbd2cSJim Jagielski 
408*b1cdbd2cSJim Jagielski /** no call schedule in the run method
409*b1cdbd2cSJim Jagielski */
410*b1cdbd2cSJim Jagielski class ONoScheduleThread : public Thread
411*b1cdbd2cSJim Jagielski {
412*b1cdbd2cSJim Jagielski     ThreadSafeValue<sal_Int32> m_aFlag;
413*b1cdbd2cSJim Jagielski public:
getValue()414*b1cdbd2cSJim Jagielski     sal_Int32 getValue() { return m_aFlag.getValue(); }
415*b1cdbd2cSJim Jagielski 
suspend()416*b1cdbd2cSJim Jagielski     virtual void SAL_CALL suspend()
417*b1cdbd2cSJim Jagielski         {
418*b1cdbd2cSJim Jagielski             m_aFlag.acquire();
419*b1cdbd2cSJim Jagielski             ::osl::Thread::suspend();
420*b1cdbd2cSJim Jagielski             m_aFlag.release();
421*b1cdbd2cSJim Jagielski         }
422*b1cdbd2cSJim Jagielski protected:
run()423*b1cdbd2cSJim Jagielski     void SAL_CALL run()
424*b1cdbd2cSJim Jagielski         {
425*b1cdbd2cSJim Jagielski             while (m_aFlag.getValue() < 10)
426*b1cdbd2cSJim Jagielski             {
427*b1cdbd2cSJim Jagielski                 m_aFlag.addValue(1);
428*b1cdbd2cSJim Jagielski                 ThreadHelper::thread_sleep_tenth_sec(1);
429*b1cdbd2cSJim Jagielski                 // TimeValue nTV;
430*b1cdbd2cSJim Jagielski                 // nTV.Seconds = 1;
431*b1cdbd2cSJim Jagielski                 // nTV.Nanosec = 0;
432*b1cdbd2cSJim Jagielski                 // wait(nTV);
433*b1cdbd2cSJim Jagielski             }
434*b1cdbd2cSJim Jagielski         }
onTerminated()435*b1cdbd2cSJim Jagielski     void SAL_CALL onTerminated()
436*b1cdbd2cSJim Jagielski         {
437*b1cdbd2cSJim Jagielski             t_print("normally terminate this thread %d!\n", getIdentifier());
438*b1cdbd2cSJim Jagielski         }
439*b1cdbd2cSJim Jagielski public:
ONoScheduleThread()440*b1cdbd2cSJim Jagielski     ONoScheduleThread()
441*b1cdbd2cSJim Jagielski         {
442*b1cdbd2cSJim Jagielski                 t_print("new thread id %d!\n", getIdentifier());
443*b1cdbd2cSJim Jagielski         }
~ONoScheduleThread()444*b1cdbd2cSJim Jagielski     ~ONoScheduleThread()
445*b1cdbd2cSJim Jagielski         {
446*b1cdbd2cSJim Jagielski             if (isRunning())
447*b1cdbd2cSJim Jagielski             {
448*b1cdbd2cSJim Jagielski                 t_print("error: not terminated.\n");
449*b1cdbd2cSJim Jagielski             }
450*b1cdbd2cSJim Jagielski         }
451*b1cdbd2cSJim Jagielski 
452*b1cdbd2cSJim Jagielski };
453*b1cdbd2cSJim Jagielski 
454*b1cdbd2cSJim Jagielski /**
455*b1cdbd2cSJim Jagielski */
456*b1cdbd2cSJim Jagielski class OAddThread : public Thread
457*b1cdbd2cSJim Jagielski {
458*b1cdbd2cSJim Jagielski     ThreadSafeValue<sal_Int32> m_aFlag;
459*b1cdbd2cSJim Jagielski public:
460*b1cdbd2cSJim Jagielski     //oslThreadIdentifier m_id, m_CurId;
OAddThread()461*b1cdbd2cSJim Jagielski     OAddThread(){}
getValue()462*b1cdbd2cSJim Jagielski     sal_Int32 getValue() { return m_aFlag.getValue(); }
463*b1cdbd2cSJim Jagielski 
suspend()464*b1cdbd2cSJim Jagielski     virtual void SAL_CALL suspend()
465*b1cdbd2cSJim Jagielski         {
466*b1cdbd2cSJim Jagielski             m_aFlag.acquire();
467*b1cdbd2cSJim Jagielski             ::osl::Thread::suspend();
468*b1cdbd2cSJim Jagielski             m_aFlag.release();
469*b1cdbd2cSJim Jagielski         }
470*b1cdbd2cSJim Jagielski protected:
run()471*b1cdbd2cSJim Jagielski     void SAL_CALL run()
472*b1cdbd2cSJim Jagielski         {
473*b1cdbd2cSJim Jagielski             //if the thread should terminate, schedule return false
474*b1cdbd2cSJim Jagielski             while (schedule() == sal_True)
475*b1cdbd2cSJim Jagielski             {
476*b1cdbd2cSJim Jagielski                 m_aFlag.addValue(1);
477*b1cdbd2cSJim Jagielski             }
478*b1cdbd2cSJim Jagielski         }
onTerminated()479*b1cdbd2cSJim Jagielski     void SAL_CALL onTerminated()
480*b1cdbd2cSJim Jagielski         {
481*b1cdbd2cSJim Jagielski             // t_print("normally terminate this thread %d!\n", getIdentifier());
482*b1cdbd2cSJim Jagielski         }
483*b1cdbd2cSJim Jagielski public:
484*b1cdbd2cSJim Jagielski 
~OAddThread()485*b1cdbd2cSJim Jagielski     ~OAddThread()
486*b1cdbd2cSJim Jagielski         {
487*b1cdbd2cSJim Jagielski             if (isRunning())
488*b1cdbd2cSJim Jagielski             {
489*b1cdbd2cSJim Jagielski                 // t_print("error: not terminated.\n");
490*b1cdbd2cSJim Jagielski             }
491*b1cdbd2cSJim Jagielski         }
492*b1cdbd2cSJim Jagielski 
493*b1cdbd2cSJim Jagielski };
494*b1cdbd2cSJim Jagielski 
495*b1cdbd2cSJim Jagielski namespace osl_Thread
496*b1cdbd2cSJim Jagielski {
497*b1cdbd2cSJim Jagielski 
resumeAndWaitThread(Thread * _pThread)498*b1cdbd2cSJim Jagielski     void resumeAndWaitThread(Thread* _pThread)
499*b1cdbd2cSJim Jagielski     {
500*b1cdbd2cSJim Jagielski         // This functions starts a thread, wait a second and suspends the thread
501*b1cdbd2cSJim Jagielski         // Due to the fact, that a suspend and never run thread never really exists.
502*b1cdbd2cSJim Jagielski 
503*b1cdbd2cSJim Jagielski         // Note: on UNX, after createSuspended, and then terminate the thread, it performs well;
504*b1cdbd2cSJim Jagielski         // while on Windows, after createSuspended, the thread can not terminate, wait endlessly,
505*b1cdbd2cSJim Jagielski         // so here call resume at first, then call terminate.
506*b1cdbd2cSJim Jagielski #ifdef WNT
507*b1cdbd2cSJim Jagielski         t_print("resumeAndWaitThread\n");
508*b1cdbd2cSJim Jagielski         _pThread->resume();
509*b1cdbd2cSJim Jagielski         ThreadHelper::thread_sleep_tenth_sec(1);
510*b1cdbd2cSJim Jagielski #else
511*b1cdbd2cSJim Jagielski         _pThread->resume();
512*b1cdbd2cSJim Jagielski #endif
513*b1cdbd2cSJim Jagielski         // ThreadHelper::thread_sleep_tenth_sec(1);
514*b1cdbd2cSJim Jagielski         // _pThread->suspend();
515*b1cdbd2cSJim Jagielski         // ThreadHelper::thread_sleep_tenth_sec(1);
516*b1cdbd2cSJim Jagielski     }
517*b1cdbd2cSJim Jagielski 
518*b1cdbd2cSJim Jagielski     // kill a running thread and join it, if it has terminated, do nothing
termAndJoinThread(Thread * _pThread)519*b1cdbd2cSJim Jagielski     void termAndJoinThread(Thread* _pThread)
520*b1cdbd2cSJim Jagielski     {
521*b1cdbd2cSJim Jagielski         _pThread->terminate();
522*b1cdbd2cSJim Jagielski 
523*b1cdbd2cSJim Jagielski // LLA: Windows feature???, a suspended thread can not terminated, so we have to weak it up
524*b1cdbd2cSJim Jagielski #ifdef WNT
525*b1cdbd2cSJim Jagielski         _pThread->resume();
526*b1cdbd2cSJim Jagielski         ThreadHelper::thread_sleep_tenth_sec(1);
527*b1cdbd2cSJim Jagielski #endif
528*b1cdbd2cSJim Jagielski         t_print("#wait for join.\n");
529*b1cdbd2cSJim Jagielski         _pThread->join();
530*b1cdbd2cSJim Jagielski     }
531*b1cdbd2cSJim Jagielski /** Test of the osl::Thread::create method
532*b1cdbd2cSJim Jagielski  */
533*b1cdbd2cSJim Jagielski 
534*b1cdbd2cSJim Jagielski     class create : public CppUnit::TestFixture
535*b1cdbd2cSJim Jagielski     {
536*b1cdbd2cSJim Jagielski     public:
537*b1cdbd2cSJim Jagielski 
538*b1cdbd2cSJim Jagielski         // initialise your test code values here.
setUp()539*b1cdbd2cSJim Jagielski         void setUp()
540*b1cdbd2cSJim Jagielski             {
541*b1cdbd2cSJim Jagielski             }
542*b1cdbd2cSJim Jagielski 
tearDown()543*b1cdbd2cSJim Jagielski         void tearDown()
544*b1cdbd2cSJim Jagielski             {
545*b1cdbd2cSJim Jagielski             }
546*b1cdbd2cSJim Jagielski 
547*b1cdbd2cSJim Jagielski         /** Simple create a thread.
548*b1cdbd2cSJim Jagielski 
549*b1cdbd2cSJim Jagielski             Create a simple thread, it just does add 1 to value(which initialized 0),
550*b1cdbd2cSJim Jagielski             if the thread run, the value should be 1.
551*b1cdbd2cSJim Jagielski         */
create_001()552*b1cdbd2cSJim Jagielski         void create_001()
553*b1cdbd2cSJim Jagielski             {
554*b1cdbd2cSJim Jagielski                 myThread* newthread = new myThread();
555*b1cdbd2cSJim Jagielski                 sal_Bool bRes = newthread->create();
556*b1cdbd2cSJim Jagielski                 CPPUNIT_ASSERT_MESSAGE("Can not creates a new thread!\n", bRes == sal_True );
557*b1cdbd2cSJim Jagielski 
558*b1cdbd2cSJim Jagielski                 ThreadHelper::thread_sleep_tenth_sec(1);        // wait short
559*b1cdbd2cSJim Jagielski                 sal_Bool isRunning = newthread->isRunning();    // check if thread is running
560*b1cdbd2cSJim Jagielski                 /// wait for the new thread to assure it has run
561*b1cdbd2cSJim Jagielski                 ThreadHelper::thread_sleep_tenth_sec(3);
562*b1cdbd2cSJim Jagielski                 sal_Int32 nValue = newthread->getValue();
563*b1cdbd2cSJim Jagielski                 /// to assure the new thread has terminated
564*b1cdbd2cSJim Jagielski                 termAndJoinThread(newthread);
565*b1cdbd2cSJim Jagielski                 delete newthread;
566*b1cdbd2cSJim Jagielski 
567*b1cdbd2cSJim Jagielski                 t_print("   nValue = %d\n", nValue);
568*b1cdbd2cSJim Jagielski                 t_print("isRunning = %d\n", isRunning);
569*b1cdbd2cSJim Jagielski 
570*b1cdbd2cSJim Jagielski                 CPPUNIT_ASSERT_MESSAGE(
571*b1cdbd2cSJim Jagielski                     "Creates a new thread",
572*b1cdbd2cSJim Jagielski                     nValue >= 1 && isRunning == sal_True
573*b1cdbd2cSJim Jagielski                     );
574*b1cdbd2cSJim Jagielski 
575*b1cdbd2cSJim Jagielski             }
576*b1cdbd2cSJim Jagielski 
577*b1cdbd2cSJim Jagielski         /** only one running thread per instance, return false if create secondly
578*b1cdbd2cSJim Jagielski          */
create_002()579*b1cdbd2cSJim Jagielski         void create_002()
580*b1cdbd2cSJim Jagielski             {
581*b1cdbd2cSJim Jagielski                 myThread* newthread = new myThread();
582*b1cdbd2cSJim Jagielski                 sal_Bool res1 = newthread->create();
583*b1cdbd2cSJim Jagielski                 sal_Bool res2 = newthread->create();
584*b1cdbd2cSJim Jagielski                 t_print("In non pro, an assertion should occured. This behaviour is right.\n");
585*b1cdbd2cSJim Jagielski                 termAndJoinThread(newthread);
586*b1cdbd2cSJim Jagielski                 delete newthread;
587*b1cdbd2cSJim Jagielski 
588*b1cdbd2cSJim Jagielski                 CPPUNIT_ASSERT_MESSAGE(
589*b1cdbd2cSJim Jagielski                     "Creates a new thread: can not create two threads per instance",
590*b1cdbd2cSJim Jagielski                     res1 && !res2
591*b1cdbd2cSJim Jagielski                     );
592*b1cdbd2cSJim Jagielski 
593*b1cdbd2cSJim Jagielski             }
594*b1cdbd2cSJim Jagielski 
595*b1cdbd2cSJim Jagielski         CPPUNIT_TEST_SUITE(create);
596*b1cdbd2cSJim Jagielski         CPPUNIT_TEST(create_001);
597*b1cdbd2cSJim Jagielski         CPPUNIT_TEST(create_002);
598*b1cdbd2cSJim Jagielski         CPPUNIT_TEST_SUITE_END();
599*b1cdbd2cSJim Jagielski     }; // class create
600*b1cdbd2cSJim Jagielski 
601*b1cdbd2cSJim Jagielski 
602*b1cdbd2cSJim Jagielski 
603*b1cdbd2cSJim Jagielski     /** Test of the osl::Thread::createSuspended method
604*b1cdbd2cSJim Jagielski     */
605*b1cdbd2cSJim Jagielski     class createSuspended : public CppUnit::TestFixture
606*b1cdbd2cSJim Jagielski     {
607*b1cdbd2cSJim Jagielski     public:
608*b1cdbd2cSJim Jagielski         // initialise your test code values here.
setUp()609*b1cdbd2cSJim Jagielski         void setUp()
610*b1cdbd2cSJim Jagielski             {
611*b1cdbd2cSJim Jagielski             }
612*b1cdbd2cSJim Jagielski 
tearDown()613*b1cdbd2cSJim Jagielski         void tearDown()
614*b1cdbd2cSJim Jagielski             {
615*b1cdbd2cSJim Jagielski             }
616*b1cdbd2cSJim Jagielski 
617*b1cdbd2cSJim Jagielski         /** Create a suspended thread, use the same class as create_001
618*b1cdbd2cSJim Jagielski 
619*b1cdbd2cSJim Jagielski             after create, wait enough time, check the value, if it's still the initial value, pass
620*b1cdbd2cSJim Jagielski         */
createSuspended_001()621*b1cdbd2cSJim Jagielski         void createSuspended_001()
622*b1cdbd2cSJim Jagielski             {
623*b1cdbd2cSJim Jagielski                 myThread* newthread = new myThread();
624*b1cdbd2cSJim Jagielski                 sal_Bool bRes = newthread->createSuspended();
625*b1cdbd2cSJim Jagielski                 CPPUNIT_ASSERT_MESSAGE("Can not creates a new thread!", bRes == sal_True );
626*b1cdbd2cSJim Jagielski 
627*b1cdbd2cSJim Jagielski                 ThreadHelper::thread_sleep_tenth_sec(1);
628*b1cdbd2cSJim Jagielski                 sal_Bool isRunning = newthread->isRunning();
629*b1cdbd2cSJim Jagielski                 ThreadHelper::thread_sleep_tenth_sec(3);
630*b1cdbd2cSJim Jagielski                 sal_Int32 nValue = newthread->getValue();
631*b1cdbd2cSJim Jagielski 
632*b1cdbd2cSJim Jagielski                 resumeAndWaitThread(newthread);
633*b1cdbd2cSJim Jagielski 
634*b1cdbd2cSJim Jagielski                 termAndJoinThread(newthread);
635*b1cdbd2cSJim Jagielski                 delete newthread;
636*b1cdbd2cSJim Jagielski 
637*b1cdbd2cSJim Jagielski                 CPPUNIT_ASSERT_MESSAGE(
638*b1cdbd2cSJim Jagielski                     "Creates a new suspended thread",
639*b1cdbd2cSJim Jagielski                     nValue == 0 && isRunning
640*b1cdbd2cSJim Jagielski                     );
641*b1cdbd2cSJim Jagielski             }
642*b1cdbd2cSJim Jagielski 
createSuspended_002()643*b1cdbd2cSJim Jagielski         void createSuspended_002()
644*b1cdbd2cSJim Jagielski             {
645*b1cdbd2cSJim Jagielski                 myThread* newthread = new myThread();
646*b1cdbd2cSJim Jagielski                 sal_Bool res1 = newthread->createSuspended();
647*b1cdbd2cSJim Jagielski                 sal_Bool res2 = newthread->createSuspended();
648*b1cdbd2cSJim Jagielski 
649*b1cdbd2cSJim Jagielski                 resumeAndWaitThread(newthread);
650*b1cdbd2cSJim Jagielski 
651*b1cdbd2cSJim Jagielski                 termAndJoinThread(newthread);
652*b1cdbd2cSJim Jagielski 
653*b1cdbd2cSJim Jagielski                 delete newthread;
654*b1cdbd2cSJim Jagielski 
655*b1cdbd2cSJim Jagielski                 CPPUNIT_ASSERT_MESSAGE(
656*b1cdbd2cSJim Jagielski                     "Creates a new thread: can not create two threads per instance",
657*b1cdbd2cSJim Jagielski                     res1 && !res2
658*b1cdbd2cSJim Jagielski                     );
659*b1cdbd2cSJim Jagielski             }
660*b1cdbd2cSJim Jagielski 
661*b1cdbd2cSJim Jagielski         CPPUNIT_TEST_SUITE(createSuspended);
662*b1cdbd2cSJim Jagielski         CPPUNIT_TEST(createSuspended_001);
663*b1cdbd2cSJim Jagielski         // LLA: Deadlocked!!!
664*b1cdbd2cSJim Jagielski         CPPUNIT_TEST(createSuspended_002);
665*b1cdbd2cSJim Jagielski         CPPUNIT_TEST_SUITE_END();
666*b1cdbd2cSJim Jagielski     }; // class createSuspended
667*b1cdbd2cSJim Jagielski 
668*b1cdbd2cSJim Jagielski     /** when the count value equal to or more than 3, suspend the thread.
669*b1cdbd2cSJim Jagielski     */
suspendCountThread(OCountThread * _pCountThread)670*b1cdbd2cSJim Jagielski     void suspendCountThread(OCountThread* _pCountThread)
671*b1cdbd2cSJim Jagielski     {
672*b1cdbd2cSJim Jagielski         sal_Int32 nValue = 0;
673*b1cdbd2cSJim Jagielski         while (1)
674*b1cdbd2cSJim Jagielski         {
675*b1cdbd2cSJim Jagielski             nValue = _pCountThread->getValue();
676*b1cdbd2cSJim Jagielski             if (nValue >= 3)
677*b1cdbd2cSJim Jagielski             {
678*b1cdbd2cSJim Jagielski                 _pCountThread->suspend();
679*b1cdbd2cSJim Jagielski                 break;
680*b1cdbd2cSJim Jagielski             }
681*b1cdbd2cSJim Jagielski         }
682*b1cdbd2cSJim Jagielski     }
683*b1cdbd2cSJim Jagielski 
684*b1cdbd2cSJim Jagielski     /** Test of the osl::Thread::suspend method
685*b1cdbd2cSJim Jagielski     */
686*b1cdbd2cSJim Jagielski     class suspend : public CppUnit::TestFixture
687*b1cdbd2cSJim Jagielski     {
688*b1cdbd2cSJim Jagielski     public:
689*b1cdbd2cSJim Jagielski         // initialise your test code values here.
setUp()690*b1cdbd2cSJim Jagielski         void setUp()
691*b1cdbd2cSJim Jagielski             {
692*b1cdbd2cSJim Jagielski             }
693*b1cdbd2cSJim Jagielski 
tearDown()694*b1cdbd2cSJim Jagielski         void tearDown()
695*b1cdbd2cSJim Jagielski             {
696*b1cdbd2cSJim Jagielski             }
697*b1cdbd2cSJim Jagielski 
698*b1cdbd2cSJim Jagielski         /** Use a thread which has a flag added 1 every second
699*b1cdbd2cSJim Jagielski 
700*b1cdbd2cSJim Jagielski             ALGORITHM:
701*b1cdbd2cSJim Jagielski             create the thread, after running special time, record value of flag, then suspend it,
702*b1cdbd2cSJim Jagielski             wait a long time, check the flag, if it remains unchanged during suspending
703*b1cdbd2cSJim Jagielski         */
suspend_001()704*b1cdbd2cSJim Jagielski         void suspend_001()
705*b1cdbd2cSJim Jagielski             {
706*b1cdbd2cSJim Jagielski                 OCountThread* aCountThread = new OCountThread();
707*b1cdbd2cSJim Jagielski                 sal_Bool bRes = aCountThread->create();
708*b1cdbd2cSJim Jagielski                 CPPUNIT_ASSERT_MESSAGE ( "Can't start thread!", bRes == sal_True );
709*b1cdbd2cSJim Jagielski                 // the thread run for some seconds, but not terminate
710*b1cdbd2cSJim Jagielski                 suspendCountThread( aCountThread );
711*b1cdbd2cSJim Jagielski 
712*b1cdbd2cSJim Jagielski                 // the value just after calling suspend
713*b1cdbd2cSJim Jagielski                 sal_Int32 nValue = aCountThread->getValue();       // (2)
714*b1cdbd2cSJim Jagielski 
715*b1cdbd2cSJim Jagielski                 ThreadHelper::thread_sleep_tenth_sec(3);
716*b1cdbd2cSJim Jagielski 
717*b1cdbd2cSJim Jagielski                 // the value after waiting 3 seconds
718*b1cdbd2cSJim Jagielski                 sal_Int32 nLaterValue = aCountThread->getValue();    // (3)
719*b1cdbd2cSJim Jagielski 
720*b1cdbd2cSJim Jagielski                 resumeAndWaitThread(aCountThread);
721*b1cdbd2cSJim Jagielski                 termAndJoinThread(aCountThread);
722*b1cdbd2cSJim Jagielski                 delete aCountThread;
723*b1cdbd2cSJim Jagielski 
724*b1cdbd2cSJim Jagielski                 CPPUNIT_ASSERT_MESSAGE(
725*b1cdbd2cSJim Jagielski                     "Suspend the thread",
726*b1cdbd2cSJim Jagielski                     bRes == sal_True && nValue == nLaterValue
727*b1cdbd2cSJim Jagielski                     );
728*b1cdbd2cSJim Jagielski 
729*b1cdbd2cSJim Jagielski             }
730*b1cdbd2cSJim Jagielski         /** suspend a thread in it's worker-function, the ALGORITHM is same as suspend_001
731*b1cdbd2cSJim Jagielski              reason of deadlocked I think: no schedule can schedule other threads to go on excuting
732*b1cdbd2cSJim Jagielski          */
suspend_002()733*b1cdbd2cSJim Jagielski         void suspend_002()
734*b1cdbd2cSJim Jagielski             {
735*b1cdbd2cSJim Jagielski                 OSuspendThread* aThread = new OSuspendThread();
736*b1cdbd2cSJim Jagielski                 sal_Bool bRes = aThread->create();
737*b1cdbd2cSJim Jagielski                 CPPUNIT_ASSERT_MESSAGE ( "Can't start thread!", bRes == sal_True );
738*b1cdbd2cSJim Jagielski                 // first the thread run for some seconds, but not terminate
739*b1cdbd2cSJim Jagielski                 sal_Int32 nValue = 0;
740*b1cdbd2cSJim Jagielski                 //while (1)
741*b1cdbd2cSJim Jagielski                 //{
742*b1cdbd2cSJim Jagielski                 ThreadHelper::thread_sleep_tenth_sec(3);
743*b1cdbd2cSJim Jagielski                 nValue = aThread->getValue();    // (1)
744*b1cdbd2cSJim Jagielski                 t_print(" getValue is %d !", nValue );
745*b1cdbd2cSJim Jagielski                 if (nValue >= 2)
746*b1cdbd2cSJim Jagielski                 {
747*b1cdbd2cSJim Jagielski                         aThread->setSuspend();
748*b1cdbd2cSJim Jagielski                         //break;
749*b1cdbd2cSJim Jagielski                 }
750*b1cdbd2cSJim Jagielski                 //}
751*b1cdbd2cSJim Jagielski                 t_print(" after while!");
752*b1cdbd2cSJim Jagielski                 // the value just after calling suspend
753*b1cdbd2cSJim Jagielski                 nValue = aThread->getValue();       // (2)
754*b1cdbd2cSJim Jagielski 
755*b1cdbd2cSJim Jagielski                 ThreadHelper::thread_sleep_tenth_sec(3);
756*b1cdbd2cSJim Jagielski                 t_print(" after sleep!");
757*b1cdbd2cSJim Jagielski                 // the value after waiting 3 seconds
758*b1cdbd2cSJim Jagielski                 sal_Int32 nLaterValue = aThread->getValue();        // (3)
759*b1cdbd2cSJim Jagielski 
760*b1cdbd2cSJim Jagielski                 //resumeAndWaitThread(aThread);
761*b1cdbd2cSJim Jagielski                 aThread->resume();
762*b1cdbd2cSJim Jagielski                 termAndJoinThread(aThread);
763*b1cdbd2cSJim Jagielski                 delete aThread;
764*b1cdbd2cSJim Jagielski 
765*b1cdbd2cSJim Jagielski                 CPPUNIT_ASSERT_MESSAGE(
766*b1cdbd2cSJim Jagielski                     "Suspend the thread",
767*b1cdbd2cSJim Jagielski                     bRes == sal_True && nValue == nLaterValue
768*b1cdbd2cSJim Jagielski                     );
769*b1cdbd2cSJim Jagielski             }
770*b1cdbd2cSJim Jagielski 
771*b1cdbd2cSJim Jagielski         CPPUNIT_TEST_SUITE(suspend);
772*b1cdbd2cSJim Jagielski         CPPUNIT_TEST(suspend_001);
773*b1cdbd2cSJim Jagielski         // LLA: Deadlocked!!!
774*b1cdbd2cSJim Jagielski         // CPPUNIT_TEST(createSuspended_002);
775*b1cdbd2cSJim Jagielski         CPPUNIT_TEST_SUITE_END();
776*b1cdbd2cSJim Jagielski     }; // class suspend
777*b1cdbd2cSJim Jagielski 
778*b1cdbd2cSJim Jagielski     /** Test of the osl::Thread::resume method
779*b1cdbd2cSJim Jagielski     */
780*b1cdbd2cSJim Jagielski     class resume : public CppUnit::TestFixture
781*b1cdbd2cSJim Jagielski     {
782*b1cdbd2cSJim Jagielski     public:
783*b1cdbd2cSJim Jagielski         // initialise your test code values here.
setUp()784*b1cdbd2cSJim Jagielski         void setUp()
785*b1cdbd2cSJim Jagielski             {
786*b1cdbd2cSJim Jagielski             }
787*b1cdbd2cSJim Jagielski 
tearDown()788*b1cdbd2cSJim Jagielski         void tearDown()
789*b1cdbd2cSJim Jagielski             {
790*b1cdbd2cSJim Jagielski             }
791*b1cdbd2cSJim Jagielski 
792*b1cdbd2cSJim Jagielski         /** check if the thread run samely as usual after suspend and resume
793*b1cdbd2cSJim Jagielski 
794*b1cdbd2cSJim Jagielski             ALGORITHM:
795*b1cdbd2cSJim Jagielski             compare the values before and after suspend, they should be same,
796*b1cdbd2cSJim Jagielski             then compare values before and after resume, the difference should be same as the sleep seconds number
797*b1cdbd2cSJim Jagielski         */
resume_001()798*b1cdbd2cSJim Jagielski         void resume_001()
799*b1cdbd2cSJim Jagielski             {
800*b1cdbd2cSJim Jagielski                 OCountThread* pCountThread = new OCountThread();
801*b1cdbd2cSJim Jagielski                 sal_Bool bRes = pCountThread->create();
802*b1cdbd2cSJim Jagielski                 CPPUNIT_ASSERT_MESSAGE ( "Can't start thread!", bRes == sal_True );
803*b1cdbd2cSJim Jagielski 
804*b1cdbd2cSJim Jagielski                 suspendCountThread(pCountThread);
805*b1cdbd2cSJim Jagielski 
806*b1cdbd2cSJim Jagielski                 sal_Int32 nSuspendValue = pCountThread->getValue();  // (2)
807*b1cdbd2cSJim Jagielski                 // suspend for 3 seconds
808*b1cdbd2cSJim Jagielski                 ThreadHelper::thread_sleep_tenth_sec(3);
809*b1cdbd2cSJim Jagielski                 pCountThread->resume();
810*b1cdbd2cSJim Jagielski 
811*b1cdbd2cSJim Jagielski                 ThreadHelper::thread_sleep_tenth_sec(3);
812*b1cdbd2cSJim Jagielski                 sal_Int32 nResumeValue = pCountThread->getValue();
813*b1cdbd2cSJim Jagielski 
814*b1cdbd2cSJim Jagielski                 ThreadHelper::thread_sleep_tenth_sec(3);
815*b1cdbd2cSJim Jagielski                 sal_Int32 nLaterValue = pCountThread->getValue();
816*b1cdbd2cSJim Jagielski 
817*b1cdbd2cSJim Jagielski                 termAndJoinThread(pCountThread);
818*b1cdbd2cSJim Jagielski                 delete pCountThread;
819*b1cdbd2cSJim Jagielski 
820*b1cdbd2cSJim Jagielski                 t_print("SuspendValue: %d\n", nSuspendValue);
821*b1cdbd2cSJim Jagielski                 t_print("ResumeValue:  %d\n", nResumeValue);
822*b1cdbd2cSJim Jagielski                 t_print("LaterValue:   %d\n", nLaterValue);
823*b1cdbd2cSJim Jagielski 
824*b1cdbd2cSJim Jagielski                 /* LLA: this assumption is no longer relevant: nResumeValue ==  nSuspendValue && */
825*b1cdbd2cSJim Jagielski                 CPPUNIT_ASSERT_MESSAGE(
826*b1cdbd2cSJim Jagielski                     "Suspend then resume the thread",
827*b1cdbd2cSJim Jagielski                     nLaterValue >= 9 &&
828*b1cdbd2cSJim Jagielski                     nResumeValue > nSuspendValue &&
829*b1cdbd2cSJim Jagielski                     nLaterValue > nResumeValue
830*b1cdbd2cSJim Jagielski                     );
831*b1cdbd2cSJim Jagielski 
832*b1cdbd2cSJim Jagielski             }
833*b1cdbd2cSJim Jagielski 
834*b1cdbd2cSJim Jagielski         /** Create a suspended thread then resume, check if the thread has run
835*b1cdbd2cSJim Jagielski          */
resume_002()836*b1cdbd2cSJim Jagielski         void resume_002()
837*b1cdbd2cSJim Jagielski             {
838*b1cdbd2cSJim Jagielski                 myThread* newthread = new myThread();
839*b1cdbd2cSJim Jagielski                 sal_Bool bRes = newthread->createSuspended();
840*b1cdbd2cSJim Jagielski                 CPPUNIT_ASSERT_MESSAGE ( "Can't create thread!", bRes == sal_True );
841*b1cdbd2cSJim Jagielski 
842*b1cdbd2cSJim Jagielski                 newthread->resume();
843*b1cdbd2cSJim Jagielski                 ThreadHelper::thread_sleep_tenth_sec(2);
844*b1cdbd2cSJim Jagielski                 sal_Int32 nValue = newthread->getValue();
845*b1cdbd2cSJim Jagielski 
846*b1cdbd2cSJim Jagielski                 termAndJoinThread(newthread);
847*b1cdbd2cSJim Jagielski                 delete newthread;
848*b1cdbd2cSJim Jagielski 
849*b1cdbd2cSJim Jagielski                 t_print("   nValue = %d\n", nValue);
850*b1cdbd2cSJim Jagielski 
851*b1cdbd2cSJim Jagielski                 CPPUNIT_ASSERT_MESSAGE(
852*b1cdbd2cSJim Jagielski                     "Creates a suspended thread, then resume",
853*b1cdbd2cSJim Jagielski                     nValue >= 1
854*b1cdbd2cSJim Jagielski                     );
855*b1cdbd2cSJim Jagielski             }
856*b1cdbd2cSJim Jagielski 
857*b1cdbd2cSJim Jagielski         CPPUNIT_TEST_SUITE(resume);
858*b1cdbd2cSJim Jagielski         CPPUNIT_TEST(resume_001);
859*b1cdbd2cSJim Jagielski         CPPUNIT_TEST(resume_002);
860*b1cdbd2cSJim Jagielski         CPPUNIT_TEST_SUITE_END();
861*b1cdbd2cSJim Jagielski     }; // class resume
862*b1cdbd2cSJim Jagielski 
863*b1cdbd2cSJim Jagielski     /** Test of the osl::Thread::terminate method
864*b1cdbd2cSJim Jagielski     */
865*b1cdbd2cSJim Jagielski     class terminate : public CppUnit::TestFixture
866*b1cdbd2cSJim Jagielski     {
867*b1cdbd2cSJim Jagielski     public:
868*b1cdbd2cSJim Jagielski         // initialise your test code values here.
setUp()869*b1cdbd2cSJim Jagielski         void setUp()
870*b1cdbd2cSJim Jagielski             {
871*b1cdbd2cSJim Jagielski             }
872*b1cdbd2cSJim Jagielski 
tearDown()873*b1cdbd2cSJim Jagielski         void tearDown()
874*b1cdbd2cSJim Jagielski             {
875*b1cdbd2cSJim Jagielski             }
876*b1cdbd2cSJim Jagielski 
877*b1cdbd2cSJim Jagielski         /** Check after call terminate if the running thread running go on executing
878*b1cdbd2cSJim Jagielski 
879*b1cdbd2cSJim Jagielski             ALGORITHM:
880*b1cdbd2cSJim Jagielski             before and after call terminate, the values should be the same
881*b1cdbd2cSJim Jagielski         */
terminate_001()882*b1cdbd2cSJim Jagielski         void terminate_001()
883*b1cdbd2cSJim Jagielski             {
884*b1cdbd2cSJim Jagielski                 OCountThread* aCountThread = new OCountThread();
885*b1cdbd2cSJim Jagielski                 sal_Bool bRes = aCountThread->create();
886*b1cdbd2cSJim Jagielski                 CPPUNIT_ASSERT_MESSAGE ( "Can't start thread!", bRes == sal_True );
887*b1cdbd2cSJim Jagielski 
888*b1cdbd2cSJim Jagielski                 ThreadHelper::thread_sleep_tenth_sec(2);
889*b1cdbd2cSJim Jagielski                 sal_Int32 nValue = aCountThread->getValue();
890*b1cdbd2cSJim Jagielski                 aCountThread->terminate();
891*b1cdbd2cSJim Jagielski                 ThreadHelper::thread_sleep_tenth_sec(2);
892*b1cdbd2cSJim Jagielski                 sal_Int32 nLaterValue = aCountThread->getValue();
893*b1cdbd2cSJim Jagielski 
894*b1cdbd2cSJim Jagielski                 // isRunning should be false after terminate
895*b1cdbd2cSJim Jagielski                 sal_Bool isRunning = aCountThread->isRunning();
896*b1cdbd2cSJim Jagielski                 aCountThread->join();
897*b1cdbd2cSJim Jagielski                 delete aCountThread;
898*b1cdbd2cSJim Jagielski 
899*b1cdbd2cSJim Jagielski                 t_print("     nValue = %d\n", nValue);
900*b1cdbd2cSJim Jagielski                 t_print("nLaterValue = %d\n", nLaterValue);
901*b1cdbd2cSJim Jagielski 
902*b1cdbd2cSJim Jagielski                 CPPUNIT_ASSERT_MESSAGE(
903*b1cdbd2cSJim Jagielski                     "Terminate the thread",
904*b1cdbd2cSJim Jagielski                     isRunning == sal_False && nLaterValue >= nValue
905*b1cdbd2cSJim Jagielski                     );
906*b1cdbd2cSJim Jagielski             }
907*b1cdbd2cSJim Jagielski         /** Check if a suspended thread will terminate after call terminate, different on w32 and on UNX
908*b1cdbd2cSJim Jagielski          */
terminate_002()909*b1cdbd2cSJim Jagielski         void terminate_002()
910*b1cdbd2cSJim Jagielski             {
911*b1cdbd2cSJim Jagielski                 OCountThread* aCountThread = new OCountThread();
912*b1cdbd2cSJim Jagielski                 sal_Bool bRes = aCountThread->create();
913*b1cdbd2cSJim Jagielski                 CPPUNIT_ASSERT_MESSAGE ( "Can't start thread!", bRes == sal_True );
914*b1cdbd2cSJim Jagielski 
915*b1cdbd2cSJim Jagielski                 ThreadHelper::thread_sleep_tenth_sec(1);
916*b1cdbd2cSJim Jagielski                 suspendCountThread(aCountThread);
917*b1cdbd2cSJim Jagielski                 sal_Int32 nValue = aCountThread->getValue();
918*b1cdbd2cSJim Jagielski 
919*b1cdbd2cSJim Jagielski                 // seems a suspended thread can not be terminated on W32, while on Solaris can
920*b1cdbd2cSJim Jagielski                 resumeAndWaitThread(aCountThread);
921*b1cdbd2cSJim Jagielski 
922*b1cdbd2cSJim Jagielski                 ThreadHelper::thread_sleep_tenth_sec(2);
923*b1cdbd2cSJim Jagielski 
924*b1cdbd2cSJim Jagielski                 termAndJoinThread(aCountThread);
925*b1cdbd2cSJim Jagielski                 sal_Int32 nLaterValue = aCountThread->getValue();
926*b1cdbd2cSJim Jagielski                 delete aCountThread;
927*b1cdbd2cSJim Jagielski 
928*b1cdbd2cSJim Jagielski                 t_print("     nValue = %d\n", nValue);
929*b1cdbd2cSJim Jagielski                 t_print("nLaterValue = %d\n", nLaterValue);
930*b1cdbd2cSJim Jagielski 
931*b1cdbd2cSJim Jagielski                 CPPUNIT_ASSERT_MESSAGE(
932*b1cdbd2cSJim Jagielski                     "Suspend then resume the thread",
933*b1cdbd2cSJim Jagielski                     nLaterValue > nValue );
934*b1cdbd2cSJim Jagielski             }
935*b1cdbd2cSJim Jagielski 
936*b1cdbd2cSJim Jagielski         CPPUNIT_TEST_SUITE(terminate);
937*b1cdbd2cSJim Jagielski         CPPUNIT_TEST(terminate_001);
938*b1cdbd2cSJim Jagielski         CPPUNIT_TEST(terminate_002);
939*b1cdbd2cSJim Jagielski         CPPUNIT_TEST_SUITE_END();
940*b1cdbd2cSJim Jagielski     }; // class terminate
941*b1cdbd2cSJim Jagielski 
942*b1cdbd2cSJim Jagielski     /** Test of the osl::Thread::join method
943*b1cdbd2cSJim Jagielski     */
944*b1cdbd2cSJim Jagielski     class join : public CppUnit::TestFixture
945*b1cdbd2cSJim Jagielski     {
946*b1cdbd2cSJim Jagielski     public:
947*b1cdbd2cSJim Jagielski         // initialise your test code values here.
setUp()948*b1cdbd2cSJim Jagielski         void setUp()
949*b1cdbd2cSJim Jagielski             {
950*b1cdbd2cSJim Jagielski             }
951*b1cdbd2cSJim Jagielski 
tearDown()952*b1cdbd2cSJim Jagielski         void tearDown()
953*b1cdbd2cSJim Jagielski             {
954*b1cdbd2cSJim Jagielski             }
955*b1cdbd2cSJim Jagielski 
956*b1cdbd2cSJim Jagielski         /** Check after call terminate if the thread running function will not go on executing
957*b1cdbd2cSJim Jagielski 
958*b1cdbd2cSJim Jagielski             the next statement after join will not exec before the thread terminate
959*b1cdbd2cSJim Jagielski             ALGORITHM:
960*b1cdbd2cSJim Jagielski             recode system time at the beginning of the thread run, call join, then record system time again,
961*b1cdbd2cSJim Jagielski             the difference of the two time should be equal or more than 20 seconds, the CountThead normally terminate
962*b1cdbd2cSJim Jagielski         */
join_001()963*b1cdbd2cSJim Jagielski         void join_001()
964*b1cdbd2cSJim Jagielski             {
965*b1cdbd2cSJim Jagielski                 OCountThread *aCountThread = new OCountThread();
966*b1cdbd2cSJim Jagielski                 sal_Bool bRes = aCountThread->create();
967*b1cdbd2cSJim Jagielski                 CPPUNIT_ASSERT_MESSAGE ( "Can't start thread!", bRes == sal_True );
968*b1cdbd2cSJim Jagielski 
969*b1cdbd2cSJim Jagielski                 StopWatch aStopWatch;
970*b1cdbd2cSJim Jagielski                 aStopWatch.start();
971*b1cdbd2cSJim Jagielski                 // TimeValue aTimeVal_befor;
972*b1cdbd2cSJim Jagielski                 // osl_getSystemTime( &aTimeVal_befor );
973*b1cdbd2cSJim Jagielski                 //t_print("#join:the system time is %d,%d\n", pTimeVal_befor->Seconds,pTimeVal_befor->Nanosec);
974*b1cdbd2cSJim Jagielski 
975*b1cdbd2cSJim Jagielski                 aCountThread->join();
976*b1cdbd2cSJim Jagielski 
977*b1cdbd2cSJim Jagielski                 //the below line will be executed after aCountThread terminate
978*b1cdbd2cSJim Jagielski                 // TimeValue aTimeVal_after;
979*b1cdbd2cSJim Jagielski                 // osl_getSystemTime( &aTimeVal_after );
980*b1cdbd2cSJim Jagielski                 aStopWatch.stop();
981*b1cdbd2cSJim Jagielski                 // sal_uInt32 nSec  = aTimeVal_after.Seconds - aTimeVal_befor.Seconds;
982*b1cdbd2cSJim Jagielski                 double nSec = aStopWatch.getSeconds();
983*b1cdbd2cSJim Jagielski                 t_print("join_001 nSec=%f\n", nSec);
984*b1cdbd2cSJim Jagielski                 delete aCountThread;
985*b1cdbd2cSJim Jagielski 
986*b1cdbd2cSJim Jagielski                 CPPUNIT_ASSERT_MESSAGE(
987*b1cdbd2cSJim Jagielski                     "Join the thread: after the thread terminate",
988*b1cdbd2cSJim Jagielski                     nSec >= 2
989*b1cdbd2cSJim Jagielski                     );
990*b1cdbd2cSJim Jagielski 
991*b1cdbd2cSJim Jagielski             }
992*b1cdbd2cSJim Jagielski         /** after terminated by another thread, join exited immediately
993*b1cdbd2cSJim Jagielski 
994*b1cdbd2cSJim Jagielski             ALGORITHM:
995*b1cdbd2cSJim Jagielski             terminate the thread when value>=3, call join, check the beginning time and time after join,
996*b1cdbd2cSJim Jagielski             the difference should be 3 seconds, join costs little time
997*b1cdbd2cSJim Jagielski         */
join_002()998*b1cdbd2cSJim Jagielski         void join_002()
999*b1cdbd2cSJim Jagielski             {
1000*b1cdbd2cSJim Jagielski                 OCountThread *aCountThread = new OCountThread();
1001*b1cdbd2cSJim Jagielski                 sal_Bool bRes = aCountThread->create();
1002*b1cdbd2cSJim Jagielski                 CPPUNIT_ASSERT_MESSAGE ( "Can't start thread!", bRes == sal_True );
1003*b1cdbd2cSJim Jagielski 
1004*b1cdbd2cSJim Jagielski                 //record the time when the running begin
1005*b1cdbd2cSJim Jagielski                 // TimeValue aTimeVal_befor;
1006*b1cdbd2cSJim Jagielski                 // osl_getSystemTime( &aTimeVal_befor );
1007*b1cdbd2cSJim Jagielski                 StopWatch aStopWatch;
1008*b1cdbd2cSJim Jagielski                 aStopWatch.start();
1009*b1cdbd2cSJim Jagielski 
1010*b1cdbd2cSJim Jagielski                 ThreadHelper::thread_sleep_tenth_sec(10);
1011*b1cdbd2cSJim Jagielski                 termAndJoinThread(aCountThread);
1012*b1cdbd2cSJim Jagielski 
1013*b1cdbd2cSJim Jagielski                 //the below line will be executed after aCountThread terminate
1014*b1cdbd2cSJim Jagielski                 // TimeValue aTimeVal_after;
1015*b1cdbd2cSJim Jagielski                 // osl_getSystemTime( &aTimeVal_after );
1016*b1cdbd2cSJim Jagielski                 // sal_uInt32 nSec  = aTimeVal_after.Seconds - aTimeVal_befor.Seconds;
1017*b1cdbd2cSJim Jagielski                 aStopWatch.stop();
1018*b1cdbd2cSJim Jagielski                 double nSec = aStopWatch.getSeconds();
1019*b1cdbd2cSJim Jagielski                 t_print("join_002 nSec=%f\n", nSec);
1020*b1cdbd2cSJim Jagielski 
1021*b1cdbd2cSJim Jagielski                 delete aCountThread;
1022*b1cdbd2cSJim Jagielski                 CPPUNIT_ASSERT_MESSAGE(
1023*b1cdbd2cSJim Jagielski                     "Join the thread: after thread terminate by another thread",
1024*b1cdbd2cSJim Jagielski                     nSec >= 1
1025*b1cdbd2cSJim Jagielski                     );
1026*b1cdbd2cSJim Jagielski             }
1027*b1cdbd2cSJim Jagielski 
1028*b1cdbd2cSJim Jagielski         CPPUNIT_TEST_SUITE(join);
1029*b1cdbd2cSJim Jagielski         CPPUNIT_TEST(join_001);
1030*b1cdbd2cSJim Jagielski         CPPUNIT_TEST(join_002);
1031*b1cdbd2cSJim Jagielski         CPPUNIT_TEST_SUITE_END();
1032*b1cdbd2cSJim Jagielski     }; // class join
1033*b1cdbd2cSJim Jagielski 
1034*b1cdbd2cSJim Jagielski     /** Test of the osl::Thread::isRunning method
1035*b1cdbd2cSJim Jagielski     */
1036*b1cdbd2cSJim Jagielski     class isRunning : public CppUnit::TestFixture
1037*b1cdbd2cSJim Jagielski     {
1038*b1cdbd2cSJim Jagielski     public:
1039*b1cdbd2cSJim Jagielski         // initialise your test code values here.
setUp()1040*b1cdbd2cSJim Jagielski         void setUp()
1041*b1cdbd2cSJim Jagielski             {
1042*b1cdbd2cSJim Jagielski             }
1043*b1cdbd2cSJim Jagielski 
tearDown()1044*b1cdbd2cSJim Jagielski         void tearDown()
1045*b1cdbd2cSJim Jagielski             {
1046*b1cdbd2cSJim Jagielski             }
1047*b1cdbd2cSJim Jagielski 
1048*b1cdbd2cSJim Jagielski         /**
1049*b1cdbd2cSJim Jagielski          */
isRunning_001()1050*b1cdbd2cSJim Jagielski         void isRunning_001()
1051*b1cdbd2cSJim Jagielski             {
1052*b1cdbd2cSJim Jagielski                 OCountThread *aCountThread = new OCountThread();
1053*b1cdbd2cSJim Jagielski                 sal_Bool bRes = aCountThread->create();
1054*b1cdbd2cSJim Jagielski                 CPPUNIT_ASSERT_MESSAGE ( "Can't start thread!", bRes == sal_True );
1055*b1cdbd2cSJim Jagielski 
1056*b1cdbd2cSJim Jagielski                 sal_Bool bRun = aCountThread->isRunning();
1057*b1cdbd2cSJim Jagielski 
1058*b1cdbd2cSJim Jagielski                 ThreadHelper::thread_sleep_tenth_sec(2);
1059*b1cdbd2cSJim Jagielski                 termAndJoinThread(aCountThread);
1060*b1cdbd2cSJim Jagielski                 sal_Bool bTer = aCountThread->isRunning();
1061*b1cdbd2cSJim Jagielski                 delete aCountThread;
1062*b1cdbd2cSJim Jagielski 
1063*b1cdbd2cSJim Jagielski                 CPPUNIT_ASSERT_MESSAGE(
1064*b1cdbd2cSJim Jagielski                     "Test isRunning",
1065*b1cdbd2cSJim Jagielski                     bRun == sal_True && bTer == sal_False
1066*b1cdbd2cSJim Jagielski                     );
1067*b1cdbd2cSJim Jagielski             }
1068*b1cdbd2cSJim Jagielski         /** check the value of isRunning when suspending and after resume
1069*b1cdbd2cSJim Jagielski          */
isRunning_002()1070*b1cdbd2cSJim Jagielski         void isRunning_002()
1071*b1cdbd2cSJim Jagielski             {
1072*b1cdbd2cSJim Jagielski                 OCountThread *aCountThread = new OCountThread();
1073*b1cdbd2cSJim Jagielski                 sal_Bool bRes = aCountThread->create();
1074*b1cdbd2cSJim Jagielski                 CPPUNIT_ASSERT_MESSAGE ( "Can't start thread!", bRes == sal_True );
1075*b1cdbd2cSJim Jagielski 
1076*b1cdbd2cSJim Jagielski                 // sal_Bool bRunning = aCountThread->isRunning();
1077*b1cdbd2cSJim Jagielski                 // sal_Int32 nValue = 0;
1078*b1cdbd2cSJim Jagielski                 suspendCountThread(aCountThread);
1079*b1cdbd2cSJim Jagielski 
1080*b1cdbd2cSJim Jagielski                 sal_Bool bRunning_sup = aCountThread->isRunning();
1081*b1cdbd2cSJim Jagielski                 ThreadHelper::thread_sleep_tenth_sec(2);
1082*b1cdbd2cSJim Jagielski                 aCountThread->resume();
1083*b1cdbd2cSJim Jagielski                 ThreadHelper::thread_sleep_tenth_sec(2);
1084*b1cdbd2cSJim Jagielski                 sal_Bool bRunning_res = aCountThread->isRunning();
1085*b1cdbd2cSJim Jagielski                 termAndJoinThread(aCountThread);
1086*b1cdbd2cSJim Jagielski                 sal_Bool bRunning_ter = aCountThread->isRunning();
1087*b1cdbd2cSJim Jagielski                 delete aCountThread;
1088*b1cdbd2cSJim Jagielski 
1089*b1cdbd2cSJim Jagielski                 CPPUNIT_ASSERT_MESSAGE(
1090*b1cdbd2cSJim Jagielski                     "Test isRunning",
1091*b1cdbd2cSJim Jagielski                     bRes == sal_True &&
1092*b1cdbd2cSJim Jagielski                     bRunning_sup == sal_True &&
1093*b1cdbd2cSJim Jagielski                     bRunning_res == sal_True &&
1094*b1cdbd2cSJim Jagielski                     bRunning_ter == sal_False
1095*b1cdbd2cSJim Jagielski                     );
1096*b1cdbd2cSJim Jagielski 
1097*b1cdbd2cSJim Jagielski             }
1098*b1cdbd2cSJim Jagielski 
1099*b1cdbd2cSJim Jagielski         CPPUNIT_TEST_SUITE(isRunning);
1100*b1cdbd2cSJim Jagielski         CPPUNIT_TEST(isRunning_001);
1101*b1cdbd2cSJim Jagielski         CPPUNIT_TEST(isRunning_002);
1102*b1cdbd2cSJim Jagielski         CPPUNIT_TEST_SUITE_END();
1103*b1cdbd2cSJim Jagielski     }; // class isRunning
1104*b1cdbd2cSJim Jagielski 
1105*b1cdbd2cSJim Jagielski 
1106*b1cdbd2cSJim Jagielski     /// check osl::Thread::setPriority
1107*b1cdbd2cSJim Jagielski     class setPriority : public CppUnit::TestFixture
1108*b1cdbd2cSJim Jagielski     {
1109*b1cdbd2cSJim Jagielski     public:
1110*b1cdbd2cSJim Jagielski         // initialise your test code values here.
setUp()1111*b1cdbd2cSJim Jagielski         void setUp()
1112*b1cdbd2cSJim Jagielski             {
1113*b1cdbd2cSJim Jagielski             }
1114*b1cdbd2cSJim Jagielski 
tearDown()1115*b1cdbd2cSJim Jagielski         void tearDown()
1116*b1cdbd2cSJim Jagielski             {
1117*b1cdbd2cSJim Jagielski             }
1118*b1cdbd2cSJim Jagielski 
1119*b1cdbd2cSJim Jagielski         // insert your test code here.
getPrioName(oslThreadPriority _aPriority)1120*b1cdbd2cSJim Jagielski         rtl::OString getPrioName(oslThreadPriority _aPriority)
1121*b1cdbd2cSJim Jagielski             {
1122*b1cdbd2cSJim Jagielski                 rtl::OString sPrioStr;
1123*b1cdbd2cSJim Jagielski                 switch (_aPriority)
1124*b1cdbd2cSJim Jagielski                 {
1125*b1cdbd2cSJim Jagielski                 case osl_Thread_PriorityHighest:
1126*b1cdbd2cSJim Jagielski                     sPrioStr = "Highest";
1127*b1cdbd2cSJim Jagielski                     break;
1128*b1cdbd2cSJim Jagielski 
1129*b1cdbd2cSJim Jagielski                 case osl_Thread_PriorityAboveNormal:
1130*b1cdbd2cSJim Jagielski                     sPrioStr = "AboveNormal";
1131*b1cdbd2cSJim Jagielski 
1132*b1cdbd2cSJim Jagielski                 case osl_Thread_PriorityNormal:
1133*b1cdbd2cSJim Jagielski                     sPrioStr = "Normal";
1134*b1cdbd2cSJim Jagielski 
1135*b1cdbd2cSJim Jagielski                 case osl_Thread_PriorityBelowNormal:
1136*b1cdbd2cSJim Jagielski                     sPrioStr = "BelowNormal";
1137*b1cdbd2cSJim Jagielski                     break;
1138*b1cdbd2cSJim Jagielski 
1139*b1cdbd2cSJim Jagielski                 case osl_Thread_PriorityLowest:
1140*b1cdbd2cSJim Jagielski                     sPrioStr = "Lowest";
1141*b1cdbd2cSJim Jagielski                     break;
1142*b1cdbd2cSJim Jagielski                 default:
1143*b1cdbd2cSJim Jagielski                     sPrioStr = "unknown";
1144*b1cdbd2cSJim Jagielski                 }
1145*b1cdbd2cSJim Jagielski                 return sPrioStr;
1146*b1cdbd2cSJim Jagielski             }
1147*b1cdbd2cSJim Jagielski 
1148*b1cdbd2cSJim Jagielski 
1149*b1cdbd2cSJim Jagielski         /** check 2 threads.
1150*b1cdbd2cSJim Jagielski 
1151*b1cdbd2cSJim Jagielski             ALGORITHM:
1152*b1cdbd2cSJim Jagielski             Here the function should show, that 2 different threads,
1153*b1cdbd2cSJim Jagielski             which only increase a value, should run at the same time with same prio.
1154*b1cdbd2cSJim Jagielski             The test fails, if the difference between the two values is more than 5%
1155*b1cdbd2cSJim Jagielski             but IMHO this isn't a failure, it's only a feature of the OS.
1156*b1cdbd2cSJim Jagielski         */
1157*b1cdbd2cSJim Jagielski 
check2Threads(oslThreadPriority _aPriority)1158*b1cdbd2cSJim Jagielski         void check2Threads(oslThreadPriority _aPriority)
1159*b1cdbd2cSJim Jagielski             {
1160*b1cdbd2cSJim Jagielski                 // initial 5 threads with different priorities
1161*b1cdbd2cSJim Jagielski                 OAddThread* pThread = new OAddThread();
1162*b1cdbd2cSJim Jagielski                 OAddThread* p2Thread = new OAddThread();
1163*b1cdbd2cSJim Jagielski 
1164*b1cdbd2cSJim Jagielski                 //Create them and start running at the same time
1165*b1cdbd2cSJim Jagielski                 pThread->create();
1166*b1cdbd2cSJim Jagielski                 pThread->setPriority(_aPriority);
1167*b1cdbd2cSJim Jagielski                 p2Thread->create();
1168*b1cdbd2cSJim Jagielski                 p2Thread->setPriority(_aPriority);
1169*b1cdbd2cSJim Jagielski 
1170*b1cdbd2cSJim Jagielski                 ThreadHelper::thread_sleep_tenth_sec(5);
1171*b1cdbd2cSJim Jagielski 
1172*b1cdbd2cSJim Jagielski                 pThread->terminate();
1173*b1cdbd2cSJim Jagielski                 p2Thread->terminate();
1174*b1cdbd2cSJim Jagielski 
1175*b1cdbd2cSJim Jagielski                 sal_Int32 nValueNormal = 0;
1176*b1cdbd2cSJim Jagielski                 nValueNormal = pThread->getValue();
1177*b1cdbd2cSJim Jagielski 
1178*b1cdbd2cSJim Jagielski                 sal_Int32 nValueNormal2 = 0;
1179*b1cdbd2cSJim Jagielski                 nValueNormal2 = p2Thread->getValue();
1180*b1cdbd2cSJim Jagielski 
1181*b1cdbd2cSJim Jagielski                 rtl::OString sPrio = getPrioName(_aPriority);
1182*b1cdbd2cSJim Jagielski                 t_print("After 10 tenth seconds\n");
1183*b1cdbd2cSJim Jagielski 
1184*b1cdbd2cSJim Jagielski                 t_print("nValue in %s Prio Thread is  %d\n",sPrio.getStr(), nValueNormal);
1185*b1cdbd2cSJim Jagielski                 t_print("nValue in %s Prio Thread is %d\n", sPrio.getStr(), nValueNormal2);
1186*b1cdbd2cSJim Jagielski 
1187*b1cdbd2cSJim Jagielski                 // ThreadHelper::thread_sleep_tenth_sec(1);
1188*b1cdbd2cSJim Jagielski                 pThread->join();
1189*b1cdbd2cSJim Jagielski                 p2Thread->join();
1190*b1cdbd2cSJim Jagielski 
1191*b1cdbd2cSJim Jagielski                 delete pThread;
1192*b1cdbd2cSJim Jagielski                 delete p2Thread;
1193*b1cdbd2cSJim Jagielski 
1194*b1cdbd2cSJim Jagielski                 sal_Int32 nDelta = abs(nValueNormal - nValueNormal2);
1195*b1cdbd2cSJim Jagielski                 double nQuotient = std::max(nValueNormal, nValueNormal2);
1196*b1cdbd2cSJim Jagielski                 CPPUNIT_ASSERT_MESSAGE(
1197*b1cdbd2cSJim Jagielski                     "Quotient is zero, which means, there exist no right values.",
1198*b1cdbd2cSJim Jagielski                     nQuotient != 0
1199*b1cdbd2cSJim Jagielski                     );
1200*b1cdbd2cSJim Jagielski                 double nDeltaPercent = nDelta / nQuotient * 100;
1201*b1cdbd2cSJim Jagielski 
1202*b1cdbd2cSJim Jagielski                 t_print("Delta value %d, percent %f\n",nDelta, nDeltaPercent);
1203*b1cdbd2cSJim Jagielski 
1204*b1cdbd2cSJim Jagielski                 // LLA: it's not a bug if the current OS is not able to handle thread scheduling right and good.
1205*b1cdbd2cSJim Jagielski                 // like Windows XP
1206*b1cdbd2cSJim Jagielski                 // LLA: CPPUNIT_ASSERT_MESSAGE(
1207*b1cdbd2cSJim Jagielski                 // LLA:     "Run 2 normal threads, the count diff more than 5 percent.",
1208*b1cdbd2cSJim Jagielski                 // LLA:     nDeltaPercent <= 5
1209*b1cdbd2cSJim Jagielski                 // LLA:     );
1210*b1cdbd2cSJim Jagielski             }
1211*b1cdbd2cSJim Jagielski 
setPriority_001_1()1212*b1cdbd2cSJim Jagielski         void setPriority_001_1()
1213*b1cdbd2cSJim Jagielski             {
1214*b1cdbd2cSJim Jagielski                 check2Threads(osl_Thread_PriorityHighest);
1215*b1cdbd2cSJim Jagielski             }
setPriority_001_2()1216*b1cdbd2cSJim Jagielski         void setPriority_001_2()
1217*b1cdbd2cSJim Jagielski             {
1218*b1cdbd2cSJim Jagielski                 check2Threads(osl_Thread_PriorityAboveNormal);
1219*b1cdbd2cSJim Jagielski             }
setPriority_001_3()1220*b1cdbd2cSJim Jagielski         void setPriority_001_3()
1221*b1cdbd2cSJim Jagielski             {
1222*b1cdbd2cSJim Jagielski                 check2Threads(osl_Thread_PriorityNormal);
1223*b1cdbd2cSJim Jagielski             }
setPriority_001_4()1224*b1cdbd2cSJim Jagielski         void setPriority_001_4()
1225*b1cdbd2cSJim Jagielski             {
1226*b1cdbd2cSJim Jagielski                 check2Threads(osl_Thread_PriorityBelowNormal);
1227*b1cdbd2cSJim Jagielski             }
setPriority_001_5()1228*b1cdbd2cSJim Jagielski         void setPriority_001_5()
1229*b1cdbd2cSJim Jagielski             {
1230*b1cdbd2cSJim Jagielski                 check2Threads(osl_Thread_PriorityLowest);
1231*b1cdbd2cSJim Jagielski             }
1232*b1cdbd2cSJim Jagielski 
setPriority_002()1233*b1cdbd2cSJim Jagielski         void setPriority_002()
1234*b1cdbd2cSJim Jagielski             {
1235*b1cdbd2cSJim Jagielski                 // initial 5 threads with different priorities
1236*b1cdbd2cSJim Jagielski 
1237*b1cdbd2cSJim Jagielski                 OAddThread aHighestThread;
1238*b1cdbd2cSJim Jagielski                 OAddThread aAboveNormalThread;
1239*b1cdbd2cSJim Jagielski                 OAddThread aNormalThread;
1240*b1cdbd2cSJim Jagielski                 //OAddThread *aBelowNormalThread = new OAddThread();
1241*b1cdbd2cSJim Jagielski                 //OAddThread *aLowestThread = new OAddThread();
1242*b1cdbd2cSJim Jagielski 
1243*b1cdbd2cSJim Jagielski                 //Create them and start running at the same time
1244*b1cdbd2cSJim Jagielski                 aHighestThread.createSuspended();
1245*b1cdbd2cSJim Jagielski                 aHighestThread.setPriority(osl_Thread_PriorityHighest);
1246*b1cdbd2cSJim Jagielski 
1247*b1cdbd2cSJim Jagielski                 aAboveNormalThread.createSuspended();
1248*b1cdbd2cSJim Jagielski                 aAboveNormalThread.setPriority(osl_Thread_PriorityAboveNormal);
1249*b1cdbd2cSJim Jagielski 
1250*b1cdbd2cSJim Jagielski                 aNormalThread.createSuspended();
1251*b1cdbd2cSJim Jagielski                 aNormalThread.setPriority(osl_Thread_PriorityNormal);
1252*b1cdbd2cSJim Jagielski                 /*aBelowNormalThread->create();
1253*b1cdbd2cSJim Jagielski                   aBelowNormalThread->setPriority(osl_Thread_PriorityBelowNormal);
1254*b1cdbd2cSJim Jagielski                   aLowestThread->create();
1255*b1cdbd2cSJim Jagielski                   aLowestThread->setPriority(osl_Thread_PriorityLowest);
1256*b1cdbd2cSJim Jagielski                 */
1257*b1cdbd2cSJim Jagielski 
1258*b1cdbd2cSJim Jagielski                 aHighestThread.resume();
1259*b1cdbd2cSJim Jagielski                 aAboveNormalThread.resume();
1260*b1cdbd2cSJim Jagielski                 aNormalThread.resume();
1261*b1cdbd2cSJim Jagielski 
1262*b1cdbd2cSJim Jagielski                 ThreadHelper::thread_sleep_tenth_sec(5);
1263*b1cdbd2cSJim Jagielski 
1264*b1cdbd2cSJim Jagielski                 aHighestThread.suspend();
1265*b1cdbd2cSJim Jagielski                 aAboveNormalThread.suspend();
1266*b1cdbd2cSJim Jagielski                 aNormalThread.suspend();
1267*b1cdbd2cSJim Jagielski 
1268*b1cdbd2cSJim Jagielski                 termAndJoinThread(&aNormalThread);
1269*b1cdbd2cSJim Jagielski                 termAndJoinThread(&aAboveNormalThread);
1270*b1cdbd2cSJim Jagielski                 termAndJoinThread(&aHighestThread);
1271*b1cdbd2cSJim Jagielski                 //aBelowNormalThread->terminate();
1272*b1cdbd2cSJim Jagielski                 //aLowestThread->terminate();
1273*b1cdbd2cSJim Jagielski 
1274*b1cdbd2cSJim Jagielski                 sal_Int32 nValueHighest = 0;
1275*b1cdbd2cSJim Jagielski                 nValueHighest = aHighestThread.getValue();
1276*b1cdbd2cSJim Jagielski 
1277*b1cdbd2cSJim Jagielski                 sal_Int32 nValueAboveNormal = 0;
1278*b1cdbd2cSJim Jagielski                 nValueAboveNormal = aAboveNormalThread.getValue();
1279*b1cdbd2cSJim Jagielski 
1280*b1cdbd2cSJim Jagielski                 sal_Int32 nValueNormal = 0;
1281*b1cdbd2cSJim Jagielski                 nValueNormal = aNormalThread.getValue();
1282*b1cdbd2cSJim Jagielski 
1283*b1cdbd2cSJim Jagielski                 // sal_Int32 nValueBelowNormal = 0;
1284*b1cdbd2cSJim Jagielski                 //nValueBelowNormal = aBelowNormalThread->getValue();
1285*b1cdbd2cSJim Jagielski                 // sal_Int32 nValueLowest = 0;
1286*b1cdbd2cSJim Jagielski                 //nValueLowest = aLowestThread->getValue();
1287*b1cdbd2cSJim Jagielski                 t_print("After 10 tenth seconds\n");
1288*b1cdbd2cSJim Jagielski                 t_print("nValue in Highest Prio Thread is %d\n",nValueHighest);
1289*b1cdbd2cSJim Jagielski                 t_print("nValue in AboveNormal Prio Thread is %d\n",nValueAboveNormal);
1290*b1cdbd2cSJim Jagielski                 t_print("nValue in Normal Prio Thread is %d\n",nValueNormal);
1291*b1cdbd2cSJim Jagielski 
1292*b1cdbd2cSJim Jagielski                 // LLA: this is not a save test, so we only check if all values not zero
1293*b1cdbd2cSJim Jagielski                 // LLA: CPPUNIT_ASSERT_MESSAGE(
1294*b1cdbd2cSJim Jagielski                 // LLA:     "SetPriority",
1295*b1cdbd2cSJim Jagielski                 // LLA:     nValueHighest >= nValueAboveNormal &&
1296*b1cdbd2cSJim Jagielski                 // LLA:     nValueAboveNormal >= nValueNormal &&
1297*b1cdbd2cSJim Jagielski                 // LLA:     nValueNormal > 0
1298*b1cdbd2cSJim Jagielski                 // LLA:     );
1299*b1cdbd2cSJim Jagielski 
1300*b1cdbd2cSJim Jagielski // LLA: windows let starve threads with lower priority
1301*b1cdbd2cSJim Jagielski #ifndef WNT
1302*b1cdbd2cSJim Jagielski                 CPPUNIT_ASSERT_MESSAGE(
1303*b1cdbd2cSJim Jagielski                     "SetPriority",
1304*b1cdbd2cSJim Jagielski                     nValueHighest     > 0 &&
1305*b1cdbd2cSJim Jagielski                     nValueAboveNormal > 0 &&
1306*b1cdbd2cSJim Jagielski                     nValueNormal > 0
1307*b1cdbd2cSJim Jagielski                     );
1308*b1cdbd2cSJim Jagielski #endif
1309*b1cdbd2cSJim Jagielski             }
1310*b1cdbd2cSJim Jagielski 
setPriority_003()1311*b1cdbd2cSJim Jagielski         void setPriority_003()
1312*b1cdbd2cSJim Jagielski             {
1313*b1cdbd2cSJim Jagielski                 // initial 5 threads with different priorities
1314*b1cdbd2cSJim Jagielski                 OAddThread *pHighestThread = new OAddThread();
1315*b1cdbd2cSJim Jagielski                 OAddThread *pAboveNormalThread = new OAddThread();
1316*b1cdbd2cSJim Jagielski                 OAddThread *pNormalThread = new OAddThread();
1317*b1cdbd2cSJim Jagielski                 OAddThread *pBelowNormalThread = new OAddThread();
1318*b1cdbd2cSJim Jagielski                 OAddThread *pLowestThread = new OAddThread();
1319*b1cdbd2cSJim Jagielski 
1320*b1cdbd2cSJim Jagielski                 //Create them and start running at the same time
1321*b1cdbd2cSJim Jagielski                 pHighestThread->createSuspended();
1322*b1cdbd2cSJim Jagielski                 pHighestThread->setPriority(osl_Thread_PriorityHighest);
1323*b1cdbd2cSJim Jagielski 
1324*b1cdbd2cSJim Jagielski                 pAboveNormalThread->createSuspended();
1325*b1cdbd2cSJim Jagielski                 pAboveNormalThread->setPriority(osl_Thread_PriorityAboveNormal);
1326*b1cdbd2cSJim Jagielski 
1327*b1cdbd2cSJim Jagielski                 pNormalThread->createSuspended();
1328*b1cdbd2cSJim Jagielski                 pNormalThread->setPriority(osl_Thread_PriorityNormal);
1329*b1cdbd2cSJim Jagielski 
1330*b1cdbd2cSJim Jagielski                 pBelowNormalThread->createSuspended();
1331*b1cdbd2cSJim Jagielski                 pBelowNormalThread->setPriority(osl_Thread_PriorityBelowNormal);
1332*b1cdbd2cSJim Jagielski 
1333*b1cdbd2cSJim Jagielski                 pLowestThread->createSuspended();
1334*b1cdbd2cSJim Jagielski                 pLowestThread->setPriority(osl_Thread_PriorityLowest);
1335*b1cdbd2cSJim Jagielski 
1336*b1cdbd2cSJim Jagielski                 pHighestThread->resume();
1337*b1cdbd2cSJim Jagielski                 pAboveNormalThread->resume();
1338*b1cdbd2cSJim Jagielski                 pNormalThread->resume();
1339*b1cdbd2cSJim Jagielski                 pBelowNormalThread->resume();
1340*b1cdbd2cSJim Jagielski                 pLowestThread->resume();
1341*b1cdbd2cSJim Jagielski 
1342*b1cdbd2cSJim Jagielski                 ThreadHelper::thread_sleep_tenth_sec(5);
1343*b1cdbd2cSJim Jagielski 
1344*b1cdbd2cSJim Jagielski                 pHighestThread->suspend();
1345*b1cdbd2cSJim Jagielski                 pAboveNormalThread->suspend();
1346*b1cdbd2cSJim Jagielski                 pNormalThread->suspend();
1347*b1cdbd2cSJim Jagielski                 pBelowNormalThread->suspend();
1348*b1cdbd2cSJim Jagielski                 pLowestThread->suspend();
1349*b1cdbd2cSJim Jagielski 
1350*b1cdbd2cSJim Jagielski                 termAndJoinThread(pHighestThread);
1351*b1cdbd2cSJim Jagielski                 termAndJoinThread(pAboveNormalThread);
1352*b1cdbd2cSJim Jagielski                 termAndJoinThread(pNormalThread);
1353*b1cdbd2cSJim Jagielski                 termAndJoinThread(pBelowNormalThread);
1354*b1cdbd2cSJim Jagielski                 termAndJoinThread(pLowestThread);
1355*b1cdbd2cSJim Jagielski 
1356*b1cdbd2cSJim Jagielski                 sal_Int32 nValueHighest = 0;
1357*b1cdbd2cSJim Jagielski                 nValueHighest = pHighestThread->getValue();
1358*b1cdbd2cSJim Jagielski 
1359*b1cdbd2cSJim Jagielski                 sal_Int32 nValueAboveNormal = 0;
1360*b1cdbd2cSJim Jagielski                 nValueAboveNormal = pAboveNormalThread->getValue();
1361*b1cdbd2cSJim Jagielski 
1362*b1cdbd2cSJim Jagielski                 sal_Int32 nValueNormal = 0;
1363*b1cdbd2cSJim Jagielski                 nValueNormal = pNormalThread->getValue();
1364*b1cdbd2cSJim Jagielski 
1365*b1cdbd2cSJim Jagielski                 sal_Int32 nValueBelowNormal = 0;
1366*b1cdbd2cSJim Jagielski                 nValueBelowNormal = pBelowNormalThread->getValue();
1367*b1cdbd2cSJim Jagielski 
1368*b1cdbd2cSJim Jagielski                 sal_Int32 nValueLowest = 0;
1369*b1cdbd2cSJim Jagielski                 nValueLowest = pLowestThread->getValue();
1370*b1cdbd2cSJim Jagielski 
1371*b1cdbd2cSJim Jagielski                 t_print("After 10 tenth seconds\n");
1372*b1cdbd2cSJim Jagielski                 t_print("nValue in Highest Prio Thread is     %d\n",nValueHighest);
1373*b1cdbd2cSJim Jagielski                 t_print("nValue in AboveNormal Prio Thread is %d\n",nValueAboveNormal);
1374*b1cdbd2cSJim Jagielski                 t_print("nValue in Normal Prio Thread is      %d\n",nValueNormal);
1375*b1cdbd2cSJim Jagielski                 t_print("nValue in BelowNormal Prio Thread is %d\n",nValueBelowNormal);
1376*b1cdbd2cSJim Jagielski                 t_print("nValue in Lowest Prio Thread is      %d\n",nValueLowest);
1377*b1cdbd2cSJim Jagielski 
1378*b1cdbd2cSJim Jagielski                 delete pHighestThread;
1379*b1cdbd2cSJim Jagielski                 delete pAboveNormalThread;
1380*b1cdbd2cSJim Jagielski                 delete pNormalThread;
1381*b1cdbd2cSJim Jagielski                 delete pBelowNormalThread;
1382*b1cdbd2cSJim Jagielski                 delete pLowestThread;
1383*b1cdbd2cSJim Jagielski 
1384*b1cdbd2cSJim Jagielski                 // LLA: this is not a save test, so we only check if all values not zero
1385*b1cdbd2cSJim Jagielski                 // LLA: CPPUNIT_ASSERT_MESSAGE(
1386*b1cdbd2cSJim Jagielski                 // LLA:     "SetPriority",
1387*b1cdbd2cSJim Jagielski                 // LLA:     nValueHighest > nValueAboveNormal &&
1388*b1cdbd2cSJim Jagielski                 // LLA:     nValueAboveNormal > nValueNormal &&
1389*b1cdbd2cSJim Jagielski                 // LLA:     nValueNormal > nValueBelowNormal &&
1390*b1cdbd2cSJim Jagielski                 // LLA:     nValueBelowNormal > nValueLowest &&
1391*b1cdbd2cSJim Jagielski                 // LLA:     nValueLowest > 0
1392*b1cdbd2cSJim Jagielski                 // LLA:     );
1393*b1cdbd2cSJim Jagielski 
1394*b1cdbd2cSJim Jagielski // LLA: windows let starve threads with lower priority
1395*b1cdbd2cSJim Jagielski #ifndef WNT
1396*b1cdbd2cSJim Jagielski                 CPPUNIT_ASSERT_MESSAGE(
1397*b1cdbd2cSJim Jagielski                     "SetPriority",
1398*b1cdbd2cSJim Jagielski                     nValueHighest     > 0 &&
1399*b1cdbd2cSJim Jagielski                     nValueAboveNormal > 0 &&
1400*b1cdbd2cSJim Jagielski                     nValueNormal      > 0 &&
1401*b1cdbd2cSJim Jagielski                     nValueBelowNormal > 0 &&
1402*b1cdbd2cSJim Jagielski                     nValueLowest      > 0
1403*b1cdbd2cSJim Jagielski                     );
1404*b1cdbd2cSJim Jagielski #endif
1405*b1cdbd2cSJim Jagielski             }
1406*b1cdbd2cSJim Jagielski 
setPriority_004()1407*b1cdbd2cSJim Jagielski         void setPriority_004()
1408*b1cdbd2cSJim Jagielski             {
1409*b1cdbd2cSJim Jagielski                 // initial 5 threads with different priorities
1410*b1cdbd2cSJim Jagielski                 // OAddThread *pHighestThread = new OAddThread();
1411*b1cdbd2cSJim Jagielski                 OAddThread *pAboveNormalThread = new OAddThread();
1412*b1cdbd2cSJim Jagielski                 OAddThread *pNormalThread = new OAddThread();
1413*b1cdbd2cSJim Jagielski                 OAddThread *pBelowNormalThread = new OAddThread();
1414*b1cdbd2cSJim Jagielski                 OAddThread *pLowestThread = new OAddThread();
1415*b1cdbd2cSJim Jagielski 
1416*b1cdbd2cSJim Jagielski                 //Create them and start running at the same time
1417*b1cdbd2cSJim Jagielski                 // pHighestThread->createSuspended();
1418*b1cdbd2cSJim Jagielski                 // pHighestThread->setPriority(osl_Thread_PriorityHighest);
1419*b1cdbd2cSJim Jagielski 
1420*b1cdbd2cSJim Jagielski                 pAboveNormalThread->createSuspended();
1421*b1cdbd2cSJim Jagielski                 pAboveNormalThread->setPriority(osl_Thread_PriorityAboveNormal);
1422*b1cdbd2cSJim Jagielski 
1423*b1cdbd2cSJim Jagielski                 pNormalThread->createSuspended();
1424*b1cdbd2cSJim Jagielski                 pNormalThread->setPriority(osl_Thread_PriorityNormal);
1425*b1cdbd2cSJim Jagielski 
1426*b1cdbd2cSJim Jagielski                 pBelowNormalThread->createSuspended();
1427*b1cdbd2cSJim Jagielski                 pBelowNormalThread->setPriority(osl_Thread_PriorityBelowNormal);
1428*b1cdbd2cSJim Jagielski 
1429*b1cdbd2cSJim Jagielski                 pLowestThread->createSuspended();
1430*b1cdbd2cSJim Jagielski                 pLowestThread->setPriority(osl_Thread_PriorityLowest);
1431*b1cdbd2cSJim Jagielski 
1432*b1cdbd2cSJim Jagielski                 // pHighestThread->resume();
1433*b1cdbd2cSJim Jagielski                 pAboveNormalThread->resume();
1434*b1cdbd2cSJim Jagielski                 pNormalThread->resume();
1435*b1cdbd2cSJim Jagielski                 pBelowNormalThread->resume();
1436*b1cdbd2cSJim Jagielski                 pLowestThread->resume();
1437*b1cdbd2cSJim Jagielski 
1438*b1cdbd2cSJim Jagielski                 ThreadHelper::thread_sleep_tenth_sec(5);
1439*b1cdbd2cSJim Jagielski 
1440*b1cdbd2cSJim Jagielski                 // pHighestThread->suspend();
1441*b1cdbd2cSJim Jagielski                 pAboveNormalThread->suspend();
1442*b1cdbd2cSJim Jagielski                 pNormalThread->suspend();
1443*b1cdbd2cSJim Jagielski                 pBelowNormalThread->suspend();
1444*b1cdbd2cSJim Jagielski                 pLowestThread->suspend();
1445*b1cdbd2cSJim Jagielski 
1446*b1cdbd2cSJim Jagielski                 // termAndJoinThread(pHighestThread);
1447*b1cdbd2cSJim Jagielski                 termAndJoinThread(pAboveNormalThread);
1448*b1cdbd2cSJim Jagielski                 termAndJoinThread(pNormalThread);
1449*b1cdbd2cSJim Jagielski                 termAndJoinThread(pBelowNormalThread);
1450*b1cdbd2cSJim Jagielski                 termAndJoinThread(pLowestThread);
1451*b1cdbd2cSJim Jagielski 
1452*b1cdbd2cSJim Jagielski                 // sal_Int32 nValueHighest  = 0;
1453*b1cdbd2cSJim Jagielski                 // nValueHighest =  pHighestThread->getValue();
1454*b1cdbd2cSJim Jagielski 
1455*b1cdbd2cSJim Jagielski                 sal_Int32 nValueAboveNormal = 0;
1456*b1cdbd2cSJim Jagielski                 nValueAboveNormal = pAboveNormalThread->getValue();
1457*b1cdbd2cSJim Jagielski 
1458*b1cdbd2cSJim Jagielski                 sal_Int32 nValueNormal = 0;
1459*b1cdbd2cSJim Jagielski                 nValueNormal = pNormalThread->getValue();
1460*b1cdbd2cSJim Jagielski 
1461*b1cdbd2cSJim Jagielski                 sal_Int32 nValueBelowNormal = 0;
1462*b1cdbd2cSJim Jagielski                 nValueBelowNormal = pBelowNormalThread->getValue();
1463*b1cdbd2cSJim Jagielski 
1464*b1cdbd2cSJim Jagielski                 sal_Int32 nValueLowest = 0;
1465*b1cdbd2cSJim Jagielski                 nValueLowest = pLowestThread->getValue();
1466*b1cdbd2cSJim Jagielski 
1467*b1cdbd2cSJim Jagielski                 t_print("After 5 tenth seconds\n");
1468*b1cdbd2cSJim Jagielski                 // t_print("nValue in Highest Prio Thread  is     %d\n",nValueHighest);
1469*b1cdbd2cSJim Jagielski                 t_print("nValue in AboveNormal Prio Thread is %d\n",nValueAboveNormal);
1470*b1cdbd2cSJim Jagielski                 t_print("nValue in Normal Prio Thread is      %d\n",nValueNormal);
1471*b1cdbd2cSJim Jagielski                 t_print("nValue in BelowNormal Prio Thread is %d\n",nValueBelowNormal);
1472*b1cdbd2cSJim Jagielski                 t_print("nValue in Lowest Prio Thread is      %d\n",nValueLowest);
1473*b1cdbd2cSJim Jagielski 
1474*b1cdbd2cSJim Jagielski                 // delete pHighestThread;
1475*b1cdbd2cSJim Jagielski                 delete pAboveNormalThread;
1476*b1cdbd2cSJim Jagielski                 delete pNormalThread;
1477*b1cdbd2cSJim Jagielski                 delete pBelowNormalThread;
1478*b1cdbd2cSJim Jagielski                 delete pLowestThread;
1479*b1cdbd2cSJim Jagielski 
1480*b1cdbd2cSJim Jagielski                 // LLA: this is not a save test, so we only check if all values not zero
1481*b1cdbd2cSJim Jagielski                 // LLA: CPPUNIT_ASSERT_MESSAGE(
1482*b1cdbd2cSJim Jagielski                 // LLA:     "SetPriority",
1483*b1cdbd2cSJim Jagielski                 // LLA:     nValueHighest > nValueAboveNormal &&
1484*b1cdbd2cSJim Jagielski                 // LLA:     nValueAboveNormal > nValueNormal &&
1485*b1cdbd2cSJim Jagielski                 // LLA:     nValueNormal > nValueBelowNormal &&
1486*b1cdbd2cSJim Jagielski                 // LLA:     nValueBelowNormal > nValueLowest &&
1487*b1cdbd2cSJim Jagielski                 // LLA:     nValueLowest > 0
1488*b1cdbd2cSJim Jagielski                 // LLA:     );
1489*b1cdbd2cSJim Jagielski 
1490*b1cdbd2cSJim Jagielski // LLA: windows let starve threads with lower priority
1491*b1cdbd2cSJim Jagielski #ifndef WNT
1492*b1cdbd2cSJim Jagielski                 CPPUNIT_ASSERT_MESSAGE(
1493*b1cdbd2cSJim Jagielski                     "SetPriority",
1494*b1cdbd2cSJim Jagielski                     /* nValueHighest     > 0 &&  */
1495*b1cdbd2cSJim Jagielski                     nValueAboveNormal > 0 &&
1496*b1cdbd2cSJim Jagielski                     nValueNormal      > 0 &&
1497*b1cdbd2cSJim Jagielski                     nValueBelowNormal > 0 &&
1498*b1cdbd2cSJim Jagielski                     nValueLowest      > 0
1499*b1cdbd2cSJim Jagielski                     );
1500*b1cdbd2cSJim Jagielski #endif
1501*b1cdbd2cSJim Jagielski             }
setPriority_005()1502*b1cdbd2cSJim Jagielski         void setPriority_005()
1503*b1cdbd2cSJim Jagielski             {
1504*b1cdbd2cSJim Jagielski                 // initial 5 threads with different priorities
1505*b1cdbd2cSJim Jagielski                 // OAddThread *pHighestThread = new OAddThread();
1506*b1cdbd2cSJim Jagielski                 // OAddThread *pAboveNormalThread = new OAddThread();
1507*b1cdbd2cSJim Jagielski                 OAddThread *pNormalThread = new OAddThread();
1508*b1cdbd2cSJim Jagielski                 OAddThread *pBelowNormalThread = new OAddThread();
1509*b1cdbd2cSJim Jagielski                 OAddThread *pLowestThread = new OAddThread();
1510*b1cdbd2cSJim Jagielski 
1511*b1cdbd2cSJim Jagielski                 //Create them and start running at the same time
1512*b1cdbd2cSJim Jagielski                 // pHighestThread->createSuspended();
1513*b1cdbd2cSJim Jagielski                 // pHighestThread->setPriority(osl_Thread_PriorityHighest);
1514*b1cdbd2cSJim Jagielski 
1515*b1cdbd2cSJim Jagielski                 // pAboveNormalThread->createSuspended();
1516*b1cdbd2cSJim Jagielski                 // pAboveNormalThread->setPriority(osl_Thread_PriorityAboveNormal);
1517*b1cdbd2cSJim Jagielski 
1518*b1cdbd2cSJim Jagielski                 pNormalThread->createSuspended();
1519*b1cdbd2cSJim Jagielski                 pNormalThread->setPriority(osl_Thread_PriorityNormal);
1520*b1cdbd2cSJim Jagielski 
1521*b1cdbd2cSJim Jagielski                 pBelowNormalThread->createSuspended();
1522*b1cdbd2cSJim Jagielski                 pBelowNormalThread->setPriority(osl_Thread_PriorityBelowNormal);
1523*b1cdbd2cSJim Jagielski 
1524*b1cdbd2cSJim Jagielski                 pLowestThread->createSuspended();
1525*b1cdbd2cSJim Jagielski                 pLowestThread->setPriority(osl_Thread_PriorityLowest);
1526*b1cdbd2cSJim Jagielski 
1527*b1cdbd2cSJim Jagielski                 // pHighestThread->resume();
1528*b1cdbd2cSJim Jagielski                 // pAboveNormalThread->resume();
1529*b1cdbd2cSJim Jagielski                 pNormalThread->resume();
1530*b1cdbd2cSJim Jagielski                 pBelowNormalThread->resume();
1531*b1cdbd2cSJim Jagielski                 pLowestThread->resume();
1532*b1cdbd2cSJim Jagielski 
1533*b1cdbd2cSJim Jagielski                 ThreadHelper::thread_sleep_tenth_sec(5);
1534*b1cdbd2cSJim Jagielski 
1535*b1cdbd2cSJim Jagielski                 // pHighestThread->suspend();
1536*b1cdbd2cSJim Jagielski                 // pAboveNormalThread->suspend();
1537*b1cdbd2cSJim Jagielski                 pNormalThread->suspend();
1538*b1cdbd2cSJim Jagielski                 pBelowNormalThread->suspend();
1539*b1cdbd2cSJim Jagielski                 pLowestThread->suspend();
1540*b1cdbd2cSJim Jagielski 
1541*b1cdbd2cSJim Jagielski                 // termAndJoinThread(pHighestThread);
1542*b1cdbd2cSJim Jagielski                 // termAndJoinThread(pAboveNormalThread);
1543*b1cdbd2cSJim Jagielski                 termAndJoinThread(pNormalThread);
1544*b1cdbd2cSJim Jagielski                 termAndJoinThread(pBelowNormalThread);
1545*b1cdbd2cSJim Jagielski                 termAndJoinThread(pLowestThread);
1546*b1cdbd2cSJim Jagielski 
1547*b1cdbd2cSJim Jagielski                 // sal_Int32 nValueHighest  = 0;
1548*b1cdbd2cSJim Jagielski                 // nValueHighest =  pHighestThread->getValue();
1549*b1cdbd2cSJim Jagielski 
1550*b1cdbd2cSJim Jagielski                 // sal_Int32 nValueAboveNormal = 0;
1551*b1cdbd2cSJim Jagielski                 // nValueAboveNormal = pAboveNormalThread->getValue();
1552*b1cdbd2cSJim Jagielski 
1553*b1cdbd2cSJim Jagielski                 sal_Int32 nValueNormal = 0;
1554*b1cdbd2cSJim Jagielski                 nValueNormal = pNormalThread->getValue();
1555*b1cdbd2cSJim Jagielski 
1556*b1cdbd2cSJim Jagielski                 sal_Int32 nValueBelowNormal = 0;
1557*b1cdbd2cSJim Jagielski                 nValueBelowNormal = pBelowNormalThread->getValue();
1558*b1cdbd2cSJim Jagielski 
1559*b1cdbd2cSJim Jagielski                 sal_Int32 nValueLowest = 0;
1560*b1cdbd2cSJim Jagielski                 nValueLowest = pLowestThread->getValue();
1561*b1cdbd2cSJim Jagielski 
1562*b1cdbd2cSJim Jagielski                 t_print("After 5 tenth seconds\n");
1563*b1cdbd2cSJim Jagielski                 // t_print("nValue in Highest Prio Thread  is     %d\n",nValueHighest);
1564*b1cdbd2cSJim Jagielski                 // t_print("nValue in AboveNormal  Prio Thread is %d\n",nValueAboveNormal);
1565*b1cdbd2cSJim Jagielski                 t_print("nValue in Normal Prio Thread is      %d\n",nValueNormal);
1566*b1cdbd2cSJim Jagielski                 t_print("nValue in BelowNormal Prio Thread is %d\n",nValueBelowNormal);
1567*b1cdbd2cSJim Jagielski                 t_print("nValue in Lowest Prio Thread is      %d\n",nValueLowest);
1568*b1cdbd2cSJim Jagielski 
1569*b1cdbd2cSJim Jagielski                 // delete pHighestThread;
1570*b1cdbd2cSJim Jagielski                 // delete pAboveNormalThread;
1571*b1cdbd2cSJim Jagielski                 delete pNormalThread;
1572*b1cdbd2cSJim Jagielski                 delete pBelowNormalThread;
1573*b1cdbd2cSJim Jagielski                 delete pLowestThread;
1574*b1cdbd2cSJim Jagielski 
1575*b1cdbd2cSJim Jagielski                 // LLA: this is not a save test, so we only check if all values not zero
1576*b1cdbd2cSJim Jagielski                 // LLA: CPPUNIT_ASSERT_MESSAGE(
1577*b1cdbd2cSJim Jagielski                 // LLA:     "SetPriority",
1578*b1cdbd2cSJim Jagielski                 // LLA:     nValueHighest > nValueAboveNormal &&
1579*b1cdbd2cSJim Jagielski                 // LLA:     nValueAboveNormal > nValueNormal &&
1580*b1cdbd2cSJim Jagielski                 // LLA:     nValueNormal > nValueBelowNormal &&
1581*b1cdbd2cSJim Jagielski                 // LLA:     nValueBelowNormal > nValueLowest &&
1582*b1cdbd2cSJim Jagielski                 // LLA:     nValueLowest > 0
1583*b1cdbd2cSJim Jagielski                 // LLA:     );
1584*b1cdbd2cSJim Jagielski 
1585*b1cdbd2cSJim Jagielski // LLA: windows let starve threads with lower priority
1586*b1cdbd2cSJim Jagielski #ifndef WNT
1587*b1cdbd2cSJim Jagielski                 CPPUNIT_ASSERT_MESSAGE(
1588*b1cdbd2cSJim Jagielski                     "SetPriority",
1589*b1cdbd2cSJim Jagielski                     /* nValueHighest     > 0 &&  */
1590*b1cdbd2cSJim Jagielski                     /* nValueAboveNormal > 0 &&  */
1591*b1cdbd2cSJim Jagielski                     nValueNormal      > 0 &&
1592*b1cdbd2cSJim Jagielski                     nValueBelowNormal > 0 &&
1593*b1cdbd2cSJim Jagielski                     nValueLowest      > 0
1594*b1cdbd2cSJim Jagielski                     );
1595*b1cdbd2cSJim Jagielski #endif
1596*b1cdbd2cSJim Jagielski             }
1597*b1cdbd2cSJim Jagielski 
1598*b1cdbd2cSJim Jagielski 
1599*b1cdbd2cSJim Jagielski         CPPUNIT_TEST_SUITE(setPriority);
1600*b1cdbd2cSJim Jagielski #ifndef SOLARIS
1601*b1cdbd2cSJim Jagielski         CPPUNIT_TEST(setPriority_002);
1602*b1cdbd2cSJim Jagielski         CPPUNIT_TEST(setPriority_003);
1603*b1cdbd2cSJim Jagielski         CPPUNIT_TEST(setPriority_004);
1604*b1cdbd2cSJim Jagielski         CPPUNIT_TEST(setPriority_005);
1605*b1cdbd2cSJim Jagielski #endif
1606*b1cdbd2cSJim Jagielski         CPPUNIT_TEST(setPriority_001_1);
1607*b1cdbd2cSJim Jagielski         CPPUNIT_TEST(setPriority_001_2);
1608*b1cdbd2cSJim Jagielski         CPPUNIT_TEST(setPriority_001_3);
1609*b1cdbd2cSJim Jagielski         CPPUNIT_TEST(setPriority_001_4);
1610*b1cdbd2cSJim Jagielski         CPPUNIT_TEST(setPriority_001_5);
1611*b1cdbd2cSJim Jagielski         CPPUNIT_TEST_SUITE_END();
1612*b1cdbd2cSJim Jagielski     }; // class setPriority
1613*b1cdbd2cSJim Jagielski 
1614*b1cdbd2cSJim Jagielski     /** Test of the osl::Thread::getPriority method
1615*b1cdbd2cSJim Jagielski     */
1616*b1cdbd2cSJim Jagielski     class getPriority : public CppUnit::TestFixture
1617*b1cdbd2cSJim Jagielski     {
1618*b1cdbd2cSJim Jagielski     public:
1619*b1cdbd2cSJim Jagielski         // initialise your test code values here.
setUp()1620*b1cdbd2cSJim Jagielski         void setUp()
1621*b1cdbd2cSJim Jagielski             {
1622*b1cdbd2cSJim Jagielski             }
1623*b1cdbd2cSJim Jagielski 
tearDown()1624*b1cdbd2cSJim Jagielski         void tearDown()
1625*b1cdbd2cSJim Jagielski             {
1626*b1cdbd2cSJim Jagielski             }
1627*b1cdbd2cSJim Jagielski 
1628*b1cdbd2cSJim Jagielski         // insert your test code here.
getPriority_001()1629*b1cdbd2cSJim Jagielski         void getPriority_001()
1630*b1cdbd2cSJim Jagielski             {
1631*b1cdbd2cSJim Jagielski                 OAddThread *pHighestThread = new OAddThread();
1632*b1cdbd2cSJim Jagielski 
1633*b1cdbd2cSJim Jagielski                 //Create them and start running at the same time
1634*b1cdbd2cSJim Jagielski                 pHighestThread->create();
1635*b1cdbd2cSJim Jagielski                 pHighestThread->setPriority(osl_Thread_PriorityHighest);
1636*b1cdbd2cSJim Jagielski 
1637*b1cdbd2cSJim Jagielski                 oslThreadPriority aPriority = pHighestThread->getPriority();
1638*b1cdbd2cSJim Jagielski                 termAndJoinThread(pHighestThread);
1639*b1cdbd2cSJim Jagielski                 delete pHighestThread;
1640*b1cdbd2cSJim Jagielski 
1641*b1cdbd2cSJim Jagielski                 ThreadHelper::outputPriority(aPriority);
1642*b1cdbd2cSJim Jagielski 
1643*b1cdbd2cSJim Jagielski // LLA: Priority settings may not work within some OS versions.
1644*b1cdbd2cSJim Jagielski #if ( defined WNT ) || ( defined SOLARIS )
1645*b1cdbd2cSJim Jagielski                 CPPUNIT_ASSERT_MESSAGE(
1646*b1cdbd2cSJim Jagielski                     "getPriority",
1647*b1cdbd2cSJim Jagielski                     aPriority == osl_Thread_PriorityHighest
1648*b1cdbd2cSJim Jagielski                     );
1649*b1cdbd2cSJim Jagielski #else
1650*b1cdbd2cSJim Jagielski // LLA: Linux
1651*b1cdbd2cSJim Jagielski // NO_PTHREAD_PRIORITY ???
1652*b1cdbd2cSJim Jagielski                 CPPUNIT_ASSERT_MESSAGE(
1653*b1cdbd2cSJim Jagielski                     "getPriority",
1654*b1cdbd2cSJim Jagielski                     aPriority == osl_Thread_PriorityNormal
1655*b1cdbd2cSJim Jagielski                     );
1656*b1cdbd2cSJim Jagielski #endif
1657*b1cdbd2cSJim Jagielski             }
1658*b1cdbd2cSJim Jagielski 
getPriority_002()1659*b1cdbd2cSJim Jagielski         void getPriority_002()
1660*b1cdbd2cSJim Jagielski             {
1661*b1cdbd2cSJim Jagielski 
1662*b1cdbd2cSJim Jagielski             }
1663*b1cdbd2cSJim Jagielski 
1664*b1cdbd2cSJim Jagielski         CPPUNIT_TEST_SUITE(getPriority);
1665*b1cdbd2cSJim Jagielski         CPPUNIT_TEST(getPriority_001);
1666*b1cdbd2cSJim Jagielski         CPPUNIT_TEST(getPriority_002);
1667*b1cdbd2cSJim Jagielski         CPPUNIT_TEST_SUITE_END();
1668*b1cdbd2cSJim Jagielski     }; // class getPriority
1669*b1cdbd2cSJim Jagielski 
1670*b1cdbd2cSJim Jagielski 
1671*b1cdbd2cSJim Jagielski     class getIdentifier : public CppUnit::TestFixture
1672*b1cdbd2cSJim Jagielski     {
1673*b1cdbd2cSJim Jagielski     public:
1674*b1cdbd2cSJim Jagielski         // initialise your test code values here.
setUp()1675*b1cdbd2cSJim Jagielski         void setUp()
1676*b1cdbd2cSJim Jagielski             {
1677*b1cdbd2cSJim Jagielski             }
1678*b1cdbd2cSJim Jagielski 
tearDown()1679*b1cdbd2cSJim Jagielski         void tearDown()
1680*b1cdbd2cSJim Jagielski             {
1681*b1cdbd2cSJim Jagielski             }
1682*b1cdbd2cSJim Jagielski 
1683*b1cdbd2cSJim Jagielski         // insert your test code here.
getIdentifier_001()1684*b1cdbd2cSJim Jagielski         void getIdentifier_001()
1685*b1cdbd2cSJim Jagielski             {
1686*b1cdbd2cSJim Jagielski 
1687*b1cdbd2cSJim Jagielski             }
1688*b1cdbd2cSJim Jagielski 
getIdentifier_002()1689*b1cdbd2cSJim Jagielski         void getIdentifier_002()
1690*b1cdbd2cSJim Jagielski             {
1691*b1cdbd2cSJim Jagielski 
1692*b1cdbd2cSJim Jagielski             }
1693*b1cdbd2cSJim Jagielski 
1694*b1cdbd2cSJim Jagielski         CPPUNIT_TEST_SUITE(getIdentifier);
1695*b1cdbd2cSJim Jagielski         CPPUNIT_TEST(getIdentifier_001);
1696*b1cdbd2cSJim Jagielski         CPPUNIT_TEST(getIdentifier_002);
1697*b1cdbd2cSJim Jagielski         CPPUNIT_TEST_SUITE_END();
1698*b1cdbd2cSJim Jagielski     }; // class getIdentifier
1699*b1cdbd2cSJim Jagielski 
1700*b1cdbd2cSJim Jagielski     /** Test of the osl::Thread::getCurrentIdentifier method
1701*b1cdbd2cSJim Jagielski     */
1702*b1cdbd2cSJim Jagielski     class getCurrentIdentifier : public CppUnit::TestFixture
1703*b1cdbd2cSJim Jagielski     {
1704*b1cdbd2cSJim Jagielski     public:
1705*b1cdbd2cSJim Jagielski         // initialise your test code values here.
setUp()1706*b1cdbd2cSJim Jagielski         void setUp()
1707*b1cdbd2cSJim Jagielski             {
1708*b1cdbd2cSJim Jagielski             }
1709*b1cdbd2cSJim Jagielski 
tearDown()1710*b1cdbd2cSJim Jagielski         void tearDown()
1711*b1cdbd2cSJim Jagielski             {
1712*b1cdbd2cSJim Jagielski             }
1713*b1cdbd2cSJim Jagielski 
1714*b1cdbd2cSJim Jagielski         // insert your test code here.
getCurrentIdentifier_001()1715*b1cdbd2cSJim Jagielski         void getCurrentIdentifier_001()
1716*b1cdbd2cSJim Jagielski             {
1717*b1cdbd2cSJim Jagielski                 oslThreadIdentifier oId;
1718*b1cdbd2cSJim Jagielski                 OCountThread* pCountThread = new OCountThread;
1719*b1cdbd2cSJim Jagielski                 //OCountThread* pCountThread2 = new OCountThread;
1720*b1cdbd2cSJim Jagielski                 pCountThread->create();
1721*b1cdbd2cSJim Jagielski                 //pCountThread2->create();
1722*b1cdbd2cSJim Jagielski                 pCountThread->setWait(3);
1723*b1cdbd2cSJim Jagielski                 oId = Thread::getCurrentIdentifier();
1724*b1cdbd2cSJim Jagielski                 oslThreadIdentifier oIdChild = pCountThread->getIdentifier();
1725*b1cdbd2cSJim Jagielski                 //t_print("CurrentId is %ld, Child1 id is %ld, Child2 id is %ld\n",oId, oIdChild,pCountThread2->m_id );
1726*b1cdbd2cSJim Jagielski                 termAndJoinThread(pCountThread);
1727*b1cdbd2cSJim Jagielski                 delete pCountThread;
1728*b1cdbd2cSJim Jagielski                 //termAndJoinThread(pCountThread2);
1729*b1cdbd2cSJim Jagielski                 //delete pCountThread2;
1730*b1cdbd2cSJim Jagielski 
1731*b1cdbd2cSJim Jagielski                 CPPUNIT_ASSERT_MESSAGE(
1732*b1cdbd2cSJim Jagielski                     "Get the identifier for the current active thread.",
1733*b1cdbd2cSJim Jagielski                     oId != oIdChild
1734*b1cdbd2cSJim Jagielski                     );
1735*b1cdbd2cSJim Jagielski 
1736*b1cdbd2cSJim Jagielski             }
1737*b1cdbd2cSJim Jagielski 
getCurrentIdentifier_002()1738*b1cdbd2cSJim Jagielski         void getCurrentIdentifier_002()
1739*b1cdbd2cSJim Jagielski             {
1740*b1cdbd2cSJim Jagielski             }
1741*b1cdbd2cSJim Jagielski 
1742*b1cdbd2cSJim Jagielski         CPPUNIT_TEST_SUITE(getCurrentIdentifier);
1743*b1cdbd2cSJim Jagielski         CPPUNIT_TEST(getCurrentIdentifier_001);
1744*b1cdbd2cSJim Jagielski         //CPPUNIT_TEST(getCurrentIdentifier_002);
1745*b1cdbd2cSJim Jagielski         CPPUNIT_TEST_SUITE_END();
1746*b1cdbd2cSJim Jagielski     }; // class getCurrentIdentifier
1747*b1cdbd2cSJim Jagielski 
1748*b1cdbd2cSJim Jagielski     /** Test of the osl::Thread::wait method
1749*b1cdbd2cSJim Jagielski     */
1750*b1cdbd2cSJim Jagielski     class wait : public CppUnit::TestFixture
1751*b1cdbd2cSJim Jagielski     {
1752*b1cdbd2cSJim Jagielski     public:
1753*b1cdbd2cSJim Jagielski         // initialise your test code values here.
setUp()1754*b1cdbd2cSJim Jagielski         void setUp()
1755*b1cdbd2cSJim Jagielski             {
1756*b1cdbd2cSJim Jagielski             }
1757*b1cdbd2cSJim Jagielski 
tearDown()1758*b1cdbd2cSJim Jagielski         void tearDown()
1759*b1cdbd2cSJim Jagielski             {
1760*b1cdbd2cSJim Jagielski             }
1761*b1cdbd2cSJim Jagielski 
1762*b1cdbd2cSJim Jagielski         /** call wait in the run method
1763*b1cdbd2cSJim Jagielski 
1764*b1cdbd2cSJim Jagielski             ALGORITHM:
1765*b1cdbd2cSJim Jagielski             tested thread wait nWaitSec seconds, main thread sleep (2) seconds,
1766*b1cdbd2cSJim Jagielski             then terminate the tested thread, due to the fact that the thread do a sleep(1) + wait(5)
1767*b1cdbd2cSJim Jagielski             it's finish after 6 seconds.
1768*b1cdbd2cSJim Jagielski         */
wait_001()1769*b1cdbd2cSJim Jagielski         void wait_001()
1770*b1cdbd2cSJim Jagielski             {
1771*b1cdbd2cSJim Jagielski                 OCountThread *aCountThread = new OCountThread();
1772*b1cdbd2cSJim Jagielski                 sal_Int32 nWaitSec = 5;
1773*b1cdbd2cSJim Jagielski                 aCountThread->setWait(nWaitSec);
1774*b1cdbd2cSJim Jagielski                 // thread runs at least 5 seconds.
1775*b1cdbd2cSJim Jagielski                 sal_Bool bRes = aCountThread->create();
1776*b1cdbd2cSJim Jagielski                 CPPUNIT_ASSERT_MESSAGE ( "Can't start thread!", bRes == sal_True );
1777*b1cdbd2cSJim Jagielski 
1778*b1cdbd2cSJim Jagielski                 //record the time when the running begin
1779*b1cdbd2cSJim Jagielski                 StopWatch aStopWatch;
1780*b1cdbd2cSJim Jagielski                 aStopWatch.start();
1781*b1cdbd2cSJim Jagielski 
1782*b1cdbd2cSJim Jagielski                 // wait a little bit, to let the thread the time, to start
1783*b1cdbd2cSJim Jagielski                 ThreadHelper::thread_sleep_tenth_sec( 4 );
1784*b1cdbd2cSJim Jagielski 
1785*b1cdbd2cSJim Jagielski                 // if wait works,
1786*b1cdbd2cSJim Jagielski                 // this function returns, after 4 sec. later
1787*b1cdbd2cSJim Jagielski                 termAndJoinThread(aCountThread);
1788*b1cdbd2cSJim Jagielski 
1789*b1cdbd2cSJim Jagielski                 // value should be one.
1790*b1cdbd2cSJim Jagielski                 sal_Int32 nValue = aCountThread->getValue();
1791*b1cdbd2cSJim Jagielski 
1792*b1cdbd2cSJim Jagielski                 aStopWatch.stop();
1793*b1cdbd2cSJim Jagielski 
1794*b1cdbd2cSJim Jagielski                 // sal_uInt32 nSec  = aTimeVal_after.Seconds - aTimeVal_befor.Seconds;
1795*b1cdbd2cSJim Jagielski                 double nTenthSec = aStopWatch.getTenthSec();
1796*b1cdbd2cSJim Jagielski                 double nSec = aStopWatch.getSeconds();
1797*b1cdbd2cSJim Jagielski                 delete aCountThread;
1798*b1cdbd2cSJim Jagielski                 t_print("nTenthSec = %f \n", nTenthSec);
1799*b1cdbd2cSJim Jagielski                 t_print("nSec = %f \n", nSec);
1800*b1cdbd2cSJim Jagielski                 t_print("nValue = %d \n", nValue);
1801*b1cdbd2cSJim Jagielski 
1802*b1cdbd2cSJim Jagielski                 CPPUNIT_ASSERT_MESSAGE(
1803*b1cdbd2cSJim Jagielski                     "Wait: Blocks the calling thread for the given number of time.",
1804*b1cdbd2cSJim Jagielski                     nTenthSec >= 5 && nValue == 1
1805*b1cdbd2cSJim Jagielski                     );
1806*b1cdbd2cSJim Jagielski 
1807*b1cdbd2cSJim Jagielski             }
1808*b1cdbd2cSJim Jagielski // LLA: wait_001 does the same.
1809*b1cdbd2cSJim Jagielski // LLA:         /** wait then terminate the thread
1810*b1cdbd2cSJim Jagielski // LLA:
1811*b1cdbd2cSJim Jagielski // LLA:         ALGORITHM:
1812*b1cdbd2cSJim Jagielski // LLA:         wait nWaitSec seconds, and terminate when the wait does not finish
1813*b1cdbd2cSJim Jagielski // LLA:         Windows & UNX: thread terminates immediatlly
1814*b1cdbd2cSJim Jagielski // LLA:     */
1815*b1cdbd2cSJim Jagielski // LLA:     void wait_002()
1816*b1cdbd2cSJim Jagielski // LLA:     {
1817*b1cdbd2cSJim Jagielski // LLA:         OCountThread aThread;
1818*b1cdbd2cSJim Jagielski // LLA:
1819*b1cdbd2cSJim Jagielski // LLA:         sal_Int32 nWaitSec = 3;
1820*b1cdbd2cSJim Jagielski // LLA:         aThread.setWait(nWaitSec);
1821*b1cdbd2cSJim Jagielski // LLA:
1822*b1cdbd2cSJim Jagielski // LLA:         sal_Bool bRes = aThread.create();
1823*b1cdbd2cSJim Jagielski // LLA:         CPPUNIT_ASSERT_MESSAGE ( "Can't start thread!", bRes == sal_True );
1824*b1cdbd2cSJim Jagielski // LLA:
1825*b1cdbd2cSJim Jagielski // LLA:         StopWatch aStopWatch;
1826*b1cdbd2cSJim Jagielski // LLA:         // TimeValue aTimeVal_befor;
1827*b1cdbd2cSJim Jagielski // LLA:         // osl_getSystemTime( &aTimeVal_befor );
1828*b1cdbd2cSJim Jagielski // LLA:         aStopWatch.start();
1829*b1cdbd2cSJim Jagielski // LLA:
1830*b1cdbd2cSJim Jagielski // LLA:         termAndJoinThread(&aThread);
1831*b1cdbd2cSJim Jagielski // LLA:         sal_Int32 nValue = aThread.getValue();
1832*b1cdbd2cSJim Jagielski // LLA:
1833*b1cdbd2cSJim Jagielski // LLA:         // TimeValue aTimeVal_after;
1834*b1cdbd2cSJim Jagielski // LLA:         // osl_getSystemTime( &aTimeVal_after );
1835*b1cdbd2cSJim Jagielski // LLA:         aStopWatch.stop();
1836*b1cdbd2cSJim Jagielski // LLA:         // sal_Int32 nSec = aTimeVal_after.Seconds  - aTimeVal_befor.Seconds;
1837*b1cdbd2cSJim Jagielski // LLA:         double nSec = aStopWatch.getSeconds();
1838*b1cdbd2cSJim Jagielski // LLA:         t_print("sec=%f\n", nSec);
1839*b1cdbd2cSJim Jagielski // LLA:         t_print("nValue = %d\n", nValue);
1840*b1cdbd2cSJim Jagielski // LLA:
1841*b1cdbd2cSJim Jagielski // LLA:         CPPUNIT_ASSERT_MESSAGE(
1842*b1cdbd2cSJim Jagielski // LLA:             "Wait: Blocks the calling thread for the given number of time.",
1843*b1cdbd2cSJim Jagielski // LLA:             nSec < 1 && nValue == 0
1844*b1cdbd2cSJim Jagielski // LLA:         );
1845*b1cdbd2cSJim Jagielski // LLA:     }
1846*b1cdbd2cSJim Jagielski 
1847*b1cdbd2cSJim Jagielski         CPPUNIT_TEST_SUITE(wait);
1848*b1cdbd2cSJim Jagielski         CPPUNIT_TEST(wait_001);
1849*b1cdbd2cSJim Jagielski         // LLA: CPPUNIT_TEST(wait_002);
1850*b1cdbd2cSJim Jagielski         CPPUNIT_TEST_SUITE_END();
1851*b1cdbd2cSJim Jagielski     }; // class wait
1852*b1cdbd2cSJim Jagielski 
1853*b1cdbd2cSJim Jagielski     /** osl::Thread::yield method: can not design good test scenario to test up to now
1854*b1cdbd2cSJim Jagielski     */
1855*b1cdbd2cSJim Jagielski     class yield : public CppUnit::TestFixture
1856*b1cdbd2cSJim Jagielski     {
1857*b1cdbd2cSJim Jagielski     public:
setUp()1858*b1cdbd2cSJim Jagielski         void setUp()
1859*b1cdbd2cSJim Jagielski             {
1860*b1cdbd2cSJim Jagielski             }
1861*b1cdbd2cSJim Jagielski 
tearDown()1862*b1cdbd2cSJim Jagielski         void tearDown()
1863*b1cdbd2cSJim Jagielski             {
1864*b1cdbd2cSJim Jagielski             }
1865*b1cdbd2cSJim Jagielski 
1866*b1cdbd2cSJim Jagielski         // insert your test code here.
yield_001()1867*b1cdbd2cSJim Jagielski         void yield_001()
1868*b1cdbd2cSJim Jagielski             {
1869*b1cdbd2cSJim Jagielski             }
1870*b1cdbd2cSJim Jagielski 
1871*b1cdbd2cSJim Jagielski 
1872*b1cdbd2cSJim Jagielski         CPPUNIT_TEST_SUITE(yield);
1873*b1cdbd2cSJim Jagielski         CPPUNIT_TEST(yield_001);
1874*b1cdbd2cSJim Jagielski         CPPUNIT_TEST_SUITE_END();
1875*b1cdbd2cSJim Jagielski     }; // class yield
1876*b1cdbd2cSJim Jagielski 
1877*b1cdbd2cSJim Jagielski     /** Test of the osl::Thread::schedule method
1878*b1cdbd2cSJim Jagielski     */
1879*b1cdbd2cSJim Jagielski     class schedule : public CppUnit::TestFixture
1880*b1cdbd2cSJim Jagielski     {
1881*b1cdbd2cSJim Jagielski     public:
1882*b1cdbd2cSJim Jagielski         // initialise your test code values here.
setUp()1883*b1cdbd2cSJim Jagielski         void setUp()
1884*b1cdbd2cSJim Jagielski             {
1885*b1cdbd2cSJim Jagielski             }
1886*b1cdbd2cSJim Jagielski 
tearDown()1887*b1cdbd2cSJim Jagielski         void tearDown()
1888*b1cdbd2cSJim Jagielski             {
1889*b1cdbd2cSJim Jagielski             }
1890*b1cdbd2cSJim Jagielski 
1891*b1cdbd2cSJim Jagielski         /** The requested thread will get terminate the next time schedule() is called.
1892*b1cdbd2cSJim Jagielski 
1893*b1cdbd2cSJim Jagielski             Note: on UNX, if call suspend thread is not the to be suspended thread, the to be
1894*b1cdbd2cSJim Jagielski             suspended   thread will get suspended the next time schedule() is called,
1895*b1cdbd2cSJim Jagielski             while on w32, it's nothing with schedule.
1896*b1cdbd2cSJim Jagielski 
1897*b1cdbd2cSJim Jagielski             check if suspend and terminate work well via schedule
1898*b1cdbd2cSJim Jagielski         */
schedule_001()1899*b1cdbd2cSJim Jagielski         void schedule_001()
1900*b1cdbd2cSJim Jagielski             {
1901*b1cdbd2cSJim Jagielski                 OAddThread* aThread = new OAddThread();
1902*b1cdbd2cSJim Jagielski                 sal_Bool bRes = aThread->create();
1903*b1cdbd2cSJim Jagielski                 CPPUNIT_ASSERT_MESSAGE ( "Can't start thread!", bRes == sal_True );
1904*b1cdbd2cSJim Jagielski 
1905*b1cdbd2cSJim Jagielski                 ThreadHelper::thread_sleep_tenth_sec(2);
1906*b1cdbd2cSJim Jagielski                 aThread->suspend();
1907*b1cdbd2cSJim Jagielski                 ThreadHelper::thread_sleep_tenth_sec(1);
1908*b1cdbd2cSJim Jagielski                 sal_Int32 nValue = aThread->getValue();
1909*b1cdbd2cSJim Jagielski                 ThreadHelper::thread_sleep_tenth_sec(3);
1910*b1cdbd2cSJim Jagielski                 sal_Int32 nLaterValue = aThread->getValue();
1911*b1cdbd2cSJim Jagielski                 // resumeAndWaitThread(aThread);
1912*b1cdbd2cSJim Jagielski                 t_print("      value = %d\n", nValue);
1913*b1cdbd2cSJim Jagielski                 t_print("later value = %d\n", nLaterValue);
1914*b1cdbd2cSJim Jagielski                 // if value and latervalue not equal, than the thread would not suspended
1915*b1cdbd2cSJim Jagielski 
1916*b1cdbd2cSJim Jagielski                 CPPUNIT_ASSERT_MESSAGE(
1917*b1cdbd2cSJim Jagielski                     "Schedule: suspend works.",
1918*b1cdbd2cSJim Jagielski                     nLaterValue == nValue
1919*b1cdbd2cSJim Jagielski                     );
1920*b1cdbd2cSJim Jagielski 
1921*b1cdbd2cSJim Jagielski                 aThread->resume();
1922*b1cdbd2cSJim Jagielski                 ThreadHelper::thread_sleep_tenth_sec(2);
1923*b1cdbd2cSJim Jagielski 
1924*b1cdbd2cSJim Jagielski                 aThread->terminate();
1925*b1cdbd2cSJim Jagielski                 sal_Int32 nValue_term = aThread->getValue();
1926*b1cdbd2cSJim Jagielski 
1927*b1cdbd2cSJim Jagielski                 aThread->join();
1928*b1cdbd2cSJim Jagielski                 sal_Int32 nValue_join = aThread->getValue();
1929*b1cdbd2cSJim Jagielski 
1930*b1cdbd2cSJim Jagielski                 t_print("value after term = %d\n", nValue_term);
1931*b1cdbd2cSJim Jagielski                 t_print("value after join = %d\n", nValue_join);
1932*b1cdbd2cSJim Jagielski 
1933*b1cdbd2cSJim Jagielski                 // nValue_term and nValue_join should be the same
1934*b1cdbd2cSJim Jagielski                 // but should be differ from nValue
1935*b1cdbd2cSJim Jagielski 
1936*b1cdbd2cSJim Jagielski                 delete aThread;
1937*b1cdbd2cSJim Jagielski                 //check if thread really terminate after call terminate, if join immediatlly return
1938*b1cdbd2cSJim Jagielski                 CPPUNIT_ASSERT_MESSAGE(
1939*b1cdbd2cSJim Jagielski                     "Schedule: Returns False if the thread should terminate.",
1940*b1cdbd2cSJim Jagielski                     nValue_join -  nValue_term <= 1 && nValue_join -  nValue_term >= 0
1941*b1cdbd2cSJim Jagielski                     );
1942*b1cdbd2cSJim Jagielski 
1943*b1cdbd2cSJim Jagielski             }
1944*b1cdbd2cSJim Jagielski 
1945*b1cdbd2cSJim Jagielski         /** design a thread that has not call schedule in the workfunction--run method
1946*b1cdbd2cSJim Jagielski          */
schedule_002()1947*b1cdbd2cSJim Jagielski         void schedule_002()
1948*b1cdbd2cSJim Jagielski             {
1949*b1cdbd2cSJim Jagielski                 ONoScheduleThread aThread; // this thread runs 10 sec. (no schedule() used)
1950*b1cdbd2cSJim Jagielski                 sal_Bool bRes = aThread.create();
1951*b1cdbd2cSJim Jagielski                 CPPUNIT_ASSERT_MESSAGE ( "Can't start thread!", bRes == sal_True );
1952*b1cdbd2cSJim Jagielski 
1953*b1cdbd2cSJim Jagielski                 ThreadHelper::thread_sleep_tenth_sec(2);
1954*b1cdbd2cSJim Jagielski                 aThread.suspend();
1955*b1cdbd2cSJim Jagielski                 sal_Int32 nValue = aThread.getValue();
1956*b1cdbd2cSJim Jagielski 
1957*b1cdbd2cSJim Jagielski                 ThreadHelper::thread_sleep_tenth_sec(3);
1958*b1cdbd2cSJim Jagielski                 sal_Int32 nLaterValue = aThread.getValue();
1959*b1cdbd2cSJim Jagielski                 ThreadHelper::thread_sleep_tenth_sec(5);
1960*b1cdbd2cSJim Jagielski 
1961*b1cdbd2cSJim Jagielski                 resumeAndWaitThread(&aThread);
1962*b1cdbd2cSJim Jagielski 
1963*b1cdbd2cSJim Jagielski                 t_print("      value = %d\n", nValue);
1964*b1cdbd2cSJim Jagielski                 t_print("later value = %d\n", nLaterValue);
1965*b1cdbd2cSJim Jagielski 
1966*b1cdbd2cSJim Jagielski                 //On windows, suspend works, so the values are same
1967*b1cdbd2cSJim Jagielski #ifdef WNT
1968*b1cdbd2cSJim Jagielski                 CPPUNIT_ASSERT_MESSAGE(
1969*b1cdbd2cSJim Jagielski                     "Schedule: don't schedule in thread run method, suspend works.",
1970*b1cdbd2cSJim Jagielski                     nLaterValue == nValue
1971*b1cdbd2cSJim Jagielski                     );
1972*b1cdbd2cSJim Jagielski #endif
1973*b1cdbd2cSJim Jagielski 
1974*b1cdbd2cSJim Jagielski                 //On UNX, suspend does not work, so the difference of the values equals to sleep seconds number
1975*b1cdbd2cSJim Jagielski #ifdef UNX
1976*b1cdbd2cSJim Jagielski                 aThread.resume();
1977*b1cdbd2cSJim Jagielski                 CPPUNIT_ASSERT_MESSAGE(
1978*b1cdbd2cSJim Jagielski                     "Schedule: don't schedule in thread run method, suspend does not work too.",
1979*b1cdbd2cSJim Jagielski                     nLaterValue > nValue
1980*b1cdbd2cSJim Jagielski                     );
1981*b1cdbd2cSJim Jagielski #endif
1982*b1cdbd2cSJim Jagielski 
1983*b1cdbd2cSJim Jagielski                 // terminate will not work if no schedule in thread's work function
1984*b1cdbd2cSJim Jagielski                 termAndJoinThread(&aThread);
1985*b1cdbd2cSJim Jagielski                 sal_Int32 nValue_term = aThread.getValue();
1986*b1cdbd2cSJim Jagielski 
1987*b1cdbd2cSJim Jagielski                 t_print(" value term = %d\n", nValue_term);
1988*b1cdbd2cSJim Jagielski 
1989*b1cdbd2cSJim Jagielski                 CPPUNIT_ASSERT_MESSAGE(
1990*b1cdbd2cSJim Jagielski                     "Schedule: don't schedule in thread run method, terminate failed.",
1991*b1cdbd2cSJim Jagielski                     nValue_term == 10
1992*b1cdbd2cSJim Jagielski                     );
1993*b1cdbd2cSJim Jagielski             }
1994*b1cdbd2cSJim Jagielski 
1995*b1cdbd2cSJim Jagielski         CPPUNIT_TEST_SUITE(schedule);
1996*b1cdbd2cSJim Jagielski         CPPUNIT_TEST(schedule_001);
1997*b1cdbd2cSJim Jagielski         CPPUNIT_TEST(schedule_002);
1998*b1cdbd2cSJim Jagielski         CPPUNIT_TEST_SUITE_END();
1999*b1cdbd2cSJim Jagielski     }; // class schedule
2000*b1cdbd2cSJim Jagielski 
2001*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
2002*b1cdbd2cSJim Jagielski     CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_Thread::create, "osl_Thread");
2003*b1cdbd2cSJim Jagielski     CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_Thread::createSuspended, "osl_Thread");
2004*b1cdbd2cSJim Jagielski     CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_Thread::suspend, "osl_Thread");
2005*b1cdbd2cSJim Jagielski     CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_Thread::resume, "osl_Thread");
2006*b1cdbd2cSJim Jagielski     CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_Thread::terminate, "osl_Thread");
2007*b1cdbd2cSJim Jagielski     CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_Thread::join, "osl_Thread");
2008*b1cdbd2cSJim Jagielski     CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_Thread::isRunning, "osl_Thread");
2009*b1cdbd2cSJim Jagielski     CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_Thread::setPriority, "osl_Thread");
2010*b1cdbd2cSJim Jagielski     CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_Thread::getPriority, "osl_Thread");
2011*b1cdbd2cSJim Jagielski     CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_Thread::getIdentifier, "osl_Thread");
2012*b1cdbd2cSJim Jagielski     CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_Thread::getCurrentIdentifier, "osl_Thread");
2013*b1cdbd2cSJim Jagielski     CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_Thread::wait, "osl_Thread");
2014*b1cdbd2cSJim Jagielski     CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_Thread::yield, "osl_Thread");
2015*b1cdbd2cSJim Jagielski     CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_Thread::schedule, "osl_Thread");
2016*b1cdbd2cSJim Jagielski } // namespace osl_Thread
2017*b1cdbd2cSJim Jagielski 
2018*b1cdbd2cSJim Jagielski 
2019*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
2020*b1cdbd2cSJim Jagielski // destroy function when the binding thread terminate
destroyCallback(void * data)2021*b1cdbd2cSJim Jagielski void SAL_CALL destroyCallback(void * data)
2022*b1cdbd2cSJim Jagielski {
2023*b1cdbd2cSJim Jagielski     t_print("destroying local data %s\n", (char *) data);
2024*b1cdbd2cSJim Jagielski     delete[] (char *) data;
2025*b1cdbd2cSJim Jagielski }
2026*b1cdbd2cSJim Jagielski 
2027*b1cdbd2cSJim Jagielski static ThreadData myThreadData(destroyCallback);
2028*b1cdbd2cSJim Jagielski 
2029*b1cdbd2cSJim Jagielski /**
2030*b1cdbd2cSJim Jagielski */
2031*b1cdbd2cSJim Jagielski class myKeyThread : public Thread
2032*b1cdbd2cSJim Jagielski {
2033*b1cdbd2cSJim Jagielski public:
2034*b1cdbd2cSJim Jagielski     // a public char member for test result checking
2035*b1cdbd2cSJim Jagielski     char m_Char_Test;
2036*b1cdbd2cSJim Jagielski     // for pass thread-special data to thread
myKeyThread(const char cData)2037*b1cdbd2cSJim Jagielski     myKeyThread(const char cData)
2038*b1cdbd2cSJim Jagielski         {
2039*b1cdbd2cSJim Jagielski             m_nData = cData;
2040*b1cdbd2cSJim Jagielski         }
2041*b1cdbd2cSJim Jagielski private:
2042*b1cdbd2cSJim Jagielski     char m_nData;
2043*b1cdbd2cSJim Jagielski 
run()2044*b1cdbd2cSJim Jagielski     void SAL_CALL run()
2045*b1cdbd2cSJim Jagielski         {
2046*b1cdbd2cSJim Jagielski             char * pc = new char[2];
2047*b1cdbd2cSJim Jagielski //      strcpy(pc, &m_nData);
2048*b1cdbd2cSJim Jagielski             memcpy(pc, &m_nData, 1);
2049*b1cdbd2cSJim Jagielski             pc[1] = '\0';
2050*b1cdbd2cSJim Jagielski 
2051*b1cdbd2cSJim Jagielski             myThreadData.setData(pc);
2052*b1cdbd2cSJim Jagielski             char* pData = (char*)myThreadData.getData();
2053*b1cdbd2cSJim Jagielski             m_Char_Test = *pData;
2054*b1cdbd2cSJim Jagielski             // wait for long time to check the data value in main thread
2055*b1cdbd2cSJim Jagielski             ThreadHelper::thread_sleep_tenth_sec(3);
2056*b1cdbd2cSJim Jagielski         }
2057*b1cdbd2cSJim Jagielski public:
~myKeyThread()2058*b1cdbd2cSJim Jagielski     ~myKeyThread()
2059*b1cdbd2cSJim Jagielski         {
2060*b1cdbd2cSJim Jagielski             if (isRunning())
2061*b1cdbd2cSJim Jagielski             {
2062*b1cdbd2cSJim Jagielski                 t_print("error: not terminated.\n");
2063*b1cdbd2cSJim Jagielski             }
2064*b1cdbd2cSJim Jagielski         }
2065*b1cdbd2cSJim Jagielski };
2066*b1cdbd2cSJim Jagielski 
2067*b1cdbd2cSJim Jagielski static ThreadData idData;
2068*b1cdbd2cSJim Jagielski 
2069*b1cdbd2cSJim Jagielski class idThread: public Thread
2070*b1cdbd2cSJim Jagielski {
2071*b1cdbd2cSJim Jagielski public:
2072*b1cdbd2cSJim Jagielski     oslThreadIdentifier m_Id;
2073*b1cdbd2cSJim Jagielski private:
run()2074*b1cdbd2cSJim Jagielski     void SAL_CALL run()
2075*b1cdbd2cSJim Jagielski         {
2076*b1cdbd2cSJim Jagielski             oslThreadIdentifier* pId = new oslThreadIdentifier;
2077*b1cdbd2cSJim Jagielski             *pId = getIdentifier();
2078*b1cdbd2cSJim Jagielski             idData.setData(pId);
2079*b1cdbd2cSJim Jagielski             oslThreadIdentifier* pIdData = (oslThreadIdentifier*)idData.getData();
2080*b1cdbd2cSJim Jagielski             //t_print("Thread %d has Data %d\n", getIdentifier(), *pIdData);
2081*b1cdbd2cSJim Jagielski             m_Id = *pIdData;
2082*b1cdbd2cSJim Jagielski             delete pId;
2083*b1cdbd2cSJim Jagielski         }
2084*b1cdbd2cSJim Jagielski 
2085*b1cdbd2cSJim Jagielski public:
~idThread()2086*b1cdbd2cSJim Jagielski     ~idThread()
2087*b1cdbd2cSJim Jagielski         {
2088*b1cdbd2cSJim Jagielski             if (isRunning())
2089*b1cdbd2cSJim Jagielski             {
2090*b1cdbd2cSJim Jagielski                 t_print("error: not terminated.\n");
2091*b1cdbd2cSJim Jagielski             }
2092*b1cdbd2cSJim Jagielski         }
2093*b1cdbd2cSJim Jagielski };
2094*b1cdbd2cSJim Jagielski 
2095*b1cdbd2cSJim Jagielski namespace osl_ThreadData
2096*b1cdbd2cSJim Jagielski {
2097*b1cdbd2cSJim Jagielski 
2098*b1cdbd2cSJim Jagielski     class ctors : public CppUnit::TestFixture
2099*b1cdbd2cSJim Jagielski     {
2100*b1cdbd2cSJim Jagielski     public:
2101*b1cdbd2cSJim Jagielski         // initialise your test code values here.
setUp()2102*b1cdbd2cSJim Jagielski         void setUp()
2103*b1cdbd2cSJim Jagielski             {
2104*b1cdbd2cSJim Jagielski             }
2105*b1cdbd2cSJim Jagielski 
tearDown()2106*b1cdbd2cSJim Jagielski         void tearDown()
2107*b1cdbd2cSJim Jagielski             {
2108*b1cdbd2cSJim Jagielski             }
2109*b1cdbd2cSJim Jagielski 
2110*b1cdbd2cSJim Jagielski         // insert your test code here.
ctor_001()2111*b1cdbd2cSJim Jagielski         void ctor_001()
2112*b1cdbd2cSJim Jagielski             {
2113*b1cdbd2cSJim Jagielski 
2114*b1cdbd2cSJim Jagielski             }
2115*b1cdbd2cSJim Jagielski 
2116*b1cdbd2cSJim Jagielski         CPPUNIT_TEST_SUITE(ctors);
2117*b1cdbd2cSJim Jagielski         CPPUNIT_TEST(ctor_001);
2118*b1cdbd2cSJim Jagielski         CPPUNIT_TEST_SUITE_END();
2119*b1cdbd2cSJim Jagielski     }; // class ctors
2120*b1cdbd2cSJim Jagielski 
2121*b1cdbd2cSJim Jagielski 
2122*b1cdbd2cSJim Jagielski     class setData : public CppUnit::TestFixture
2123*b1cdbd2cSJim Jagielski     {
2124*b1cdbd2cSJim Jagielski     public:
2125*b1cdbd2cSJim Jagielski         // initialise your test code values here.
setUp()2126*b1cdbd2cSJim Jagielski         void setUp()
2127*b1cdbd2cSJim Jagielski             {
2128*b1cdbd2cSJim Jagielski             }
2129*b1cdbd2cSJim Jagielski 
tearDown()2130*b1cdbd2cSJim Jagielski         void tearDown()
2131*b1cdbd2cSJim Jagielski             {
2132*b1cdbd2cSJim Jagielski             }
2133*b1cdbd2cSJim Jagielski 
2134*b1cdbd2cSJim Jagielski         /** the same instance of the class can have different values in different threads
2135*b1cdbd2cSJim Jagielski          */
setData_001()2136*b1cdbd2cSJim Jagielski         void setData_001()
2137*b1cdbd2cSJim Jagielski             {
2138*b1cdbd2cSJim Jagielski                 idThread aThread1;
2139*b1cdbd2cSJim Jagielski                 aThread1.create();
2140*b1cdbd2cSJim Jagielski                 idThread aThread2;
2141*b1cdbd2cSJim Jagielski                 aThread2.create();
2142*b1cdbd2cSJim Jagielski 
2143*b1cdbd2cSJim Jagielski                 aThread1.join();
2144*b1cdbd2cSJim Jagielski                 aThread2.join();
2145*b1cdbd2cSJim Jagielski 
2146*b1cdbd2cSJim Jagielski                 oslThreadIdentifier aThreadId1 = aThread1.getIdentifier();
2147*b1cdbd2cSJim Jagielski                 oslThreadIdentifier aThreadId2 = aThread2.getIdentifier();
2148*b1cdbd2cSJim Jagielski 
2149*b1cdbd2cSJim Jagielski                 CPPUNIT_ASSERT_MESSAGE(
2150*b1cdbd2cSJim Jagielski                     "ThreadData setData: ",
2151*b1cdbd2cSJim Jagielski                     aThread1.m_Id == aThreadId1 && aThread2.m_Id == aThreadId2
2152*b1cdbd2cSJim Jagielski                     );
2153*b1cdbd2cSJim Jagielski 
2154*b1cdbd2cSJim Jagielski             }
2155*b1cdbd2cSJim Jagielski 
setData_002()2156*b1cdbd2cSJim Jagielski         void setData_002()
2157*b1cdbd2cSJim Jagielski             {
2158*b1cdbd2cSJim Jagielski                 // at first, set the data a value
2159*b1cdbd2cSJim Jagielski                 char* pc = new char[2];
2160*b1cdbd2cSJim Jagielski                 char m_nData = 'm';
2161*b1cdbd2cSJim Jagielski // LLA: this is a copy functions only and really only for \0 terminated strings
2162*b1cdbd2cSJim Jagielski //      m_nData is not a string, it's a character
2163*b1cdbd2cSJim Jagielski //          strcpy(pc, &m_nData);
2164*b1cdbd2cSJim Jagielski                 memcpy(pc, &m_nData, 1);
2165*b1cdbd2cSJim Jagielski                 pc[1] = '\0';
2166*b1cdbd2cSJim Jagielski 
2167*b1cdbd2cSJim Jagielski                 myThreadData.setData(pc);
2168*b1cdbd2cSJim Jagielski 
2169*b1cdbd2cSJim Jagielski                 myKeyThread aThread1('a');
2170*b1cdbd2cSJim Jagielski                 aThread1.create();
2171*b1cdbd2cSJim Jagielski                 myKeyThread aThread2('b');
2172*b1cdbd2cSJim Jagielski                 aThread2.create();
2173*b1cdbd2cSJim Jagielski                 // aThread1 and aThread2 should have not terminated yet, check current data, not 'a' 'b'
2174*b1cdbd2cSJim Jagielski                 char* pChar = (char*)myThreadData.getData();
2175*b1cdbd2cSJim Jagielski                 char aChar = *pChar;
2176*b1cdbd2cSJim Jagielski 
2177*b1cdbd2cSJim Jagielski                 aThread1.join();
2178*b1cdbd2cSJim Jagielski                 aThread2.join();
2179*b1cdbd2cSJim Jagielski 
2180*b1cdbd2cSJim Jagielski                 // the saved thread data of aThread1 & aThread2, different
2181*b1cdbd2cSJim Jagielski                 char cData1 = aThread1.m_Char_Test;
2182*b1cdbd2cSJim Jagielski                 char cData2 = aThread2.m_Char_Test;
2183*b1cdbd2cSJim Jagielski 
2184*b1cdbd2cSJim Jagielski                 CPPUNIT_ASSERT_MESSAGE(
2185*b1cdbd2cSJim Jagielski                     "ThreadData setData: ",
2186*b1cdbd2cSJim Jagielski                     cData1 == 'a' && cData2 == 'b' && aChar == 'm'
2187*b1cdbd2cSJim Jagielski                     );
2188*b1cdbd2cSJim Jagielski 
2189*b1cdbd2cSJim Jagielski             }
2190*b1cdbd2cSJim Jagielski         /** setData the second time, and then getData
2191*b1cdbd2cSJim Jagielski          */
setData_003()2192*b1cdbd2cSJim Jagielski         void setData_003()
2193*b1cdbd2cSJim Jagielski             {
2194*b1cdbd2cSJim Jagielski                 // at first, set the data a value
2195*b1cdbd2cSJim Jagielski                 char* pc = new char[2];
2196*b1cdbd2cSJim Jagielski                 char m_nData = 'm';
2197*b1cdbd2cSJim Jagielski //          strcpy(pc, &m_nData);
2198*b1cdbd2cSJim Jagielski                 memcpy(pc, &m_nData, 1);
2199*b1cdbd2cSJim Jagielski                 pc[1] = '\0';
2200*b1cdbd2cSJim Jagielski                 myThreadData.setData(pc);
2201*b1cdbd2cSJim Jagielski 
2202*b1cdbd2cSJim Jagielski                 myKeyThread aThread1('a');
2203*b1cdbd2cSJim Jagielski                 aThread1.create();
2204*b1cdbd2cSJim Jagielski                 myKeyThread aThread2('b');
2205*b1cdbd2cSJim Jagielski                 aThread2.create();
2206*b1cdbd2cSJim Jagielski                 // aThread1 and aThread2 should have not terminated yet
2207*b1cdbd2cSJim Jagielski                 // setData the second time
2208*b1cdbd2cSJim Jagielski                 char* pc2 = new char[2];
2209*b1cdbd2cSJim Jagielski                 m_nData = 'o';
2210*b1cdbd2cSJim Jagielski //          strcpy(pc2, &m_nData);
2211*b1cdbd2cSJim Jagielski                 memcpy(pc2, &m_nData, 1);
2212*b1cdbd2cSJim Jagielski                 pc2[1] = '\0';
2213*b1cdbd2cSJim Jagielski 
2214*b1cdbd2cSJim Jagielski                 myThreadData.setData(pc2);
2215*b1cdbd2cSJim Jagielski                 char* pChar = (char*)myThreadData.getData();
2216*b1cdbd2cSJim Jagielski                 char aChar = *pChar;
2217*b1cdbd2cSJim Jagielski 
2218*b1cdbd2cSJim Jagielski                 aThread1.join();
2219*b1cdbd2cSJim Jagielski                 aThread2.join();
2220*b1cdbd2cSJim Jagielski 
2221*b1cdbd2cSJim Jagielski                 // the saved thread data of aThread1 & aThread2, different
2222*b1cdbd2cSJim Jagielski                 char cData1 = aThread1.m_Char_Test;
2223*b1cdbd2cSJim Jagielski                 char cData2 = aThread2.m_Char_Test;
2224*b1cdbd2cSJim Jagielski 
2225*b1cdbd2cSJim Jagielski                 CPPUNIT_ASSERT_MESSAGE(
2226*b1cdbd2cSJim Jagielski                     "ThreadData setData: ",
2227*b1cdbd2cSJim Jagielski                     cData1 == 'a' && cData2 == 'b' && aChar == 'o'
2228*b1cdbd2cSJim Jagielski                     );
2229*b1cdbd2cSJim Jagielski 
2230*b1cdbd2cSJim Jagielski             }
2231*b1cdbd2cSJim Jagielski 
2232*b1cdbd2cSJim Jagielski         CPPUNIT_TEST_SUITE(setData);
2233*b1cdbd2cSJim Jagielski         CPPUNIT_TEST(setData_001);
2234*b1cdbd2cSJim Jagielski         CPPUNIT_TEST(setData_002);
2235*b1cdbd2cSJim Jagielski         CPPUNIT_TEST(setData_003);
2236*b1cdbd2cSJim Jagielski         CPPUNIT_TEST_SUITE_END();
2237*b1cdbd2cSJim Jagielski     }; // class setData
2238*b1cdbd2cSJim Jagielski 
2239*b1cdbd2cSJim Jagielski     //sal_Bool buildTwoThreads(char)
2240*b1cdbd2cSJim Jagielski 
2241*b1cdbd2cSJim Jagielski     class getData : public CppUnit::TestFixture
2242*b1cdbd2cSJim Jagielski     {
2243*b1cdbd2cSJim Jagielski     public:
2244*b1cdbd2cSJim Jagielski         // initialise your test code values here.
setUp()2245*b1cdbd2cSJim Jagielski         void setUp()
2246*b1cdbd2cSJim Jagielski             {
2247*b1cdbd2cSJim Jagielski             }
2248*b1cdbd2cSJim Jagielski 
tearDown()2249*b1cdbd2cSJim Jagielski         void tearDown()
2250*b1cdbd2cSJim Jagielski             {
2251*b1cdbd2cSJim Jagielski             }
2252*b1cdbd2cSJim Jagielski 
2253*b1cdbd2cSJim Jagielski         // After setData in child threads, get Data in the main thread, should be independent
getData_001()2254*b1cdbd2cSJim Jagielski         void getData_001()
2255*b1cdbd2cSJim Jagielski             {
2256*b1cdbd2cSJim Jagielski                 char* pc = new char[2];
2257*b1cdbd2cSJim Jagielski                 char m_nData[] = "i";
2258*b1cdbd2cSJim Jagielski                 strcpy(pc, m_nData);
2259*b1cdbd2cSJim Jagielski                 t_print("pc %s\n", pc);
2260*b1cdbd2cSJim Jagielski                 myThreadData.setData(pc);
2261*b1cdbd2cSJim Jagielski 
2262*b1cdbd2cSJim Jagielski                 myKeyThread aThread1('c');
2263*b1cdbd2cSJim Jagielski                 aThread1.create();
2264*b1cdbd2cSJim Jagielski                 myKeyThread aThread2('d');
2265*b1cdbd2cSJim Jagielski                 aThread2.create();
2266*b1cdbd2cSJim Jagielski 
2267*b1cdbd2cSJim Jagielski                 aThread1.join();
2268*b1cdbd2cSJim Jagielski                 aThread2.join();
2269*b1cdbd2cSJim Jagielski 
2270*b1cdbd2cSJim Jagielski                 char cData1 = aThread1.m_Char_Test;
2271*b1cdbd2cSJim Jagielski                 char cData2 = aThread2.m_Char_Test;
2272*b1cdbd2cSJim Jagielski 
2273*b1cdbd2cSJim Jagielski                 char* pChar = (char*)myThreadData.getData();
2274*b1cdbd2cSJim Jagielski                 char aChar = *pChar;
2275*b1cdbd2cSJim Jagielski 
2276*b1cdbd2cSJim Jagielski                 CPPUNIT_ASSERT_MESSAGE(
2277*b1cdbd2cSJim Jagielski                     "ThreadData setData: ",
2278*b1cdbd2cSJim Jagielski                     cData1 == 'c' && cData2 == 'd' && aChar == 'i'
2279*b1cdbd2cSJim Jagielski                     );
2280*b1cdbd2cSJim Jagielski 
2281*b1cdbd2cSJim Jagielski             }
2282*b1cdbd2cSJim Jagielski 
2283*b1cdbd2cSJim Jagielski         // setData then change the value in the address data pointer points,
2284*b1cdbd2cSJim Jagielski         // and then getData, should get the new value
getData_002()2285*b1cdbd2cSJim Jagielski         void getData_002()
2286*b1cdbd2cSJim Jagielski             {
2287*b1cdbd2cSJim Jagielski                 char* pc = new char[2];
2288*b1cdbd2cSJim Jagielski                 char m_nData = 'i';
2289*b1cdbd2cSJim Jagielski //          strcpy(pc, &m_nData);
2290*b1cdbd2cSJim Jagielski                 memcpy(pc, &m_nData, 1);
2291*b1cdbd2cSJim Jagielski                 pc[1] = '\0';
2292*b1cdbd2cSJim Jagielski //          strncpy(pc, &m_nData, sizeof(char);
2293*b1cdbd2cSJim Jagielski 
2294*b1cdbd2cSJim Jagielski                 t_print("pc %s\n", pc);
2295*b1cdbd2cSJim Jagielski                 myThreadData.setData(pc);
2296*b1cdbd2cSJim Jagielski 
2297*b1cdbd2cSJim Jagielski                 myKeyThread aThread1('a');
2298*b1cdbd2cSJim Jagielski                 aThread1.create();
2299*b1cdbd2cSJim Jagielski                 myKeyThread aThread2('b');
2300*b1cdbd2cSJim Jagielski                 aThread2.create();
2301*b1cdbd2cSJim Jagielski 
2302*b1cdbd2cSJim Jagielski                 // change the value which pc points
2303*b1cdbd2cSJim Jagielski                 char m_nData2 = 'j';
2304*b1cdbd2cSJim Jagielski                 // strcpy(pc, &m_nData2);
2305*b1cdbd2cSJim Jagielski                 memcpy(pc, &m_nData2, 1);
2306*b1cdbd2cSJim Jagielski                 pc[1] = '\0';
2307*b1cdbd2cSJim Jagielski 
2308*b1cdbd2cSJim Jagielski                 //t_print("pc %s\n", pc);
2309*b1cdbd2cSJim Jagielski                 void* pChar = myThreadData.getData();
2310*b1cdbd2cSJim Jagielski                 char aChar = *(char*)pChar;
2311*b1cdbd2cSJim Jagielski 
2312*b1cdbd2cSJim Jagielski                 aThread1.join();
2313*b1cdbd2cSJim Jagielski                 aThread2.join();
2314*b1cdbd2cSJim Jagielski 
2315*b1cdbd2cSJim Jagielski                 char cData1 = aThread1.m_Char_Test;
2316*b1cdbd2cSJim Jagielski                 char cData2 = aThread2.m_Char_Test;
2317*b1cdbd2cSJim Jagielski 
2318*b1cdbd2cSJim Jagielski                 CPPUNIT_ASSERT_MESSAGE(
2319*b1cdbd2cSJim Jagielski                     "ThreadData setData: ",
2320*b1cdbd2cSJim Jagielski                     cData1 == 'a' && cData2 == 'b' && aChar == 'j'
2321*b1cdbd2cSJim Jagielski                     );
2322*b1cdbd2cSJim Jagielski 
2323*b1cdbd2cSJim Jagielski             }
2324*b1cdbd2cSJim Jagielski 
2325*b1cdbd2cSJim Jagielski         CPPUNIT_TEST_SUITE(getData);
2326*b1cdbd2cSJim Jagielski         CPPUNIT_TEST(getData_001);
2327*b1cdbd2cSJim Jagielski         CPPUNIT_TEST(getData_002);
2328*b1cdbd2cSJim Jagielski         CPPUNIT_TEST_SUITE_END();
2329*b1cdbd2cSJim Jagielski     }; // class getData
2330*b1cdbd2cSJim Jagielski 
2331*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
2332*b1cdbd2cSJim Jagielski     CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_ThreadData::ctors, "osl_ThreadData");
2333*b1cdbd2cSJim Jagielski     CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_ThreadData::setData, "osl_ThreadData");
2334*b1cdbd2cSJim Jagielski     CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_ThreadData::getData, "osl_ThreadData");
2335*b1cdbd2cSJim Jagielski } // namespace osl_ThreadData
2336*b1cdbd2cSJim Jagielski 
2337*b1cdbd2cSJim Jagielski // this macro creates an empty function, which will called by the RegisterAllFunctions()
2338*b1cdbd2cSJim Jagielski // to let the user the possibility to also register some functions by hand.
2339*b1cdbd2cSJim Jagielski NOADDITIONAL;
2340*b1cdbd2cSJim Jagielski 
2341