30 #ifndef _GENERIC_PORT_HXX_
31 #define _GENERIC_PORT_HXX_
60 template <
typename DataManipulator,
class COUPLING_POLICY >
64 typedef typename DataManipulator::Type
DataType;
74 void close (PortableServer::POA_var
poa, PortableServer::ObjectId_var
id);
104 template <
typename DataManipulator,
typename COUPLING_POLICY >
106 waitingForConvenientDataId(false),waitingForAnyDataId(false),lastDataIdSet(false),
107 cond_instance(& this->storedDatas_mutex){}
109 template <
typename DataManipulator,
typename COUPLING_POLICY>
111 typename DataTable::iterator it;
112 for (it=storedDatas.begin(); it!=storedDatas.end(); ++it) {
114 std::cerr <<
"~GenericPort() : destruction de la donnnée associée au DataId :" << (*it).first << std::endl;
116 DataManipulator::delete_data( (*it).second );
120 template <
typename DataManipulator,
typename COUPLING_POLICY>
void
122 PortableServer::ObjectId_var
id) {
125 poa->deactivate_object (
id);
128 template <
typename DataManipulator,
typename COUPLING_POLICY>
void
132 std::cout <<
"-------- wakeupWaiting ------------------" << std::endl;
134 storedDatas_mutex.lock();
135 if (waitingForAnyDataId || waitingForConvenientDataId) {
138 std::cout <<
"-------- wakeupWaiting:signal --------" << std::endl;
139 std::cout << std::flush;
142 cond_instance.signal();
145 storedDatas_mutex.unlock();
153 template <
typename DataManipulator,
typename COUPLING_POLICY>
154 template <
typename TimeType,
typename TagType>
164 std::cerr <<
"parametres emis: " << time <<
", " << tag << std::endl;
172 typedef typename COUPLING_POLICY::DataIdContainer DataIdContainer;
179 DataIdContainer dataIds(dataId, *
this);
181 typename DataIdContainer::iterator dataIdIt = dataIds.begin();
183 bool expectedDataReceived =
false;
186 std::cout <<
"-------- Put : MARK 1 ------------------" << std::endl;
188 if ( dataIds.empty() )
return;
190 std::cout <<
"-------- Put : MARK 1bis ------------------" << std::endl;
194 DataType data = DataManipulator::get_data(dataParam);
200 std::cout <<
"-------- Put : MARK 2 ------ "<< (dataIdIt == dataIds.end()) <<
"------------" << std::endl;
201 std::cout <<
"-------- Put : MARK 2bis "<< (*dataIdIt) <<
"------------------" << std::endl;
203 storedDatas_mutex.lock();
205 for (;dataIdIt != dataIds.end();++dataIdIt) {
207 std::cout <<
"-------- Put : MARK 3 ------------------" << std::endl;
210 if (nbOfIter > 0) data = DataManipulator::clone(data);
212 std::cout <<
"-------- Put : MARK 3bis -----"<< dataIdIt.operator*() <<
"------------" << std::endl;
214 DataId currentDataId=*dataIdIt;
218 std::cerr <<
"processing dataId : "<< currentDataId << std::endl;
219 std::cout <<
"-------- Put : MARK 4 ------------------" << std::endl;
229 typename DataTable::iterator wDataIt = storedDatas.lower_bound(currentDataId);
231 std::cout <<
"-------- Put : MARK 5 ------------------" << std::endl;
235 if (wDataIt == storedDatas.end() || storedDatas.key_comp()(currentDataId,(*wDataIt).first) ) {
237 std::cout <<
"-------- Put : MARK 6 ------------------" << std::endl;
240 wDataIt = storedDatas.insert(wDataIt, make_pair (currentDataId, data));
245 std::cout <<
"-------- Put : MARK 7 ------------------" << std::endl;
249 DataType old_data = (*wDataIt).second;
250 (*wDataIt).second = data;
252 DataManipulator::delete_data (old_data);
256 std::cout <<
"-------- Put : MARK 8 ------------------" << std::endl;
263 std::cout <<
"-------- Put : waitingForConvenientDataId : " << waitingForConvenientDataId <<
"---" << std::endl;
264 std::cout <<
"-------- Put : waitingForAnyDataId : " << waitingForAnyDataId <<
"---" << std::endl;
265 std::cout <<
"-------- Put : currentDataId : " << currentDataId <<
"---" << std::endl;
266 std::cout <<
"-------- Put : expectedDataId : " << expectedDataId <<
"---" << std::endl;
267 std::cout <<
"-------- Put : MARK 9 ------------------" << std::endl;
278 bool dummy1,dummy2;
typename DataTable::iterator dummy3;
283 if ( waitingForAnyDataId ||
284 ( waitingForConvenientDataId &&
285 this->isDataIdConveniant(storedDatas, expectedDataId, dummy1, dummy2, dummy3) )
289 std::cout <<
"-------- Put : MARK 10 ------------------" << std::endl;
292 expectedDataReceived =
true;
296 if (expectedDataReceived) {
298 std::cout <<
"-------- Put : MARK 11 ------------------" << std::endl;
302 if (waitingForAnyDataId)
303 waitingForAnyDataId =
false;
305 waitingForConvenientDataId =
false;
316 std::cerr <<
"-------- Put : new datas available ------------------" << std::endl;
318 fflush(
stdout);fflush(stderr);
319 cond_instance.signal();
323 std::cout <<
"-------- Put : MARK 12 ------------------" << std::endl;
326 storedDatas_mutex.unlock();
329 std::cout <<
"-------- Put : MARK 13 ------------------" << std::endl;
337 storedDatas_mutex.unlock();
344 template <
typename DataManipulator,
typename COUPLING_POLICY >
345 template <
typename TimeType,
typename TagType>
349 typename COUPLING_POLICY::template EraseDataIdBeforeOrAfterTagProcessor<DataManipulator> processEraseDataId(*
this);
350 processEraseDataId.apply(storedDatas,time,tag,before);
360 template <
typename DataManipulator,
typename COUPLING_POLICY >
361 template <
typename TimeType,
typename TagType>
362 typename DataManipulator::Type
373 bool isEqual, isBounded;
374 typedef typename DataManipulator::InnerType InnerType;
377 std::cout <<
"-------- Get : MARK 1 ------------------" << std::endl;
379 expectedDataId =
DataId(time,tag);
381 std::cout <<
"-------- Get : MARK 2 ------------------" << std::endl;
383 typename DataTable::iterator wDataIt1;
386 storedDatas_mutex.lock();
396 this->isDataIdConveniant(storedDatas,expectedDataId,isEqual,isBounded,wDataIt1);
398 std::cout <<
"-------- Get : MARK 3 ------------------" << std::endl;
403 std::cout <<
"-------- Get : MARK 4 ------------------" << std::endl;
409 dataToTransmit = (*wDataIt1).second;
413 std::cout <<
"-------- Get : MARK 5 ------------------" << std::endl;
414 std::cout <<
"-------- Get : Données trouvées à t : " << std::endl;
415 typename DataManipulator::InnerType
const *
const InIt1 = DataManipulator::getPointer(dataToTransmit);
416 size_t N = DataManipulator::size(dataToTransmit);
418 std::ostream_iterator< InnerType > (std::cout,
" "));
419 std::cout << std::endl;
425 typename COUPLING_POLICY::template EraseDataIdProcessor<DataManipulator> processEraseDataId(*
this);
426 processEraseDataId.apply(storedDatas,wDataIt1);
428 std::cout <<
"-------- Get : MARK 6 ------------------" << std::endl;
434 std::cout <<
"-------- Get : MARK 7 ------------------" << std::endl;
447 std::cout <<
"-------- Get : MARK 8 ------------------" << std::endl;
449 typedef typename COUPLING_POLICY::template BoundedDataIdProcessor<DataManipulator> BDI;
450 BDI processBoundedDataId(*
this);
455 processBoundedDataId.apply(dataToTransmit,expectedDataId,wDataIt1);
461 storedDatas[expectedDataId]=dataToTransmit;
465 std::cout <<
"-------- Get : Données calculées à t : " << std::endl;
466 typename DataManipulator::InnerType
const *
const InIt1 = DataManipulator::getPointer(dataToTransmit);
467 size_t N = DataManipulator::size(dataToTransmit);
470 std::ostream_iterator< InnerType > (std::cout,
" "));
471 std::cout << std::endl;
472 std::cout <<
"-------- Get : MARK 9 ------------------" << std::endl;
475 typename COUPLING_POLICY::template EraseDataIdProcessor<DataManipulator> processEraseDataId(*
this);
476 processEraseDataId.apply(storedDatas,wDataIt1);
483 typename COUPLING_POLICY::template DisconnectProcessor<DataManipulator> processDisconnect(*
this);
484 if ( processDisconnect.apply(storedDatas, expectedDataId, wDataIt1) )
continue;
489 std::cout <<
"-------- Get : MARK 10 ------------------" << std::endl;
492 waitingForConvenientDataId =
true;
495 std::cout <<
"-------- Get : MARK 11 ------------------" << std::endl;
498 std::cout <<
"-------- Get : waiting datas ------------------" << std::endl;
501 fflush(
stdout);fflush(stderr);
504 cond_instance.wait();
508 omni_thread::get_time(&ts,&tns, rs,0);
509 int success=cond_instance.timedwait(ts,tns);
513 std::stringstream
msg;
514 msg<<
"Timeout ("<<rs<<
" s) exceeded";
521 std::cout <<
"-------- Get : MARK 12 ------------------" << std::endl;
524 waitingForConvenientDataId =
true;
525 storedDatas_mutex.unlock();
530 storedDatas_mutex.unlock();
532 std::cout <<
"-------- Get : MARK 13 ------------------" << std::endl;
538 return dataToTransmit;
542 template <
typename DataManipulator,
typename COUPLING_POLICY >
543 template <
typename TimeType,
typename TagType>
544 typename DataManipulator::Type
548 ti = COUPLING_POLICY::getEffectiveTime(ti,tf);
555 template <
typename DataManipulator,
typename COUPLING_POLICY >
556 template <
typename TimeType,
typename TagType>
557 typename DataManipulator::Type
567 storedDatas_mutex.lock();
570 std::cout <<
"-------- Next : MARK 1 ---lastDataIdSet ("<<lastDataIdSet<<
")---------------" << std::endl;
572 typename DataTable::iterator wDataIt1;
573 wDataIt1 = storedDatas.end();
585 wDataIt1 = storedDatas.upper_bound(lastDataId);
586 else if ( !storedDatas.empty() ) {
587 lastDataIdSet =
true;
588 wDataIt1 = storedDatas.begin();
591 typename COUPLING_POLICY::template DisconnectProcessor<DataManipulator> processDisconnect(*
this);
593 while ( storedDatas.empty() || wDataIt1 == storedDatas.end() ) {
597 if ( processDisconnect.apply(storedDatas, lastDataId, wDataIt1) ) {
598 waitingForAnyDataId =
false;
break;
602 std::cout <<
"-------- Next : MARK 2 ------------------" << std::endl;
605 waitingForAnyDataId =
true;
609 std::cout <<
"-------- Next : MARK 3 ------------------" << std::endl;
611 std::cout <<
"-------- Next : waiting datas ------------------" << std::endl;
614 fflush(
stdout);fflush(stderr);
617 cond_instance.wait();
621 omni_thread::get_time(&ts,&tns, rs,0);
622 int success=cond_instance.timedwait(ts,tns);
626 std::stringstream
msg;
627 msg<<
"Timeout ("<<rs<<
" s) exceeded";
635 std::cout <<
"-------- Next : MARK 4 ------------------" << std::endl;
637 wDataIt1 = storedDatas.upper_bound(lastDataId);
640 std::cout <<
"-------- Next : MARK 5 ------------------" << std::endl;
642 lastDataIdSet =
true;
643 wDataIt1 = storedDatas.begin();
648 std::cout <<
"-------- Next : MARK 6 ------------------" << std::endl;
650 t = this->getTime( (*wDataIt1).first );
651 tag = this->getTag ( (*wDataIt1).first );
652 dataToTransmit = (*wDataIt1).second;
655 std::cout <<
"-------- Next : MARK 7 ------------------" << std::endl;
657 lastDataId = (*wDataIt1).first;
659 typename COUPLING_POLICY::template EraseDataIdProcessor<DataManipulator> processEraseDataId(*
this);
660 processEraseDataId.apply(storedDatas, wDataIt1);
663 std::cout <<
"-------- Next : MARK 8 ------------------" << std::endl;
666 std::cout <<
"-------- Next : MARK 8bis ------------------" << std::endl;
668 waitingForAnyDataId =
false;
669 storedDatas_mutex.unlock();
672 storedDatas_mutex.unlock();
675 std::cout <<
"-------- Next : MARK 9 ------------------" << std::endl;
681 return dataToTransmit;
#define THROW_SALOME_CORBA_EXCEPTION(chain, typex)
To raise a CORBA exception from a CORBA servant.
Definition: Utils_CorbaException.hxx:40
static void writeEvent(const char *request, const std::string &containerName, const char *instance_name, const char *port_name, const char *error, const char *message)
Write a record in the trace file.
Definition: DSC_interface.cxx:478
Definition: GenericPort.hxx:61
DataId expectedDataId
Definition: GenericPort.hxx:93
void close(PortableServer::POA_var poa, PortableServer::ObjectId_var id)
Definition: GenericPort.hxx:121
omni_mutex storedDatas_mutex
Definition: GenericPort.hxx:98
GenericPort()
Definition: GenericPort.hxx:105
DataManipulator::CorbaInType CorbaInDataType
Definition: GenericPort.hxx:65
bool lastDataIdSet
Definition: GenericPort.hxx:96
omni_condition cond_instance
Definition: GenericPort.hxx:100
std::map< DataId, DataType > DataTable
Definition: GenericPort.hxx:82
bool waitingForConvenientDataId
Definition: GenericPort.hxx:88
void put(CorbaInDataType data, TimeType time, TagType tag)
Definition: GenericPort.hxx:155
void erase(TimeType time, TagType tag, bool before)
Definition: GenericPort.hxx:347
void wakeupWaiting()
Definition: GenericPort.hxx:129
DataType next(TimeType &t, TagType &tag)
DataType get(TimeType time, TagType tag)
COUPLING_POLICY::DataId DataId
Definition: GenericPort.hxx:81
DataManipulator::Type DataType
Definition: GenericPort.hxx:64
DataType get(TimeType &ti, TimeType tf, TagType tag=0)
bool waitingForAnyDataId
Definition: GenericPort.hxx:90
virtual ~GenericPort()
Definition: GenericPort.hxx:110
DataTable storedDatas
Definition: GenericPort.hxx:85
DataId lastDataId
Definition: GenericPort.hxx:95
Definition: Utils_SALOME_Exception.hxx:66
virtual const char * what(void) const noexcept
Definition: Utils_SALOME_Exception.cxx:72
static long dscTimeOut
Definition: Superv_Component_i.hxx:251
poa
Definition: SALOME_ContainerPy.py:377
stdout
Definition: SALOME_ContainerPy.py:373
@ INTERNAL_ERROR
Application level problem, irrecoverable.
Definition: SALOME_Exception.idl:52
bool VerbosityActivated()
Called by any log message macros to decide about log output in Release and Debug mode dynamically rel...
Definition: libSALOMELog.cxx:48
string msg
Definition: TestMinimalExample.py:168
def dump(filename)
Definition: pythfilter.py:368
def copy(src, dst)
Definition: pythonpath_reduction.py:35
Definition: DSC_Exception.hxx:94
double TagType
Definition: testAdjacentPredicate.cxx:53
std::pair< TimeType, TagType > DataId
Definition: testAdjacentPredicate.cxx:54
int TimeType
Definition: testAdjacentPredicate.cxx:52