1 // Copyright (C) 2006-2013 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
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;
60 void *BasesTest::th1_2(void *st)
62 char myName=*((char *) st);
64 _glob<< myName << _var;
68 void *BasesTest::th1_3(void *st)
70 char myName=*((char *) st);
71 _glob<< myName << _var++;
75 void *BasesTest::th2_1(void *)
79 for (i=0; i<LOOPS; ++i)
87 Thread::sleep(100000);
91 void *BasesTest::myFunc(void *n)
95 for (int i=3; i>0; i--)
97 DEBTRACE("thread " << id << " asks for " << i << " resources");
99 DEBTRACE("thread " << id << " has got " << i << " resources");
100 CPPUNIT_ASSERT(count_resources() == BasesTest::MAX_RESOURCE);
101 Thread::sleep(10000);
102 CPPUNIT_ASSERT(count_resources() == BasesTest::MAX_RESOURCE);
103 DEBTRACE("thread " << id << " frees " << i << " resources");
104 free_resources(id, i);
108 void BasesTest::get_resources(int id, int amount)
111 while (_resources < amount)
114 _cond.wait(_m); // _m is unlocked during the wait
116 _resources -= amount;
117 _ownedResources[id] = amount;
121 void BasesTest::free_resources(int id, int amount)
124 _resources += amount;
125 _ownedResources[id] = 0;
134 int BasesTest::count_resources()
140 resources = _resources;
141 for (int i=0; i<THREAD_NUM; i++)
143 totOwned += _ownedResources[i];
147 int total = resources + totOwned;
148 DEBTRACE("resources:: owned by threads: " << totOwned << " remaining: " << resources << " total: " << total);
152 void BasesTest::setUp()
156 void BasesTest::tearDown()
161 void BasesTest::test1()
163 char t1Name='A'; char t2Name='B'; char t3Name='C';
164 Thread t1(th1_1,&t1Name);
165 Thread t2(th1_2,&t2Name);
166 Thread t3(th1_3,&t3Name);
170 CPPUNIT_ASSERT( _glob.str() == "C7A8B10" );
173 void BasesTest::test2()
176 Thread **ths=new Thread *[THREAD_NUM];
177 for (i=0; i<THREAD_NUM; ++i)
179 ths[i]=new Thread(th2_1,0);
181 for (i=0; i<THREAD_NUM; ++i)
187 CPPUNIT_ASSERT( _value == THREAD_NUM*LOOPS );
190 void BasesTest::test3()
194 Thread **ths=new Thread *[THREAD_NUM];
197 for (i=0; i<THREAD_NUM; i++)
200 _ownedResources[i] = 0;
203 for (i=0; i<THREAD_NUM; i++)
205 ths[i] = new Thread(myFunc, &id[i]);
206 CPPUNIT_ASSERT(count_resources() == BasesTest::MAX_RESOURCE);
209 for (i=0; i<THREAD_NUM; i++)
213 DEBTRACE("thread " << id[i] << " is finished");
214 CPPUNIT_ASSERT(count_resources() == BasesTest::MAX_RESOURCE);
218 typedef double (*FctPt)(double);
220 void BasesTest::testDL()
222 DynLibLoader *loader=new DynLibLoader("libYACSDLTest");
223 void *symb=loader->getHandleOnSymbolWithName("myYacsFct");
224 FctPt f=(FctPt) symb;
226 CPPUNIT_ASSERT_DOUBLES_EQUAL( 20.23, res, 1e-13);
228 CPPUNIT_ASSERT_DOUBLES_EQUAL( 37.03, res, 1e-13);