00001 /***************************************************************************** 00002 00003 The following code is derived, directly or indirectly, from the SystemC 00004 source code Copyright (c) 1996-2006 by all Contributors. 00005 All Rights reserved. 00006 00007 The contents of this file are subject to the restrictions and limitations 00008 set forth in the SystemC Open Source License Version 2.4 (the "License"); 00009 You may not use this file except in compliance with such restrictions and 00010 limitations. You may obtain instructions on how to receive a copy of the 00011 License at http://www.systemc.org/. Software distributed by Contributors 00012 under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF 00013 ANY KIND, either express or implied. See the License for the specific 00014 language governing rights and limitations under the License. 00015 00016 *****************************************************************************/ 00017 00018 /***************************************************************************** 00019 00020 sc_cor_fiber.h -- Coroutine implementation with fibers. 00021 00022 Original Author: Martin Janssen, Synopsys, Inc., 2001-12-18 00023 00024 *****************************************************************************/ 00025 00026 /***************************************************************************** 00027 00028 MODIFICATION LOG - modifiers, enter your name, affiliation, date and 00029 changes you are making here. 00030 00031 Name, Affiliation, Date: 00032 Description of Modification: 00033 00034 *****************************************************************************/ 00035 00036 // $Log: sc_cor_fiber.h,v $ 00037 // Revision 1.1.1.1 2006/12/15 20:31:36 acg 00038 // SystemC 2.2 00039 // 00040 // Revision 1.3 2006/01/13 18:44:29 acg 00041 // Added $Log to record CVS changes into the source. 00042 // 00043 00044 #ifndef SC_COR_FIBER_H 00045 #define SC_COR_FIBER_H 00046 00047 00048 #ifdef WIN32 00049 00050 #include "sysc/kernel/sc_cor.h" 00051 #include "sysc/kernel/sc_cmnhdr.h" 00052 00053 namespace sc_core { 00054 00055 class sc_cor_pkg_fiber; 00056 00057 #if( defined(_MSC_VER) && _MSC_VER >= 1300 ) 00058 typedef std::size_t size_t; 00059 #endif 00060 00061 // ---------------------------------------------------------------------------- 00062 // CLASS : sc_cor_fiber 00063 // 00064 // Coroutine class implemented with QuickThreads. 00065 // ---------------------------------------------------------------------------- 00066 00067 class sc_cor_fiber 00068 : public sc_cor 00069 { 00070 00071 public: 00072 00073 // constructor 00074 sc_cor_fiber() 00075 : m_stack_size( 0 ), m_fiber( 0 ), m_pkg( 0 ) 00076 {} 00077 00078 // destructor 00079 virtual ~sc_cor_fiber(); 00080 00081 public: 00082 00083 std::size_t m_stack_size; // stack size 00084 PVOID m_fiber; // fiber 00085 00086 sc_cor_pkg_fiber* m_pkg; // the creating coroutine package 00087 00088 private: 00089 00090 // disabled 00091 sc_cor_fiber( const sc_cor_fiber& ); 00092 sc_cor_fiber& operator = ( const sc_cor_fiber& ); 00093 }; 00094 00095 00096 // ---------------------------------------------------------------------------- 00097 // CLASS : sc_cor_pkg_fiber 00098 // 00099 // Coroutine package class implemented with QuickThreads. 00100 // ---------------------------------------------------------------------------- 00101 00102 class sc_cor_pkg_fiber 00103 : public sc_cor_pkg 00104 { 00105 public: 00106 00107 // constructor 00108 sc_cor_pkg_fiber( sc_simcontext* simc ); 00109 00110 // destructor 00111 virtual ~sc_cor_pkg_fiber(); 00112 00113 // create a new coroutine 00114 virtual sc_cor* create( std::size_t stack_size, sc_cor_fn* fn, void* arg ); 00115 00116 // yield to the next coroutine 00117 virtual void yield( sc_cor* next_cor ); 00118 00119 // abort the current coroutine (and resume the next coroutine) 00120 virtual void abort( sc_cor* next_cor ); 00121 00122 // get the main coroutine 00123 virtual sc_cor* get_main(); 00124 00125 private: 00126 00127 static int instance_count; 00128 00129 private: 00130 00131 // disabled 00132 sc_cor_pkg_fiber(); 00133 sc_cor_pkg_fiber( const sc_cor_pkg_fiber& ); 00134 sc_cor_pkg_fiber& operator = ( const sc_cor_pkg_fiber& ); 00135 }; 00136 00137 } // namespace sc_core 00138 00139 #endif // WIN32 00140 00141 00142 #endif 00143 00144 // Taf!