sc_process_handle.cc revision 13317
112838Sgabeblack@google.com/*
212838Sgabeblack@google.com * Copyright 2018 Google, Inc.
312838Sgabeblack@google.com *
412838Sgabeblack@google.com * Redistribution and use in source and binary forms, with or without
512838Sgabeblack@google.com * modification, are permitted provided that the following conditions are
612838Sgabeblack@google.com * met: redistributions of source code must retain the above copyright
712838Sgabeblack@google.com * notice, this list of conditions and the following disclaimer;
812838Sgabeblack@google.com * redistributions in binary form must reproduce the above copyright
912838Sgabeblack@google.com * notice, this list of conditions and the following disclaimer in the
1012838Sgabeblack@google.com * documentation and/or other materials provided with the distribution;
1112838Sgabeblack@google.com * neither the name of the copyright holders nor the names of its
1212838Sgabeblack@google.com * contributors may be used to endorse or promote products derived from
1312838Sgabeblack@google.com * this software without specific prior written permission.
1412838Sgabeblack@google.com *
1512838Sgabeblack@google.com * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
1612838Sgabeblack@google.com * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
1712838Sgabeblack@google.com * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
1812838Sgabeblack@google.com * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
1912838Sgabeblack@google.com * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
2012838Sgabeblack@google.com * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
2112838Sgabeblack@google.com * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
2212838Sgabeblack@google.com * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
2312838Sgabeblack@google.com * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2412838Sgabeblack@google.com * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
2512838Sgabeblack@google.com * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2612838Sgabeblack@google.com *
2712838Sgabeblack@google.com * Authors: Gabe Black
2812838Sgabeblack@google.com */
2912838Sgabeblack@google.com
3012838Sgabeblack@google.com#include "base/logging.hh"
3112952Sgabeblack@google.com#include "systemc/core/process.hh"
3212953Sgabeblack@google.com#include "systemc/core/scheduler.hh"
3313317Sgabeblack@google.com#include "systemc/ext/core/messages.hh"
3412960Sgabeblack@google.com#include "systemc/ext/core/sc_main.hh"
3512838Sgabeblack@google.com#include "systemc/ext/core/sc_process_handle.hh"
3613128Sgabeblack@google.com#include "systemc/ext/utils/sc_report_handler.hh"
3712838Sgabeblack@google.com
3812838Sgabeblack@google.comnamespace sc_core
3912838Sgabeblack@google.com{
4012838Sgabeblack@google.com
4112838Sgabeblack@google.comconst char *
4212838Sgabeblack@google.comsc_unwind_exception::what() const throw()
4312838Sgabeblack@google.com{
4412994Sgabeblack@google.com    return _isReset ? "RESET" : "KILL";
4512838Sgabeblack@google.com}
4612838Sgabeblack@google.com
4712838Sgabeblack@google.combool
4812838Sgabeblack@google.comsc_unwind_exception::is_reset() const
4912838Sgabeblack@google.com{
5012994Sgabeblack@google.com    return _isReset;
5112838Sgabeblack@google.com}
5212838Sgabeblack@google.com
5312994Sgabeblack@google.comsc_unwind_exception::sc_unwind_exception() : _isReset(false) {}
5412994Sgabeblack@google.comsc_unwind_exception::sc_unwind_exception(const sc_unwind_exception &e) :
5512994Sgabeblack@google.com    _isReset(e._isReset)
5612994Sgabeblack@google.com{}
5712952Sgabeblack@google.comsc_unwind_exception::~sc_unwind_exception() throw() {}
5812838Sgabeblack@google.com
5912838Sgabeblack@google.com
6013087Sgabeblack@google.comvoid
6113087Sgabeblack@google.comsc_set_location(const char *file, int lineno)
6212939Sgabeblack@google.com{
6313087Sgabeblack@google.com    sc_process_b *current = ::sc_gem5::scheduler.current();
6413087Sgabeblack@google.com    if (!current)
6513087Sgabeblack@google.com        return;
6613087Sgabeblack@google.com    current->file = file;
6713087Sgabeblack@google.com    current->lineno = lineno;
6812939Sgabeblack@google.com}
6912939Sgabeblack@google.com
7012939Sgabeblack@google.com
7112939Sgabeblack@google.comsc_process_b *
7212939Sgabeblack@google.comsc_get_curr_process_handle()
7312939Sgabeblack@google.com{
7413254Sgabeblack@google.com    return ::sc_gem5::scheduler.current();
7512939Sgabeblack@google.com}
7612939Sgabeblack@google.com
7712939Sgabeblack@google.com
7812952Sgabeblack@google.comsc_process_handle::sc_process_handle() : _gem5_process(nullptr) {}
7912952Sgabeblack@google.com
8012952Sgabeblack@google.comsc_process_handle::sc_process_handle(const sc_process_handle &handle) :
8112952Sgabeblack@google.com    _gem5_process(handle._gem5_process)
8212838Sgabeblack@google.com{
8312952Sgabeblack@google.com    if (_gem5_process)
8412952Sgabeblack@google.com        _gem5_process->incref();
8512838Sgabeblack@google.com}
8612838Sgabeblack@google.com
8712952Sgabeblack@google.comsc_process_handle::sc_process_handle(sc_object *obj) :
8812952Sgabeblack@google.com    _gem5_process(dynamic_cast<::sc_gem5::Process *>(obj))
8912838Sgabeblack@google.com{
9012952Sgabeblack@google.com    if (_gem5_process)
9112952Sgabeblack@google.com        _gem5_process->incref();
9212838Sgabeblack@google.com}
9312838Sgabeblack@google.com
9412838Sgabeblack@google.comsc_process_handle::~sc_process_handle()
9512838Sgabeblack@google.com{
9612952Sgabeblack@google.com    if (_gem5_process)
9712952Sgabeblack@google.com        _gem5_process->decref();
9812838Sgabeblack@google.com}
9912838Sgabeblack@google.com
10012838Sgabeblack@google.com
10112838Sgabeblack@google.combool
10212838Sgabeblack@google.comsc_process_handle::valid() const
10312838Sgabeblack@google.com{
10412952Sgabeblack@google.com    return _gem5_process != nullptr;
10512838Sgabeblack@google.com}
10612838Sgabeblack@google.com
10712838Sgabeblack@google.com
10812838Sgabeblack@google.comsc_process_handle &
10912952Sgabeblack@google.comsc_process_handle::operator = (const sc_process_handle &handle)
11012838Sgabeblack@google.com{
11112952Sgabeblack@google.com    if (_gem5_process)
11212952Sgabeblack@google.com        _gem5_process->decref();
11312952Sgabeblack@google.com    _gem5_process = handle._gem5_process;
11412952Sgabeblack@google.com    if (_gem5_process)
11512952Sgabeblack@google.com        _gem5_process->incref();
11612838Sgabeblack@google.com    return *this;
11712838Sgabeblack@google.com}
11812838Sgabeblack@google.com
11912838Sgabeblack@google.combool
12012952Sgabeblack@google.comsc_process_handle::operator == (const sc_process_handle &handle) const
12112838Sgabeblack@google.com{
12212952Sgabeblack@google.com    return _gem5_process && handle._gem5_process &&
12312952Sgabeblack@google.com        (_gem5_process == handle._gem5_process);
12412838Sgabeblack@google.com}
12512838Sgabeblack@google.com
12612838Sgabeblack@google.combool
12712952Sgabeblack@google.comsc_process_handle::operator != (const sc_process_handle &handle) const
12812838Sgabeblack@google.com{
12912952Sgabeblack@google.com    return !(handle == *this);
13012838Sgabeblack@google.com}
13112838Sgabeblack@google.com
13212838Sgabeblack@google.combool
13312952Sgabeblack@google.comsc_process_handle::operator < (const sc_process_handle &other) const
13412838Sgabeblack@google.com{
13512952Sgabeblack@google.com    return _gem5_process < other._gem5_process;
13612838Sgabeblack@google.com}
13712838Sgabeblack@google.com
13812952Sgabeblack@google.comvoid
13912952Sgabeblack@google.comsc_process_handle::swap(sc_process_handle &handle)
14012838Sgabeblack@google.com{
14112952Sgabeblack@google.com    ::sc_gem5::Process *temp = handle._gem5_process;
14212952Sgabeblack@google.com    handle._gem5_process = _gem5_process;
14312952Sgabeblack@google.com    _gem5_process = temp;
14412838Sgabeblack@google.com}
14512838Sgabeblack@google.com
14612838Sgabeblack@google.com
14712838Sgabeblack@google.comconst char *
14812838Sgabeblack@google.comsc_process_handle::name() const
14912838Sgabeblack@google.com{
15012952Sgabeblack@google.com    return _gem5_process ? _gem5_process->name() : "";
15112838Sgabeblack@google.com}
15212838Sgabeblack@google.com
15312838Sgabeblack@google.comsc_curr_proc_kind
15412838Sgabeblack@google.comsc_process_handle::proc_kind() const
15512838Sgabeblack@google.com{
15612952Sgabeblack@google.com    return _gem5_process ? _gem5_process->procKind() : SC_NO_PROC_;
15712838Sgabeblack@google.com}
15812838Sgabeblack@google.com
15912838Sgabeblack@google.comconst std::vector<sc_object *> &
16012838Sgabeblack@google.comsc_process_handle::get_child_objects() const
16112838Sgabeblack@google.com{
16212952Sgabeblack@google.com    static const std::vector<sc_object *> empty;
16312952Sgabeblack@google.com    return _gem5_process ? _gem5_process->get_child_objects() : empty;
16412838Sgabeblack@google.com}
16512838Sgabeblack@google.com
16612838Sgabeblack@google.comconst std::vector<sc_event *> &
16712838Sgabeblack@google.comsc_process_handle::get_child_events() const
16812838Sgabeblack@google.com{
16912952Sgabeblack@google.com    static const std::vector<sc_event *> empty;
17012952Sgabeblack@google.com    return _gem5_process ? _gem5_process->get_child_events() : empty;
17112838Sgabeblack@google.com}
17212838Sgabeblack@google.com
17312838Sgabeblack@google.comsc_object *
17412838Sgabeblack@google.comsc_process_handle::get_parent_object() const
17512838Sgabeblack@google.com{
17612952Sgabeblack@google.com    return _gem5_process ? _gem5_process->get_parent_object() : nullptr;
17712838Sgabeblack@google.com}
17812838Sgabeblack@google.com
17912838Sgabeblack@google.comsc_object *
18012838Sgabeblack@google.comsc_process_handle::get_process_object() const
18112838Sgabeblack@google.com{
18212952Sgabeblack@google.com    return _gem5_process;
18312838Sgabeblack@google.com}
18412838Sgabeblack@google.com
18512838Sgabeblack@google.combool
18612838Sgabeblack@google.comsc_process_handle::dynamic() const
18712838Sgabeblack@google.com{
18812952Sgabeblack@google.com    return _gem5_process ? _gem5_process->dynamic() : false;
18912838Sgabeblack@google.com}
19012838Sgabeblack@google.com
19112838Sgabeblack@google.combool
19212838Sgabeblack@google.comsc_process_handle::terminated() const
19312838Sgabeblack@google.com{
19412952Sgabeblack@google.com    return _gem5_process ? _gem5_process->terminated() : false;
19512838Sgabeblack@google.com}
19612838Sgabeblack@google.com
19712838Sgabeblack@google.comconst sc_event &
19812838Sgabeblack@google.comsc_process_handle::terminated_event() const
19912838Sgabeblack@google.com{
20013128Sgabeblack@google.com    if (!_gem5_process) {
20113317Sgabeblack@google.com        SC_REPORT_WARNING(SC_ID_EMPTY_PROCESS_HANDLE_, "terminated_event()");
20213303Sgabeblack@google.com        static sc_gem5::InternalScEvent non_event;
20313128Sgabeblack@google.com        return non_event;
20413128Sgabeblack@google.com    }
20513128Sgabeblack@google.com    return _gem5_process->terminatedEvent();
20612838Sgabeblack@google.com}
20712838Sgabeblack@google.com
20812838Sgabeblack@google.com
20912838Sgabeblack@google.comvoid
21012838Sgabeblack@google.comsc_process_handle::suspend(sc_descendent_inclusion_info include_descendants)
21112838Sgabeblack@google.com{
21213128Sgabeblack@google.com    if (!_gem5_process) {
21313317Sgabeblack@google.com        SC_REPORT_WARNING(SC_ID_EMPTY_PROCESS_HANDLE_, "suspend()");
21412952Sgabeblack@google.com        return;
21513128Sgabeblack@google.com    }
21612952Sgabeblack@google.com    _gem5_process->suspend(include_descendants == SC_INCLUDE_DESCENDANTS);
21712838Sgabeblack@google.com}
21812838Sgabeblack@google.com
21912838Sgabeblack@google.comvoid
22012838Sgabeblack@google.comsc_process_handle::resume(sc_descendent_inclusion_info include_descendants)
22112838Sgabeblack@google.com{
22213128Sgabeblack@google.com    if (!_gem5_process) {
22313317Sgabeblack@google.com        SC_REPORT_WARNING(SC_ID_EMPTY_PROCESS_HANDLE_, "resume()");
22412952Sgabeblack@google.com        return;
22513128Sgabeblack@google.com    }
22612952Sgabeblack@google.com    _gem5_process->resume(include_descendants == SC_INCLUDE_DESCENDANTS);
22712838Sgabeblack@google.com}
22812838Sgabeblack@google.com
22912838Sgabeblack@google.comvoid
23012838Sgabeblack@google.comsc_process_handle::disable(sc_descendent_inclusion_info include_descendants)
23112838Sgabeblack@google.com{
23213128Sgabeblack@google.com    if (!_gem5_process) {
23313317Sgabeblack@google.com        SC_REPORT_WARNING(SC_ID_EMPTY_PROCESS_HANDLE_, "disable()");
23412952Sgabeblack@google.com        return;
23513128Sgabeblack@google.com    }
23612952Sgabeblack@google.com    _gem5_process->disable(include_descendants == SC_INCLUDE_DESCENDANTS);
23712838Sgabeblack@google.com}
23812838Sgabeblack@google.com
23912838Sgabeblack@google.comvoid
24012838Sgabeblack@google.comsc_process_handle::enable(sc_descendent_inclusion_info include_descendants)
24112838Sgabeblack@google.com{
24213128Sgabeblack@google.com    if (!_gem5_process) {
24313317Sgabeblack@google.com        SC_REPORT_WARNING(SC_ID_EMPTY_PROCESS_HANDLE_, "enable()");
24412952Sgabeblack@google.com        return;
24513128Sgabeblack@google.com    }
24612952Sgabeblack@google.com    _gem5_process->enable(include_descendants == SC_INCLUDE_DESCENDANTS);
24712838Sgabeblack@google.com}
24812838Sgabeblack@google.com
24912838Sgabeblack@google.comvoid
25012838Sgabeblack@google.comsc_process_handle::kill(sc_descendent_inclusion_info include_descendants)
25112838Sgabeblack@google.com{
25213128Sgabeblack@google.com    if (!_gem5_process) {
25313317Sgabeblack@google.com        SC_REPORT_WARNING(SC_ID_EMPTY_PROCESS_HANDLE_, "kill()");
25412952Sgabeblack@google.com        return;
25513128Sgabeblack@google.com    }
25612952Sgabeblack@google.com    _gem5_process->kill(include_descendants == SC_INCLUDE_DESCENDANTS);
25712838Sgabeblack@google.com}
25812838Sgabeblack@google.com
25912838Sgabeblack@google.comvoid
26012838Sgabeblack@google.comsc_process_handle::reset(sc_descendent_inclusion_info include_descendants)
26112838Sgabeblack@google.com{
26213128Sgabeblack@google.com    if (!_gem5_process) {
26313317Sgabeblack@google.com        SC_REPORT_WARNING(SC_ID_EMPTY_PROCESS_HANDLE_, "reset()");
26412952Sgabeblack@google.com        return;
26513128Sgabeblack@google.com    }
26612952Sgabeblack@google.com    _gem5_process->reset(include_descendants == SC_INCLUDE_DESCENDANTS);
26712838Sgabeblack@google.com}
26812838Sgabeblack@google.com
26912838Sgabeblack@google.combool
27012838Sgabeblack@google.comsc_process_handle::is_unwinding()
27112838Sgabeblack@google.com{
27212952Sgabeblack@google.com    if (!_gem5_process) {
27313317Sgabeblack@google.com        SC_REPORT_WARNING(SC_ID_EMPTY_PROCESS_HANDLE_, "is_unwinding()");
27412952Sgabeblack@google.com        return false;
27512952Sgabeblack@google.com    }
27613128Sgabeblack@google.com    return _gem5_process->isUnwinding();
27712838Sgabeblack@google.com}
27812838Sgabeblack@google.com
27912838Sgabeblack@google.comconst sc_event &
28012838Sgabeblack@google.comsc_process_handle::reset_event() const
28112838Sgabeblack@google.com{
28213128Sgabeblack@google.com    if (!_gem5_process) {
28313317Sgabeblack@google.com        SC_REPORT_WARNING(SC_ID_EMPTY_PROCESS_HANDLE_, "reset()");
28413303Sgabeblack@google.com        static sc_gem5::InternalScEvent non_event;
28513128Sgabeblack@google.com        return non_event;
28613128Sgabeblack@google.com    }
28713128Sgabeblack@google.com    return _gem5_process->resetEvent();
28812838Sgabeblack@google.com}
28912838Sgabeblack@google.com
29012838Sgabeblack@google.com
29112838Sgabeblack@google.comvoid
29212838Sgabeblack@google.comsc_process_handle::sync_reset_on(
29312838Sgabeblack@google.com        sc_descendent_inclusion_info include_descendants)
29412838Sgabeblack@google.com{
29513128Sgabeblack@google.com    if (!_gem5_process) {
29613317Sgabeblack@google.com        SC_REPORT_WARNING(SC_ID_EMPTY_PROCESS_HANDLE_, "sync_reset_on()");
29712952Sgabeblack@google.com        return;
29813128Sgabeblack@google.com    }
29912952Sgabeblack@google.com    _gem5_process->syncResetOn(include_descendants == SC_INCLUDE_DESCENDANTS);
30012838Sgabeblack@google.com}
30112838Sgabeblack@google.com
30212838Sgabeblack@google.comvoid
30312838Sgabeblack@google.comsc_process_handle::sync_reset_off(
30412838Sgabeblack@google.com        sc_descendent_inclusion_info include_descendants)
30512838Sgabeblack@google.com{
30613128Sgabeblack@google.com    if (!_gem5_process) {
30713317Sgabeblack@google.com        SC_REPORT_WARNING(SC_ID_EMPTY_PROCESS_HANDLE_, "sync_reset_off()");
30812952Sgabeblack@google.com        return;
30913128Sgabeblack@google.com    }
31012952Sgabeblack@google.com    _gem5_process->syncResetOff(include_descendants == SC_INCLUDE_DESCENDANTS);
31112838Sgabeblack@google.com}
31212838Sgabeblack@google.com
31312838Sgabeblack@google.com
31412838Sgabeblack@google.comsc_process_handle
31512838Sgabeblack@google.comsc_get_current_process_handle()
31612838Sgabeblack@google.com{
31712960Sgabeblack@google.com    if (sc_is_running())
31812960Sgabeblack@google.com        return sc_process_handle(::sc_gem5::scheduler.current());
31912960Sgabeblack@google.com    else
32012960Sgabeblack@google.com        return sc_process_handle(::sc_gem5::Process::newest());
32112838Sgabeblack@google.com}
32212838Sgabeblack@google.com
32312838Sgabeblack@google.combool
32412838Sgabeblack@google.comsc_is_unwinding()
32512838Sgabeblack@google.com{
32612952Sgabeblack@google.com    return sc_get_current_process_handle().is_unwinding();
32712838Sgabeblack@google.com}
32812838Sgabeblack@google.com
32912899Sgabeblack@google.combool sc_allow_process_control_corners;
33012899Sgabeblack@google.com
33112838Sgabeblack@google.com} // namespace sc_core
332