Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2026-09-23 09:33:04

0001 
0002 // Copyright 2020, Jefferson Science Associates, LLC.
0003 // Subject to the terms in the LICENSE file found in the top-level directory.
0004 
0005 #pragma once
0006 
0007 #include <memory>
0008 
0009 #include <JANA/JService.h>
0010 #include <JANA/Services/JParameterManager.h>
0011 #include <JANA/Services/JComponentManager.h>
0012 #include <JANA/Topology/JEventQueue.h>
0013 #include <JANA/Topology/JEventPool.h>
0014 #include <JANA/Utils/JEventLevel.h>
0015 #include <JANA/Utils/JProcessorMapping.h>
0016 
0017 
0018 class JParameterManager;
0019 class JComponentManager;
0020 class JArrow;
0021 class JFoldArrow;
0022 class JUnfoldArrow;
0023 class JTapArrow;
0024 
0025 class JTopologyBuilder : public JService {
0026     // Services
0027     Service<JParameterManager> m_params {this};
0028     std::shared_ptr<JComponentManager> m_components;
0029 
0030     // The topology itself
0031     std::vector<JArrow*> arrows;
0032     std::vector<JEventQueue*> queues;            // Queues shared between arrows
0033     std::vector<JEventPool*> pools;          // Pools shared between arrows
0034 
0035     std::map<std::string, JArrow*> arrow_lookup;
0036     std::map<JEventLevel, JEventPool*> pool_lookup;
0037 
0038     // Topology configuration
0039     std::map<JEventLevel, size_t> m_max_inflight_events;
0040     size_t m_location_count = 1;
0041     //bool m_enable_stealing = false;
0042     int m_affinity = 0;
0043     int m_locality = 0;
0044 
0045     std::function<void(JTopologyBuilder&, JComponentManager&)> m_configure_topology;
0046     JProcessorMapping mapping;
0047 
0048 public:
0049 
0050     JTopologyBuilder();
0051     ~JTopologyBuilder() override;
0052 
0053     void Init() override;
0054 
0055     void AddArrow(JArrow* arrow);
0056     JArrow* GetArrow(const std::string& arrow_name);
0057     JEventPool* GetOrCreatePool(JEventLevel level);
0058 
0059     void ConnectQueue(std::string upstream_arrow_name, std::string upstream_port_name,
0060                       std::string downstream_arrow_name, std::string downstream_port_name);
0061 
0062     void ConnectPool(std::string arrow_name, std::string port_name, JEventLevel level);
0063 
0064     void ConnectPool(JEventLevel upstream_level, JEventLevel downstream_level);
0065 
0066 
0067     /// SetConfigureFn() lets the user manually set up a topology after all components have been loaded.
0068     /// This is meant to be used with AddArrow(), ConnectPool(), and ConnectQueue().
0069     void SetConfigureFn(std::function<void(JTopologyBuilder&, JComponentManager&)> configure_fn);
0070 
0071     void CreateTopology();
0072     void CreateTopologyFromScratch();
0073 
0074     std::string PrintTopology();
0075 
0076     const std::vector<JArrow*>& GetArrows() { return arrows; };
0077     const std::vector<JEventPool*>& GetPools() { return pools; };
0078     const std::vector<JEventQueue*>& GetQueues() { return queues; };
0079     const JProcessorMapping& GetProcessorMapping() { return mapping; };
0080 
0081 private:
0082     void Connect(JArrow* upstream, size_t upstream_port_id, JArrow* downstream, size_t downstream_port_id);
0083     std::pair<JTapArrow*, JTapArrow*> CreateTapChain(std::vector<JEventProcessor*>& procs, std::string name);
0084 };
0085 
0086