process.cc revision 13196
112952Sgabeblack@google.com/*
212952Sgabeblack@google.com * Copyright 2018 Google, Inc.
312952Sgabeblack@google.com *
412952Sgabeblack@google.com * Redistribution and use in source and binary forms, with or without
512952Sgabeblack@google.com * modification, are permitted provided that the following conditions are
612952Sgabeblack@google.com * met: redistributions of source code must retain the above copyright
712952Sgabeblack@google.com * notice, this list of conditions and the following disclaimer;
812952Sgabeblack@google.com * redistributions in binary form must reproduce the above copyright
912952Sgabeblack@google.com * notice, this list of conditions and the following disclaimer in the
1012952Sgabeblack@google.com * documentation and/or other materials provided with the distribution;
1112952Sgabeblack@google.com * neither the name of the copyright holders nor the names of its
1212952Sgabeblack@google.com * contributors may be used to endorse or promote products derived from
1312952Sgabeblack@google.com * this software without specific prior written permission.
1412952Sgabeblack@google.com *
1512952Sgabeblack@google.com * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
1612952Sgabeblack@google.com * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
1712952Sgabeblack@google.com * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
1812952Sgabeblack@google.com * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
1912952Sgabeblack@google.com * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
2012952Sgabeblack@google.com * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
2112952Sgabeblack@google.com * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
2212952Sgabeblack@google.com * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
2312952Sgabeblack@google.com * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2412952Sgabeblack@google.com * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
2512952Sgabeblack@google.com * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2612952Sgabeblack@google.com *
2712952Sgabeblack@google.com * Authors: Gabe Black
2812952Sgabeblack@google.com */
2912952Sgabeblack@google.com
3012952Sgabeblack@google.com#include "systemc/core/process.hh"
3112957Sgabeblack@google.com
3212957Sgabeblack@google.com#include "base/logging.hh"
3312957Sgabeblack@google.com#include "systemc/core/event.hh"
3412953Sgabeblack@google.com#include "systemc/core/scheduler.hh"
3513196Sgabeblack@google.com#include "systemc/ext/core/sc_join.hh"
3613102Sgabeblack@google.com#include "systemc/ext/core/sc_main.hh"
3712998Sgabeblack@google.com#include "systemc/ext/core/sc_process_handle.hh"
3812998Sgabeblack@google.com#include "systemc/ext/utils/sc_report_handler.hh"
3912952Sgabeblack@google.com
4012952Sgabeblack@google.comnamespace sc_gem5
4112952Sgabeblack@google.com{
4212952Sgabeblack@google.com
4312957Sgabeblack@google.comSensitivityTimeout::SensitivityTimeout(Process *p, ::sc_core::sc_time t) :
4413063Sgabeblack@google.com    Sensitivity(p), timeoutEvent([this]() { this->timeout(); })
4512957Sgabeblack@google.com{
4613063Sgabeblack@google.com    scheduler.schedule(&timeoutEvent, t);
4712957Sgabeblack@google.com}
4812957Sgabeblack@google.com
4912957Sgabeblack@google.comSensitivityTimeout::~SensitivityTimeout()
5012957Sgabeblack@google.com{
5112957Sgabeblack@google.com    if (timeoutEvent.scheduled())
5212962Sgabeblack@google.com        scheduler.deschedule(&timeoutEvent);
5312962Sgabeblack@google.com}
5412962Sgabeblack@google.com
5512962Sgabeblack@google.comvoid
5612962Sgabeblack@google.comSensitivityTimeout::timeout()
5712962Sgabeblack@google.com{
5812962Sgabeblack@google.com    notify();
5912957Sgabeblack@google.com}
6012957Sgabeblack@google.com
6112957Sgabeblack@google.comSensitivityEvent::SensitivityEvent(
6212957Sgabeblack@google.com        Process *p, const ::sc_core::sc_event *e) : Sensitivity(p), event(e)
6312957Sgabeblack@google.com{
6412957Sgabeblack@google.com    Event::getFromScEvent(event)->addSensitivity(this);
6512957Sgabeblack@google.com}
6612957Sgabeblack@google.com
6712957Sgabeblack@google.comSensitivityEvent::~SensitivityEvent()
6812957Sgabeblack@google.com{
6912957Sgabeblack@google.com    Event::getFromScEvent(event)->delSensitivity(this);
7012957Sgabeblack@google.com}
7112957Sgabeblack@google.com
7212957Sgabeblack@google.comSensitivityEventAndList::SensitivityEventAndList(
7312957Sgabeblack@google.com        Process *p, const ::sc_core::sc_event_and_list *list) :
7412957Sgabeblack@google.com    Sensitivity(p), list(list), count(0)
7512957Sgabeblack@google.com{
7612957Sgabeblack@google.com    for (auto e: list->events)
7712957Sgabeblack@google.com        Event::getFromScEvent(e)->addSensitivity(this);
7812957Sgabeblack@google.com}
7912957Sgabeblack@google.com
8012957Sgabeblack@google.comSensitivityEventAndList::~SensitivityEventAndList()
8112957Sgabeblack@google.com{
8212957Sgabeblack@google.com    for (auto e: list->events)
8312957Sgabeblack@google.com        Event::getFromScEvent(e)->delSensitivity(this);
8412957Sgabeblack@google.com}
8512957Sgabeblack@google.com
8612957Sgabeblack@google.comvoid
8712957Sgabeblack@google.comSensitivityEventAndList::notifyWork(Event *e)
8812957Sgabeblack@google.com{
8912957Sgabeblack@google.com    e->delSensitivity(this);
9012957Sgabeblack@google.com    count++;
9112957Sgabeblack@google.com    if (count == list->events.size())
9213189Sgabeblack@google.com        satisfy();
9312957Sgabeblack@google.com}
9412957Sgabeblack@google.com
9512957Sgabeblack@google.comSensitivityEventOrList::SensitivityEventOrList(
9612957Sgabeblack@google.com        Process *p, const ::sc_core::sc_event_or_list *list) :
9712957Sgabeblack@google.com    Sensitivity(p), list(list)
9812957Sgabeblack@google.com{
9912957Sgabeblack@google.com    for (auto e: list->events)
10012957Sgabeblack@google.com        Event::getFromScEvent(e)->addSensitivity(this);
10112957Sgabeblack@google.com}
10212957Sgabeblack@google.com
10312957Sgabeblack@google.comSensitivityEventOrList::~SensitivityEventOrList()
10412957Sgabeblack@google.com{
10512957Sgabeblack@google.com    for (auto e: list->events)
10612957Sgabeblack@google.com        Event::getFromScEvent(e)->delSensitivity(this);
10712957Sgabeblack@google.com}
10812957Sgabeblack@google.com
10913075Sgabeblack@google.comvoid
11013075Sgabeblack@google.comSensitivityTimeoutAndEventAndList::notifyWork(Event *e)
11113075Sgabeblack@google.com{
11213075Sgabeblack@google.com    if (e) {
11313075Sgabeblack@google.com        // An event went off which must be part of the sc_event_and_list.
11413075Sgabeblack@google.com        SensitivityEventAndList::notifyWork(e);
11513075Sgabeblack@google.com    } else {
11613075Sgabeblack@google.com        // There's no inciting event, so this must be a timeout.
11713189Sgabeblack@google.com        satisfy(true);
11813075Sgabeblack@google.com    }
11913075Sgabeblack@google.com}
12013075Sgabeblack@google.com
12112957Sgabeblack@google.com
12212952Sgabeblack@google.comclass UnwindExceptionReset : public ::sc_core::sc_unwind_exception
12312952Sgabeblack@google.com{
12412952Sgabeblack@google.com  public:
12512995Sgabeblack@google.com    UnwindExceptionReset() { _isReset = true; }
12612952Sgabeblack@google.com};
12712952Sgabeblack@google.com
12812952Sgabeblack@google.comclass UnwindExceptionKill : public ::sc_core::sc_unwind_exception
12912952Sgabeblack@google.com{
13012952Sgabeblack@google.com  public:
13112995Sgabeblack@google.com    UnwindExceptionKill() {}
13212952Sgabeblack@google.com};
13312952Sgabeblack@google.com
13412952Sgabeblack@google.comtemplate <typename T>
13512952Sgabeblack@google.comstruct BuiltinExceptionWrapper : public ExceptionWrapperBase
13612952Sgabeblack@google.com{
13712952Sgabeblack@google.com  public:
13812952Sgabeblack@google.com    T t;
13912952Sgabeblack@google.com    void throw_it() override { throw t; }
14012952Sgabeblack@google.com};
14112952Sgabeblack@google.com
14212952Sgabeblack@google.comBuiltinExceptionWrapper<UnwindExceptionReset> resetException;
14312952Sgabeblack@google.comBuiltinExceptionWrapper<UnwindExceptionKill> killException;
14412952Sgabeblack@google.com
14512952Sgabeblack@google.com
14612952Sgabeblack@google.comvoid
14712952Sgabeblack@google.comProcess::forEachKid(const std::function<void(Process *)> &work)
14812952Sgabeblack@google.com{
14912952Sgabeblack@google.com    for (auto &kid: get_child_objects()) {
15012952Sgabeblack@google.com        Process *p_kid = dynamic_cast<Process *>(kid);
15112952Sgabeblack@google.com        if (p_kid)
15212952Sgabeblack@google.com            work(p_kid);
15312952Sgabeblack@google.com    }
15412952Sgabeblack@google.com}
15512952Sgabeblack@google.com
15612952Sgabeblack@google.comvoid
15712952Sgabeblack@google.comProcess::suspend(bool inc_kids)
15812952Sgabeblack@google.com{
15912952Sgabeblack@google.com    if (inc_kids)
16012952Sgabeblack@google.com        forEachKid([](Process *p) { p->suspend(true); });
16112952Sgabeblack@google.com
16212952Sgabeblack@google.com    if (!_suspended) {
16312952Sgabeblack@google.com        _suspended = true;
16413133Sgabeblack@google.com        _suspendedReady = scheduler.suspend(this);
16512952Sgabeblack@google.com
16613133Sgabeblack@google.com        if (procKind() != ::sc_core::SC_METHOD_PROC_ &&
16713133Sgabeblack@google.com                scheduler.current() == this) {
16813133Sgabeblack@google.com            // This isn't in the spec, but Accellera says that a thread that
16913133Sgabeblack@google.com            // self suspends should be marked ready immediately when it's
17013133Sgabeblack@google.com            // resumed.
17113133Sgabeblack@google.com            _suspendedReady = true;
17213133Sgabeblack@google.com            scheduler.yield();
17313133Sgabeblack@google.com        }
17412952Sgabeblack@google.com    }
17512952Sgabeblack@google.com}
17612952Sgabeblack@google.com
17712952Sgabeblack@google.comvoid
17812952Sgabeblack@google.comProcess::resume(bool inc_kids)
17912952Sgabeblack@google.com{
18012952Sgabeblack@google.com    if (inc_kids)
18112952Sgabeblack@google.com        forEachKid([](Process *p) { p->resume(true); });
18212952Sgabeblack@google.com
18312952Sgabeblack@google.com    if (_suspended) {
18412952Sgabeblack@google.com        _suspended = false;
18512959Sgabeblack@google.com        if (_suspendedReady)
18613133Sgabeblack@google.com            scheduler.resume(this);
18712959Sgabeblack@google.com        _suspendedReady = false;
18812952Sgabeblack@google.com    }
18912952Sgabeblack@google.com}
19012952Sgabeblack@google.com
19112952Sgabeblack@google.comvoid
19212952Sgabeblack@google.comProcess::disable(bool inc_kids)
19312952Sgabeblack@google.com{
19412952Sgabeblack@google.com    if (inc_kids)
19512952Sgabeblack@google.com        forEachKid([](Process *p) { p->disable(true); });
19612952Sgabeblack@google.com
19712999Sgabeblack@google.com    if (!::sc_core::sc_allow_process_control_corners &&
19812999Sgabeblack@google.com            dynamic_cast<SensitivityTimeout *>(dynamicSensitivity)) {
19912999Sgabeblack@google.com        std::string message("attempt to disable a thread with timeout wait: ");
20012999Sgabeblack@google.com        message += name();
20112999Sgabeblack@google.com        SC_REPORT_ERROR("Undefined process control interaction",
20212999Sgabeblack@google.com                message.c_str());
20312999Sgabeblack@google.com    }
20412999Sgabeblack@google.com
20512952Sgabeblack@google.com    _disabled = true;
20612952Sgabeblack@google.com}
20712952Sgabeblack@google.com
20812952Sgabeblack@google.comvoid
20912952Sgabeblack@google.comProcess::enable(bool inc_kids)
21012952Sgabeblack@google.com{
21112952Sgabeblack@google.com
21212952Sgabeblack@google.com    if (inc_kids)
21312952Sgabeblack@google.com        forEachKid([](Process *p) { p->enable(true); });
21412952Sgabeblack@google.com
21512952Sgabeblack@google.com    _disabled = false;
21612952Sgabeblack@google.com}
21712952Sgabeblack@google.com
21812952Sgabeblack@google.comvoid
21912952Sgabeblack@google.comProcess::kill(bool inc_kids)
22012952Sgabeblack@google.com{
22113102Sgabeblack@google.com    if (::sc_core::sc_get_status() != ::sc_core::SC_RUNNING) {
22213102Sgabeblack@google.com        SC_REPORT_ERROR(
22313102Sgabeblack@google.com                "(E572) a process may not be killed before it is initialized",
22413102Sgabeblack@google.com                name());
22513102Sgabeblack@google.com    }
22613102Sgabeblack@google.com
22712952Sgabeblack@google.com    // Propogate the kill to our children no matter what happens to us.
22812952Sgabeblack@google.com    if (inc_kids)
22912952Sgabeblack@google.com        forEachKid([](Process *p) { p->kill(true); });
23012952Sgabeblack@google.com
23112952Sgabeblack@google.com    // If we're in the middle of unwinding, ignore the kill request.
23212952Sgabeblack@google.com    if (_isUnwinding)
23312952Sgabeblack@google.com        return;
23412952Sgabeblack@google.com
23512995Sgabeblack@google.com    // Update our state.
23612998Sgabeblack@google.com    terminate();
23712995Sgabeblack@google.com    _isUnwinding = true;
23812995Sgabeblack@google.com
23912998Sgabeblack@google.com    // Make sure this process isn't marked ready
24012998Sgabeblack@google.com    popListNode();
24112998Sgabeblack@google.com
24212998Sgabeblack@google.com    // Inject the kill exception into this process if it's started.
24312998Sgabeblack@google.com    if (!_needsStart)
24412998Sgabeblack@google.com        injectException(killException);
24512952Sgabeblack@google.com}
24612952Sgabeblack@google.com
24712952Sgabeblack@google.comvoid
24812952Sgabeblack@google.comProcess::reset(bool inc_kids)
24912952Sgabeblack@google.com{
25013102Sgabeblack@google.com    if (::sc_core::sc_get_status() != ::sc_core::SC_RUNNING) {
25113102Sgabeblack@google.com        SC_REPORT_ERROR(
25213102Sgabeblack@google.com                "(E573) a process may not be asynchronously reset while"
25313102Sgabeblack@google.com                "the simulation is not running", name());
25413102Sgabeblack@google.com    }
25513102Sgabeblack@google.com
25612952Sgabeblack@google.com    // Propogate the reset to our children no matter what happens to us.
25712952Sgabeblack@google.com    if (inc_kids)
25812952Sgabeblack@google.com        forEachKid([](Process *p) { p->reset(true); });
25912952Sgabeblack@google.com
26012952Sgabeblack@google.com    // If we're in the middle of unwinding, ignore the reset request.
26112952Sgabeblack@google.com    if (_isUnwinding)
26212952Sgabeblack@google.com        return;
26312952Sgabeblack@google.com
26412995Sgabeblack@google.com
26512998Sgabeblack@google.com    if (_needsStart) {
26612998Sgabeblack@google.com        scheduler.runNow(this);
26712998Sgabeblack@google.com    } else {
26812998Sgabeblack@google.com        _isUnwinding = true;
26912998Sgabeblack@google.com        injectException(resetException);
27012998Sgabeblack@google.com    }
27112952Sgabeblack@google.com
27212952Sgabeblack@google.com    _resetEvent.notify();
27312952Sgabeblack@google.com}
27412952Sgabeblack@google.com
27512952Sgabeblack@google.comvoid
27612952Sgabeblack@google.comProcess::throw_it(ExceptionWrapperBase &exc, bool inc_kids)
27712952Sgabeblack@google.com{
27813102Sgabeblack@google.com    if (::sc_core::sc_get_status() != ::sc_core::SC_RUNNING) {
27913102Sgabeblack@google.com        SC_REPORT_ERROR(
28013102Sgabeblack@google.com                "(E574) throw_it not allowed unless simulation is running ",
28113102Sgabeblack@google.com                name());
28213102Sgabeblack@google.com    }
28313102Sgabeblack@google.com
28412952Sgabeblack@google.com    if (inc_kids)
28512952Sgabeblack@google.com        forEachKid([&exc](Process *p) { p->throw_it(exc, true); });
28612998Sgabeblack@google.com
28712998Sgabeblack@google.com    // Only inject an exception into threads that have started.
28812998Sgabeblack@google.com    if (!_needsStart)
28912998Sgabeblack@google.com        injectException(exc);
29012952Sgabeblack@google.com}
29112952Sgabeblack@google.com
29212952Sgabeblack@google.comvoid
29312952Sgabeblack@google.comProcess::injectException(ExceptionWrapperBase &exc)
29412952Sgabeblack@google.com{
29512952Sgabeblack@google.com    excWrapper = &exc;
29612995Sgabeblack@google.com    scheduler.runNow(this);
29712952Sgabeblack@google.com};
29812952Sgabeblack@google.com
29912952Sgabeblack@google.comvoid
30012952Sgabeblack@google.comProcess::syncResetOn(bool inc_kids)
30112952Sgabeblack@google.com{
30212952Sgabeblack@google.com    if (inc_kids)
30312952Sgabeblack@google.com        forEachKid([](Process *p) { p->syncResetOn(true); });
30412952Sgabeblack@google.com
30512952Sgabeblack@google.com    _syncReset = true;
30612952Sgabeblack@google.com}
30712952Sgabeblack@google.com
30812952Sgabeblack@google.comvoid
30912952Sgabeblack@google.comProcess::syncResetOff(bool inc_kids)
31012952Sgabeblack@google.com{
31112952Sgabeblack@google.com    if (inc_kids)
31212952Sgabeblack@google.com        forEachKid([](Process *p) { p->syncResetOff(true); });
31312952Sgabeblack@google.com
31412952Sgabeblack@google.com    _syncReset = false;
31512952Sgabeblack@google.com}
31612952Sgabeblack@google.com
31712952Sgabeblack@google.comvoid
31812957Sgabeblack@google.comProcess::finalize()
31912957Sgabeblack@google.com{
32012957Sgabeblack@google.com    for (auto &s: pendingStaticSensitivities) {
32112957Sgabeblack@google.com        s->finalize(staticSensitivities);
32212957Sgabeblack@google.com        delete s;
32312957Sgabeblack@google.com        s = nullptr;
32412957Sgabeblack@google.com    }
32512957Sgabeblack@google.com    pendingStaticSensitivities.clear();
32612957Sgabeblack@google.com};
32712957Sgabeblack@google.com
32812957Sgabeblack@google.comvoid
32912953Sgabeblack@google.comProcess::run()
33012952Sgabeblack@google.com{
33112953Sgabeblack@google.com    bool reset;
33212953Sgabeblack@google.com    do {
33312953Sgabeblack@google.com        reset = false;
33412953Sgabeblack@google.com        try {
33512953Sgabeblack@google.com            func->call();
33613175Sgabeblack@google.com        } catch(ScHalt) {
33713175Sgabeblack@google.com            std::cout << "Terminating process " << name() << std::endl;
33812995Sgabeblack@google.com        } catch(const ::sc_core::sc_unwind_exception &exc) {
33912953Sgabeblack@google.com            reset = exc.is_reset();
34012995Sgabeblack@google.com            _isUnwinding = false;
34113182Sgabeblack@google.com        } catch (...) {
34213182Sgabeblack@google.com            throw;
34312953Sgabeblack@google.com        }
34412953Sgabeblack@google.com    } while (reset);
34513093Sgabeblack@google.com    needsStart(true);
34612953Sgabeblack@google.com}
34712952Sgabeblack@google.com
34812957Sgabeblack@google.comvoid
34912957Sgabeblack@google.comProcess::addStatic(PendingSensitivity *s)
35012957Sgabeblack@google.com{
35112957Sgabeblack@google.com    pendingStaticSensitivities.push_back(s);
35212957Sgabeblack@google.com}
35312957Sgabeblack@google.com
35412957Sgabeblack@google.comvoid
35512957Sgabeblack@google.comProcess::setDynamic(Sensitivity *s)
35612957Sgabeblack@google.com{
35712957Sgabeblack@google.com    delete dynamicSensitivity;
35812957Sgabeblack@google.com    dynamicSensitivity = s;
35912957Sgabeblack@google.com}
36012957Sgabeblack@google.com
36112959Sgabeblack@google.comvoid
36212959Sgabeblack@google.comProcess::satisfySensitivity(Sensitivity *s)
36312959Sgabeblack@google.com{
36412959Sgabeblack@google.com    // If there's a dynamic sensitivity and this wasn't it, ignore.
36512959Sgabeblack@google.com    if (dynamicSensitivity && dynamicSensitivity != s)
36612959Sgabeblack@google.com        return;
36712959Sgabeblack@google.com
36812959Sgabeblack@google.com    setDynamic(nullptr);
36912959Sgabeblack@google.com    ready();
37012959Sgabeblack@google.com}
37112959Sgabeblack@google.com
37212959Sgabeblack@google.comvoid
37312959Sgabeblack@google.comProcess::ready()
37412959Sgabeblack@google.com{
37512996Sgabeblack@google.com    if (disabled())
37612996Sgabeblack@google.com        return;
37712959Sgabeblack@google.com    if (suspended())
37812959Sgabeblack@google.com        _suspendedReady = true;
37912959Sgabeblack@google.com    else
38012959Sgabeblack@google.com        scheduler.ready(this);
38112959Sgabeblack@google.com}
38212959Sgabeblack@google.com
38312997Sgabeblack@google.comvoid
38412997Sgabeblack@google.comProcess::lastReport(::sc_core::sc_report *report)
38512997Sgabeblack@google.com{
38612997Sgabeblack@google.com    if (report) {
38712997Sgabeblack@google.com        _lastReport = std::unique_ptr<::sc_core::sc_report>(
38812997Sgabeblack@google.com                new ::sc_core::sc_report(*report));
38912997Sgabeblack@google.com    } else {
39012997Sgabeblack@google.com        _lastReport = nullptr;
39112997Sgabeblack@google.com    }
39212997Sgabeblack@google.com}
39312997Sgabeblack@google.com
39412997Sgabeblack@google.com::sc_core::sc_report *Process::lastReport() const { return _lastReport.get(); }
39512997Sgabeblack@google.com
39613180Sgabeblack@google.comProcess::Process(const char *name, ProcessFuncWrapper *func, bool internal) :
39713087Sgabeblack@google.com    ::sc_core::sc_process_b(name), excWrapper(nullptr), func(func),
39813194Sgabeblack@google.com    _internal(internal), _timedOut(false), _dontInitialize(false),
39913194Sgabeblack@google.com    _needsStart(true), _isUnwinding(false), _terminated(false),
40013194Sgabeblack@google.com    _suspended(false), _disabled(false), _syncReset(false), refCount(0),
40113189Sgabeblack@google.com    stackSize(::Fiber::DefaultStackSize), dynamicSensitivity(nullptr)
40212953Sgabeblack@google.com{
40313131Sgabeblack@google.com    _dynamic =
40413131Sgabeblack@google.com            (::sc_core::sc_get_status() >
40513131Sgabeblack@google.com             ::sc_core::SC_BEFORE_END_OF_ELABORATION);
40612953Sgabeblack@google.com    _newest = this;
40712953Sgabeblack@google.com}
40812952Sgabeblack@google.com
40912998Sgabeblack@google.comvoid
41012998Sgabeblack@google.comProcess::terminate()
41112998Sgabeblack@google.com{
41212998Sgabeblack@google.com    _terminated = true;
41312998Sgabeblack@google.com    _suspendedReady = false;
41412998Sgabeblack@google.com    _suspended = false;
41512998Sgabeblack@google.com    _syncReset = false;
41612998Sgabeblack@google.com    delete dynamicSensitivity;
41712998Sgabeblack@google.com    dynamicSensitivity = nullptr;
41812998Sgabeblack@google.com    for (auto s: staticSensitivities)
41912998Sgabeblack@google.com        delete s;
42012998Sgabeblack@google.com    staticSensitivities.clear();
42113006Sgabeblack@google.com
42213006Sgabeblack@google.com    _terminatedEvent.notify();
42313196Sgabeblack@google.com
42413196Sgabeblack@google.com    for (auto jw: joinWaiters)
42513196Sgabeblack@google.com        jw->signal();
42613196Sgabeblack@google.com    joinWaiters.clear();
42712998Sgabeblack@google.com}
42812998Sgabeblack@google.com
42912953Sgabeblack@google.comProcess *Process::_newest;
43012952Sgabeblack@google.com
43112952Sgabeblack@google.comvoid
43212952Sgabeblack@google.comthrow_it_wrapper(Process *p, ExceptionWrapperBase &exc, bool inc_kids)
43312952Sgabeblack@google.com{
43412952Sgabeblack@google.com    p->throw_it(exc, inc_kids);
43512952Sgabeblack@google.com}
43612952Sgabeblack@google.com
43712952Sgabeblack@google.com} // namespace sc_gem5
438