source: XIOS/trunk/src/filter/input_pin.hpp @ 1006

Last change on this file since 1006 was 1006, checked in by rlacroix, 7 years ago

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 size: 3.3 KB
Line 
1#ifndef __XIOS_CInputPin__
2#define __XIOS_CInputPin__
3
4#include <vector>
5#include <map>
6
7#include "garbage_collector.hpp"
8#include "data_packet.hpp"
9
10namespace xios
11{
12  class COutputPin;
13
14  /*!
15   * An input pin handles the data packets received by a filter.
16   */
17  class CInputPin : public InvalidableObject
18  {
19    public:
20      /*!
21       * Constructs an input pin with the specified number of slots
22       * and an associated garbage collector.
23       *
24       * \param gc the garbage collector associated with this input pin
25       * \param slotsCount the number of slots
26       */
27      CInputPin(CGarbageCollector& gc, size_t slotsCount);
28
29      /*!
30       * Sets the trigger for a specific input slot.
31       *
32       * \param inputSlot the input slot number
33       * \param trigger the corresponding trigger
34       */
35      void virtual setInputTrigger(size_t inputSlot, COutputPin* trigger);
36
37      /*!
38       * Receives a data packet from an upstream filter on
39       * the specified input slot.
40       * The receiving filter takes ownership of the packet.
41       *
42       * \param inputSlot the input slot number
43       * \param packet the data packet to be received
44       */
45      void setInput(size_t inputSlot, CDataPacketPtr packet);
46
47      /*!
48       * Triggers the input of any buffered packet for the specified timestamp.
49       *
50       * \param timestamp the timestamp for which we are triggering the input
51       */
52      void virtual trigger(Time timestamp);
53
54      /*!
55       * Tests if the pin can be triggered.
56       *
57       * \return true if the pin can be triggered
58       */
59      bool virtual canBeTriggered() const;
60
61      /*!
62       * Removes all pending packets which are older than the specified timestamp.
63       *
64       * \param timestamp the timestamp used for invalidation
65       */
66      void virtual invalidate(Time timestamp);
67
68    protected:
69      /*!
70       * Function triggered when all slots have been filled for a specific timestamp.
71       * It should be implemented by the filter class to process the data.
72       *
73       * \param data a vector of packets corresponding to each slot
74       */
75      void virtual onInputReady(std::vector<CDataPacketPtr> data) = 0;
76
77    private:
78      /*!
79       * Helper structure, groups a vector of packets corresponding to each slot
80       * with the number of slots currently filled
81       */
82      struct InputBuffer
83      {
84        size_t slotsFilled; //!< Number of slots currently filled
85        std::vector<CDataPacketPtr> packets; //< Vector of packets corresponding to each slot
86
87        /*!
88         * Initialize an empty input buffer for the specified number of slots.
89         *
90         * \param slotsCount the number of slots
91         */
92        InputBuffer(size_t slotsCount)
93          : slotsFilled(0)
94          , packets(slotsCount)
95        { /* Nothing to do */ };
96      };
97
98      CGarbageCollector& gc; //!< The garbage collector associated to the input pin
99
100      size_t slotsCount; //!< The number of slots
101
102      //! Input buffer, store the packets until all slots are full for a timestep
103      std::map<Time, InputBuffer> inputs;
104
105      //! Store the triggers corresponding to the input slots
106      std::vector<COutputPin*> triggers;
107
108      //! Whether some triggers have been set
109      bool hasTriggers;
110  }; // class CInputPin
111} // namespace xios
112
113#endif //__XIOS_CInputPin__
Note: See TracBrowser for help on using the repository browser.