SST  11.1.0
StructuralSimulationToolkit
exit.h
1 // Copyright 2009-2021 NTESS. Under the terms
2 // of Contract DE-NA0003525 with NTESS, the U.S.
3 // Government retains certain rights in this software.
4 //
5 // Copyright (c) 2009-2021, NTESS
6 // All rights reserved.
7 //
8 // This file is part of the SST software package. For license
9 // information, see the LICENSE file in the top level directory of the
10 // distribution.
11 
12 #ifndef SST_CORE_CORE_EXIT_H
13 #define SST_CORE_CORE_EXIT_H
14 
15 #include "sst/core/action.h"
16 #include "sst/core/sst_types.h"
17 
18 #include <cinttypes>
19 #include <unordered_set>
20 
21 namespace SST {
22 
23 #define _EXIT_DBG(fmt, args...) __DBG(DBG_EXIT, Exit, fmt, ##args)
24 
25 class Simulation;
26 class TimeConverter;
27 
28 /**
29  * Exit Event Action
30  *
31  * Causes the simulation to halt
32  */
33 class Exit : public Action
34 {
35 public:
36  /**
37  * Create a new ExitEvent
38  * @param sim - Simulation Object
39  * @param period - Period upon which to check for exit status
40  * @param single_rank - True if there are no parallel ranks
41  *
42  * Exit needs to register a handler during constructor time, which
43  * requires a simulation object. But the simulation class creates
44  * an Exit object during it's construction, meaning that
45  * Simulation::getSimulation() won't work yet. So Exit is the one
46  * exception to the "constructors shouldn't take simulation
47  * pointers" rule. However, it still needs to follow the "classes
48  * shouldn't contain pointers back to Simulation" rule.
49  */
50  Exit(int num_threads, TimeConverter* period, bool single_rank);
51  ~Exit();
52 
53  /** Increment Reference Count for a given Component ID */
54  bool refInc(ComponentId_t, uint32_t thread);
55  /** Decrement Reference Count for a given Component ID */
56  bool refDec(ComponentId_t, uint32_t thread);
57 
58  unsigned int getRefCount();
59  SimTime_t getEndTime() { return end_time; }
60  void setEndTime(SimTime_t time) { end_time = time; }
61 
62  SimTime_t computeEndTime();
63  void execute(void) override;
64  void check();
65 
66  void print(const std::string& header, Output& out) const override
67  {
68  out.output(
69  "%s Exit Action to be delivered at %" PRIu64 " with priority %d\n", header.c_str(), getDeliveryTime(),
70  getPriority());
71  }
72 
73  unsigned int getGlobalCount() { return global_count; }
74 
75 private:
76  Exit() {} // for serialization only
77  Exit(const Exit&); // Don't implement
78  void operator=(Exit const&); // Don't implement
79 
80  // bool handler( Event* );
81 
82  // EventHandler< Exit, bool, Event* >* m_functor;
83  int num_threads;
84  unsigned int m_refCount;
85  unsigned int* m_thread_counts;
86  unsigned int global_count;
87  TimeConverter* m_period;
88  std::unordered_set<ComponentId_t> m_idSet;
89  SimTime_t end_time;
90 
91  Core::ThreadSafe::Spinlock slock;
92 
93  bool single_rank;
94 };
95 
96 } // namespace SST
97 
98 #endif // SST_CORE_EXIT_H
Output object provides consistent method for outputting data to stdout, stderr and/or sst debug file...
Definition: output.h:51
An Action is a schedulable Activity which is not an Event.
Definition: action.h:26
bool refInc(ComponentId_t, uint32_t thread)
Increment Reference Count for a given Component ID.
Definition: exit.cc:55
bool refDec(ComponentId_t, uint32_t thread)
Decrement Reference Count for a given Component ID.
Definition: exit.cc:90
void print(const std::string &header, Output &out) const override
Generic print-print function for this Activity.
Definition: exit.h:66
A class to convert between a component&#39;s view of time and the core&#39;s view of time.
Definition: timeConverter.h:26
Exit Event Action.
Definition: exit.h:33
SimTime_t getDeliveryTime() const
Return the time at which this Activity will be delivered.
Definition: activity.h:329
void output(uint32_t line, const char *file, const char *func, const char *format,...) const
Output the message with formatting as specified by the format parameter.
Definition: output.h:182
int getPriority() const
Return the Priority of this Activity.
Definition: activity.h:332
void execute(void) override
Function which will be called when the time for this Activity comes to pass.
Definition: exit.cc:137
Exit(int num_threads, TimeConverter *period, bool single_rank)
Create a new ExitEvent.
Definition: exit.cc:32