1 // Copyright (C) 2006-2014 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, or (at your option) any later version.
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
20 #include "basesTest.hxx"
25 using namespace YACS::BASES;
30 #include "YacsTrace.hxx"
33 Semaphore BasesTest::_s1;
34 Semaphore BasesTest::_s2;
35 Condition BasesTest::_cond;
36 ostringstream BasesTest::_glob;
37 int BasesTest::_var=7;
39 const int BasesTest::THREAD_NUM=5;
41 const int BasesTest::LOOPS=4;
43 const int BasesTest::MAX_RESOURCE=7;
45 int BasesTest::_value=0;
46 int BasesTest::_waiting=0;
47 int BasesTest::_resources=BasesTest::MAX_RESOURCE;
48 int BasesTest::_ownedResources[THREAD_NUM];
50 void *BasesTest::th1_1(void *st)
52 char myName=*((char *) st);
54 _glob<< myName << _var;
61 void *BasesTest::th1_2(void *st)
63 char myName=*((char *) st);
65 _glob<< myName << _var;
70 void *BasesTest::th1_3(void *st)
72 char myName=*((char *) st);
73 _glob<< myName << _var++;
78 void *BasesTest::th2_1(void *)
82 for (i=0; i<LOOPS; ++i)
90 Thread::sleep(100000);
95 void *BasesTest::myFunc(void *n)
99 for (int i=3; i>0; i--)
101 DEBTRACE("thread " << id << " asks for " << i << " resources");
102 get_resources(id, i);
103 DEBTRACE("thread " << id << " has got " << i << " resources");
104 CPPUNIT_ASSERT(count_resources() == BasesTest::MAX_RESOURCE);
105 Thread::sleep(10000);
106 CPPUNIT_ASSERT(count_resources() == BasesTest::MAX_RESOURCE);
107 DEBTRACE("thread " << id << " frees " << i << " resources");
108 free_resources(id, i);
113 void BasesTest::get_resources(int id, int amount)
116 while (_resources < amount)
119 _cond.wait(_m); // _m is unlocked during the wait
121 _resources -= amount;
122 _ownedResources[id] = amount;
126 void BasesTest::free_resources(int id, int amount)
129 _resources += amount;
130 _ownedResources[id] = 0;
139 int BasesTest::count_resources()
145 resources = _resources;
146 for (int i=0; i<THREAD_NUM; i++)
148 totOwned += _ownedResources[i];
152 int total = resources + totOwned;
153 DEBTRACE("resources:: owned by threads: " << totOwned << " remaining: " << resources << " total: " << total);
157 void BasesTest::setUp()
161 void BasesTest::tearDown()
166 void BasesTest::test1()
168 char t1Name='A'; char t2Name='B'; char t3Name='C';
169 Thread t1(th1_1,&t1Name);
170 Thread t2(th1_2,&t2Name);
171 Thread t3(th1_3,&t3Name);
175 CPPUNIT_ASSERT( _glob.str() == "C7A8B10" );
178 void BasesTest::test2()
181 Thread **ths=new Thread *[THREAD_NUM];
182 for (i=0; i<THREAD_NUM; ++i)
184 ths[i]=new Thread(th2_1,0);
186 for (i=0; i<THREAD_NUM; ++i)
192 CPPUNIT_ASSERT( _value == THREAD_NUM*LOOPS );
195 void BasesTest::test3()
199 Thread **ths=new Thread *[THREAD_NUM];
202 for (i=0; i<THREAD_NUM; i++)
205 _ownedResources[i] = 0;
208 for (i=0; i<THREAD_NUM; i++)
210 ths[i] = new Thread(myFunc, &id[i]);
211 CPPUNIT_ASSERT(count_resources() == BasesTest::MAX_RESOURCE);
214 for (i=0; i<THREAD_NUM; i++)
218 DEBTRACE("thread " << id[i] << " is finished");
219 CPPUNIT_ASSERT(count_resources() == BasesTest::MAX_RESOURCE);
223 typedef double (*FctPt)(double);
225 void BasesTest::testDL()
227 DynLibLoader *loader=new DynLibLoader("libYACSDLTest");
228 void *symb=loader->getHandleOnSymbolWithName("myYacsFct");
229 FctPt f=(FctPt) symb;
231 CPPUNIT_ASSERT_DOUBLES_EQUAL( 20.23, res, 1e-13);
233 CPPUNIT_ASSERT_DOUBLES_EQUAL( 37.03, res, 1e-13);