1 // Copyright (C) 2006-2008 CEA/DEN, EDF R&D
3 // This library is free software; you can redistribute it and/or
4 // modify it under the terms of the GNU Lesser General Public
5 // License as published by the Free Software Foundation; either
6 // version 2.1 of the License.
8 // This library is distributed in the hope that it will be useful,
9 // but WITHOUT ANY WARRANTY; without even the implied warranty of
10 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11 // Lesser General Public License for more details.
13 // You should have received a copy of the GNU Lesser General Public
14 // License along with this library; if not, write to the Free Software
15 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
19 #include "basesTest.hxx"
24 using namespace YACS::BASES;
29 #include "YacsTrace.hxx"
32 Semaphore BasesTest::_s1;
33 Semaphore BasesTest::_s2;
34 Condition BasesTest::_cond;
35 ostringstream BasesTest::_glob;
36 int BasesTest::_var=7;
38 const int BasesTest::THREAD_NUM=5;
40 const int BasesTest::LOOPS=4;
42 const int BasesTest::MAX_RESOURCE=7;
44 int BasesTest::_value=0;
45 int BasesTest::_waiting=0;
46 int BasesTest::_resources=BasesTest::MAX_RESOURCE;
47 int BasesTest::_ownedResources[THREAD_NUM];
49 void *BasesTest::th1_1(void *st)
51 char myName=*((char *) st);
53 _glob<< myName << _var;
59 void *BasesTest::th1_2(void *st)
61 char myName=*((char *) st);
63 _glob<< myName << _var;
67 void *BasesTest::th1_3(void *st)
69 char myName=*((char *) st);
70 _glob<< myName << _var++;
74 void *BasesTest::th2_1(void *)
78 for (i=0; i<LOOPS; ++i)
86 Thread::sleep(100000);
90 void *BasesTest::myFunc(void *n)
94 for (int i=3; i>0; i--)
96 DEBTRACE("thread " << id << " asks for " << i << " resources");
98 DEBTRACE("thread " << id << " has got " << i << " resources");
99 CPPUNIT_ASSERT(count_resources() == BasesTest::MAX_RESOURCE);
100 Thread::sleep(10000);
101 CPPUNIT_ASSERT(count_resources() == BasesTest::MAX_RESOURCE);
102 DEBTRACE("thread " << id << " frees " << i << " resources");
103 free_resources(id, i);
107 void BasesTest::get_resources(int id, int amount)
110 while (_resources < amount)
113 _cond.wait(_m); // _m is unlocked during the wait
115 _resources -= amount;
116 _ownedResources[id] = amount;
120 void BasesTest::free_resources(int id, int amount)
123 _resources += amount;
124 _ownedResources[id] = 0;
133 int BasesTest::count_resources()
139 resources = _resources;
140 for (int i=0; i<THREAD_NUM; i++)
142 totOwned += _ownedResources[i];
146 int total = resources + totOwned;
147 DEBTRACE("resources:: owned by threads: " << totOwned << " remaining: " << resources << " total: " << total);
151 void BasesTest::setUp()
155 void BasesTest::tearDown()
160 void BasesTest::test1()
162 char t1Name='A'; char t2Name='B'; char t3Name='C';
163 Thread t1(th1_1,&t1Name);
164 Thread t2(th1_2,&t2Name);
165 Thread t3(th1_3,&t3Name);
169 CPPUNIT_ASSERT( _glob.str() == "C7A8B10" );
172 void BasesTest::test2()
175 Thread **ths=new Thread *[THREAD_NUM];
176 for (i=0; i<THREAD_NUM; ++i)
178 ths[i]=new Thread(th2_1,0);
180 for (i=0; i<THREAD_NUM; ++i)
186 CPPUNIT_ASSERT( _value == THREAD_NUM*LOOPS );
189 void BasesTest::test3()
193 Thread **ths=new Thread *[THREAD_NUM];
196 for (i=0; i<THREAD_NUM; i++)
199 _ownedResources[i] = 0;
202 for (i=0; i<THREAD_NUM; i++)
204 ths[i] = new Thread(myFunc, &id[i]);
205 CPPUNIT_ASSERT(count_resources() == BasesTest::MAX_RESOURCE);
208 for (i=0; i<THREAD_NUM; i++)
212 DEBTRACE("thread " << id[i] << " is finished");
213 CPPUNIT_ASSERT(count_resources() == BasesTest::MAX_RESOURCE);
217 typedef double (*FctPt)(double);
219 void BasesTest::testDL()
221 DynLibLoader *loader=new DynLibLoader(".libs/libYACSDLTest");
222 void *symb=loader->getHandleOnSymbolWithName("myYacsFct");
223 FctPt f=(FctPt) symb;
225 CPPUNIT_ASSERT_DOUBLES_EQUAL( 20.23, res, 1e-13);
227 CPPUNIT_ASSERT_DOUBLES_EQUAL( 37.03, res, 1e-13);