Ignore:
Timestamp:
11/28/16 14:02:54 (8 years ago)
Author:
rlacroix
Message:

The workflow is now triggered when using xios_recv_field for fields in read mode received from the servers.

Previously the workflow was triggered upon receiving the data which could cause deadlocks since there are no garanties that clients are receiving data at the same time.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • XIOS/trunk/src/filter/output_pin.cpp

    r637 r1006  
    44namespace xios 
    55{ 
     6  COutputPin::COutputPin(CGarbageCollector& gc, bool manualTrigger /*= false*/) 
     7    : gc(gc) 
     8    , manualTrigger(manualTrigger) 
     9  { /* Nothing to do */ } 
     10 
    611  void COutputPin::connectOutput(boost::shared_ptr<CInputPin> inputPin, size_t inputSlot) 
    712  { 
     
    1116 
    1217    outputs.push_back(std::make_pair(inputPin, inputSlot)); 
     18 
     19    if (canBeTriggered()) 
     20      inputPin->setInputTrigger(inputSlot, this); 
     21  } 
     22 
     23  void COutputPin::onOutputReady(CDataPacketPtr packet) 
     24  { 
     25    if (!packet) 
     26      ERROR("void COutputPin::onOutputReady(CDataPacketPtr packet)", 
     27            "The packet cannot be null."); 
     28 
     29    if (manualTrigger) // Don't use canBeTriggered here, this function is virtual and can be overriden 
     30    { 
     31      outputPackets[packet->timestamp] = packet; 
     32      gc.registerObject(this, packet->timestamp); 
     33    } 
     34    else 
     35      deliverOuput(packet); 
    1336  } 
    1437 
     
    2346      it->first->setInput(it->second, packet); 
    2447  } 
     48 
     49  void COutputPin::trigger(Time timestamp) 
     50  { 
     51    if (manualTrigger) // Don't use canBeTriggered here, this function is virtual and can be overriden 
     52    { 
     53      std::map<Time, CDataPacketPtr>::iterator it = outputPackets.find(timestamp); 
     54      if (it != outputPackets.end()) 
     55      { 
     56        gc.unregisterObject(this, timestamp); 
     57        deliverOuput(it->second); 
     58        outputPackets.erase(it); 
     59      } 
     60    } 
     61  } 
     62 
     63  bool COutputPin::canBeTriggered() const 
     64  { 
     65    return manualTrigger; 
     66  } 
     67 
     68  void COutputPin::setOutputTriggers() 
     69  { 
     70    std::vector<std::pair<boost::shared_ptr<CInputPin>, size_t> >::iterator it, itEnd; 
     71    for (it = outputs.begin(), itEnd = outputs.end(); it != itEnd; ++it) 
     72      it->first->setInputTrigger(it->second, this); 
     73  } 
     74 
     75  void COutputPin::invalidate(Time timestamp) 
     76  { 
     77    outputPackets.erase(outputPackets.begin(), outputPackets.lower_bound(timestamp)); 
     78  } 
    2579} // namespace xios 
Note: See TracChangeset for help on using the changeset viewer.