SST  13.0.0
StructuralSimulationToolkit
exit.h
1 // Copyright 2009-2023 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-2023, 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 #include "sst/core/threadsafe.h"
18 
19 #include <cinttypes>
20 #include <unordered_set>
21 
22 namespace SST {
23 
24 #define _EXIT_DBG(fmt, args...) __DBG(DBG_EXIT, Exit, fmt, ##args)
25 
26 class Simulation;
27 class TimeConverter;
28 
29 /**
30  * Exit Event Action
31  *
32  * Causes the simulation to halt
33  */
34 class Exit : public Action
35 {
36 public:
37  /**
38  * Create a new ExitEvent
39  * @param sim - Simulation Object
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, 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  std::unordered_set<ComponentId_t> m_idSet;
88  SimTime_t end_time;
89 
91 
92  bool single_rank;
93 };
94 
95 } // namespace SST
96 
97 #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
int getPriority() const
Return the Priority of this Activity.
Definition: activity.h:147
bool refInc(ComponentId_t, uint32_t thread)
Increment Reference Count for a given Component ID.
Definition: exit.cc:52
bool refDec(ComponentId_t, uint32_t thread)
Decrement Reference Count for a given Component ID.
Definition: exit.cc:87
Definition: action.cc:18
Exit Event Action.
Definition: exit.h:34
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
SimTime_t getDeliveryTime() const
Return the time at which this Activity will be delivered.
Definition: activity.h:144
Definition: threadsafe.h:121
void execute(void) override
Function which will be called when the time for this Activity comes to pass.
Definition: exit.cc:133