SST 12.1.0
Structural Simulation Toolkit
exit.h
1// Copyright 2009-2022 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-2022, 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
22namespace SST {
23
24#define _EXIT_DBG(fmt, args...) __DBG(DBG_EXIT, Exit, fmt, ##args)
25
26class Simulation;
27class TimeConverter;
28
29/**
30 * Exit Event Action
31 *
32 * Causes the simulation to halt
33 */
34class Exit : public Action
35{
36public:
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
75private:
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
An Action is a schedulable Activity which is not an Event.
Definition: action.h:27
SimTime_t getDeliveryTime() const
Return the time at which this Activity will be delivered.
Definition: activity.h:144
int getPriority() const
Return the Priority of this Activity.
Definition: activity.h:147
Definition: threadsafe.h:122
Exit Event Action.
Definition: exit.h:35
bool refDec(ComponentId_t, uint32_t thread)
Decrement Reference Count for a given Component ID.
Definition: exit.cc:87
void execute(void) override
Function which will be called when the time for this Activity comes to pass.
Definition: exit.cc:133
bool refInc(ComponentId_t, uint32_t thread)
Increment Reference Count for a given Component ID.
Definition: exit.cc:52
Output object provides consistent method for outputting data to stdout, stderr and/or sst debug file.
Definition: output.h:52
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