sc_process_handle.hh revision 12852
1/* 2 * Copyright 2018 Google, Inc. 3 * 4 * Redistribution and use in source and binary forms, with or without 5 * modification, are permitted provided that the following conditions are 6 * met: redistributions of source code must retain the above copyright 7 * notice, this list of conditions and the following disclaimer; 8 * redistributions in binary form must reproduce the above copyright 9 * notice, this list of conditions and the following disclaimer in the 10 * documentation and/or other materials provided with the distribution; 11 * neither the name of the copyright holders nor the names of its 12 * contributors may be used to endorse or promote products derived from 13 * this software without specific prior written permission. 14 * 15 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 16 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 17 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 18 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 19 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 20 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 21 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 22 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 23 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 25 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 26 * 27 * Authors: Gabe Black 28 */ 29 30#ifndef __SYSTEMC_EXT_CORE_SC_PROCESS_HANDLE_HH__ 31#define __SYSTEMC_EXT_CORE_SC_PROCESS_HANDLE_HH__ 32 33#include <exception> 34#include <vector> 35 36namespace sc_gem5 37{ 38 39class Process; 40 41} // namespace sc_gem5 42 43namespace sc_core 44{ 45 46class sc_event; 47class sc_object; 48 49enum sc_curr_proc_kind 50{ 51 SC_NO_PROC_, 52 SC_METHOD_PROC_, 53 SC_THREAD_PROC_, 54 SC_CTHREAD_PROC_ 55}; 56 57enum sc_descendent_inclusion_info 58{ 59 SC_NO_DESCENDANTS, 60 SC_INCLUDE_DESCENDANTS 61}; 62 63class sc_unwind_exception : public std::exception 64{ 65 public: 66 virtual const char *what() const throw(); 67 virtual bool is_reset() const; 68 69 protected: 70 sc_unwind_exception(); 71 sc_unwind_exception(const sc_unwind_exception &); 72 virtual ~sc_unwind_exception() throw(); 73}; 74 75class sc_process_handle 76{ 77 private: 78 ::sc_gem5::Process *_gem5_process; 79 80 public: 81 sc_process_handle(); 82 sc_process_handle(const sc_process_handle &); 83 explicit sc_process_handle(sc_object *); 84 ~sc_process_handle(); 85 86 // These non-standard operators provide access to the data structure which 87 // actually tracks the process within gem5. By making them operators, we 88 // can minimize the symbols added to the class namespace. 89 operator ::sc_gem5::Process * () const { return _gem5_process; } 90 sc_process_handle & 91 operator = (::sc_gem5::Process *p) 92 { 93 _gem5_process = p; 94 return *this; 95 } 96 97 bool valid() const; 98 99 sc_process_handle &operator = (const sc_process_handle &); 100 bool operator == (const sc_process_handle &) const; 101 bool operator != (const sc_process_handle &) const; 102 bool operator < (const sc_process_handle &) const; 103 bool swap(sc_process_handle &); 104 105 const char *name() const; 106 sc_curr_proc_kind proc_kind() const; 107 const std::vector<sc_object *> &get_child_objects() const; 108 const std::vector<sc_event *> &get_child_events() const; 109 sc_object *get_parent_object() const; 110 sc_object *get_process_object() const; 111 bool dynamic() const; 112 bool terminated() const; 113 const sc_event &terminated_event() const; 114 115 void suspend(sc_descendent_inclusion_info include_descendants= 116 SC_NO_DESCENDANTS); 117 void resume(sc_descendent_inclusion_info include_descendants= 118 SC_NO_DESCENDANTS); 119 void disable(sc_descendent_inclusion_info include_descendants= 120 SC_NO_DESCENDANTS); 121 void enable(sc_descendent_inclusion_info include_descendants= 122 SC_NO_DESCENDANTS); 123 void kill(sc_descendent_inclusion_info include_descendants= 124 SC_NO_DESCENDANTS); 125 void reset(sc_descendent_inclusion_info include_descendants= 126 SC_NO_DESCENDANTS); 127 bool is_unwinding(); 128 const sc_event &reset_event() const; 129 130 void sync_reset_on(sc_descendent_inclusion_info include_descendants= 131 SC_NO_DESCENDANTS); 132 void sync_reset_off(sc_descendent_inclusion_info include_descendants= 133 SC_NO_DESCENDANTS); 134 135 void warn_unimpl(const char *func); 136 template <typename T> 137 void throw_it(const T &user_defined_exception, 138 sc_descendent_inclusion_info include_descendants= 139 SC_NO_DESCENDANTS) 140 { 141 warn_unimpl(__PRETTY_FUNCTION__); 142 } 143}; 144 145sc_process_handle sc_get_current_process_handle(); 146bool sc_is_unwinding(); 147 148} // namespace sc_core 149 150#endif //__SYSTEMC_EXT_CORE_SC_PROCESS_HANDLE_HH__ 151