sc_cor_fiber.cpp revision 12027
112027Sjungma@eit.uni-kl.de/***************************************************************************** 212027Sjungma@eit.uni-kl.de 312027Sjungma@eit.uni-kl.de Licensed to Accellera Systems Initiative Inc. (Accellera) under one or 412027Sjungma@eit.uni-kl.de more contributor license agreements. See the NOTICE file distributed 512027Sjungma@eit.uni-kl.de with this work for additional information regarding copyright ownership. 612027Sjungma@eit.uni-kl.de Accellera licenses this file to you under the Apache License, Version 2.0 712027Sjungma@eit.uni-kl.de (the "License"); you may not use this file except in compliance with the 812027Sjungma@eit.uni-kl.de License. You may obtain a copy of the License at 912027Sjungma@eit.uni-kl.de 1012027Sjungma@eit.uni-kl.de http://www.apache.org/licenses/LICENSE-2.0 1112027Sjungma@eit.uni-kl.de 1212027Sjungma@eit.uni-kl.de Unless required by applicable law or agreed to in writing, software 1312027Sjungma@eit.uni-kl.de distributed under the License is distributed on an "AS IS" BASIS, 1412027Sjungma@eit.uni-kl.de WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 1512027Sjungma@eit.uni-kl.de implied. See the License for the specific language governing 1612027Sjungma@eit.uni-kl.de permissions and limitations under the License. 1712027Sjungma@eit.uni-kl.de 1812027Sjungma@eit.uni-kl.de *****************************************************************************/ 1912027Sjungma@eit.uni-kl.de 2012027Sjungma@eit.uni-kl.de/***************************************************************************** 2112027Sjungma@eit.uni-kl.de 2212027Sjungma@eit.uni-kl.de sc_cor_fiber.cpp -- Coroutine implementation with fibers. 2312027Sjungma@eit.uni-kl.de 2412027Sjungma@eit.uni-kl.de Original Author: Martin Janssen, Synopsys, Inc., 2001-12-18 2512027Sjungma@eit.uni-kl.de 2612027Sjungma@eit.uni-kl.de CHANGE LOG APPEARS AT THE END OF THE FILE 2712027Sjungma@eit.uni-kl.de *****************************************************************************/ 2812027Sjungma@eit.uni-kl.de 2912027Sjungma@eit.uni-kl.de#if defined(_WIN32) || defined(WIN32) || defined(WIN64) 3012027Sjungma@eit.uni-kl.de 3112027Sjungma@eit.uni-kl.de#ifndef SC_INCLUDE_WINDOWS_H 3212027Sjungma@eit.uni-kl.de# define SC_INCLUDE_WINDOWS_H // include Windows.h, if needed 3312027Sjungma@eit.uni-kl.de#endif 3412027Sjungma@eit.uni-kl.de 3512027Sjungma@eit.uni-kl.de#include "sysc/kernel/sc_cor_fiber.h" 3612027Sjungma@eit.uni-kl.de#include "sysc/kernel/sc_simcontext.h" 3712027Sjungma@eit.uni-kl.de#if defined(__GNUC__) && __USING_SJLJ_EXCEPTIONS__ 3812027Sjungma@eit.uni-kl.de# if (__GNUC__ > 3) || ((__GNUC__ == 3) && (__GNUC_MINOR__ > 2)) 3912027Sjungma@eit.uni-kl.de# include <unwind.h> 4012027Sjungma@eit.uni-kl.de# else 4112027Sjungma@eit.uni-kl.de extern "C" void _Unwind_SjLj_Register (struct SjLj_Function_Context *); 4212027Sjungma@eit.uni-kl.de extern "C" void _Unwind_SjLj_Unregister (struct SjLj_Function_Context *); 4312027Sjungma@eit.uni-kl.de# endif 4412027Sjungma@eit.uni-kl.de#endif 4512027Sjungma@eit.uni-kl.de 4612027Sjungma@eit.uni-kl.denamespace sc_core { 4712027Sjungma@eit.uni-kl.de 4812027Sjungma@eit.uni-kl.de// ---------------------------------------------------------------------------- 4912027Sjungma@eit.uni-kl.de// File static variables. 5012027Sjungma@eit.uni-kl.de// ---------------------------------------------------------------------------- 5112027Sjungma@eit.uni-kl.de 5212027Sjungma@eit.uni-kl.de// main coroutine 5312027Sjungma@eit.uni-kl.de 5412027Sjungma@eit.uni-kl.destatic sc_cor_fiber main_cor; 5512027Sjungma@eit.uni-kl.de#if defined(__GNUC__) && __USING_SJLJ_EXCEPTIONS__ 5612027Sjungma@eit.uni-kl.de// current coroutine 5712027Sjungma@eit.uni-kl.destatic sc_cor_fiber* curr_cor; 5812027Sjungma@eit.uni-kl.de#endif 5912027Sjungma@eit.uni-kl.de 6012027Sjungma@eit.uni-kl.de 6112027Sjungma@eit.uni-kl.de// ---------------------------------------------------------------------------- 6212027Sjungma@eit.uni-kl.de// CLASS : sc_cor_fiber 6312027Sjungma@eit.uni-kl.de// 6412027Sjungma@eit.uni-kl.de// Coroutine class implemented with Windows fibers. 6512027Sjungma@eit.uni-kl.de// ---------------------------------------------------------------------------- 6612027Sjungma@eit.uni-kl.de 6712027Sjungma@eit.uni-kl.de// destructor 6812027Sjungma@eit.uni-kl.de 6912027Sjungma@eit.uni-kl.desc_cor_fiber::~sc_cor_fiber() 7012027Sjungma@eit.uni-kl.de{ 7112027Sjungma@eit.uni-kl.de if( m_fiber != 0 ) { 7212027Sjungma@eit.uni-kl.de PVOID cur_fiber = GetCurrentFiber(); 7312027Sjungma@eit.uni-kl.de if (m_fiber != cur_fiber) 7412027Sjungma@eit.uni-kl.de DeleteFiber( m_fiber ); 7512027Sjungma@eit.uni-kl.de } 7612027Sjungma@eit.uni-kl.de} 7712027Sjungma@eit.uni-kl.de 7812027Sjungma@eit.uni-kl.de 7912027Sjungma@eit.uni-kl.de// ---------------------------------------------------------------------------- 8012027Sjungma@eit.uni-kl.de// CLASS : sc_cor_pkg_fiber 8112027Sjungma@eit.uni-kl.de// 8212027Sjungma@eit.uni-kl.de// Coroutine package class implemented with QuickThreads. 8312027Sjungma@eit.uni-kl.de// ---------------------------------------------------------------------------- 8412027Sjungma@eit.uni-kl.de 8512027Sjungma@eit.uni-kl.deint sc_cor_pkg_fiber::instance_count = 0; 8612027Sjungma@eit.uni-kl.de 8712027Sjungma@eit.uni-kl.de 8812027Sjungma@eit.uni-kl.de// constructor 8912027Sjungma@eit.uni-kl.de 9012027Sjungma@eit.uni-kl.desc_cor_pkg_fiber::sc_cor_pkg_fiber( sc_simcontext* simc ) 9112027Sjungma@eit.uni-kl.de: sc_cor_pkg( simc ) 9212027Sjungma@eit.uni-kl.de{ 9312027Sjungma@eit.uni-kl.de if( ++ instance_count == 1 ) { 9412027Sjungma@eit.uni-kl.de // initialize the main coroutine 9512027Sjungma@eit.uni-kl.de assert( main_cor.m_fiber == 0 ); 9612027Sjungma@eit.uni-kl.de main_cor.m_fiber = ConvertThreadToFiber( 0 ); 9712027Sjungma@eit.uni-kl.de 9812027Sjungma@eit.uni-kl.de if( !main_cor.m_fiber && GetLastError() == ERROR_ALREADY_FIBER ) { 9912027Sjungma@eit.uni-kl.de // conversion of current thread to fiber has failed, because 10012027Sjungma@eit.uni-kl.de // someone else already converted the main thread to a fiber 10112027Sjungma@eit.uni-kl.de // -> store current fiber 10212027Sjungma@eit.uni-kl.de main_cor.m_fiber = GetCurrentFiber(); 10312027Sjungma@eit.uni-kl.de } 10412027Sjungma@eit.uni-kl.de assert( main_cor.m_fiber != 0 ); 10512027Sjungma@eit.uni-kl.de 10612027Sjungma@eit.uni-kl.de# if defined(__GNUC__) && __USING_SJLJ_EXCEPTIONS__ 10712027Sjungma@eit.uni-kl.de // initialize the current coroutine 10812027Sjungma@eit.uni-kl.de assert( curr_cor == 0 ); 10912027Sjungma@eit.uni-kl.de curr_cor = &main_cor; 11012027Sjungma@eit.uni-kl.de# endif 11112027Sjungma@eit.uni-kl.de } 11212027Sjungma@eit.uni-kl.de} 11312027Sjungma@eit.uni-kl.de 11412027Sjungma@eit.uni-kl.de 11512027Sjungma@eit.uni-kl.de// destructor 11612027Sjungma@eit.uni-kl.de 11712027Sjungma@eit.uni-kl.desc_cor_pkg_fiber::~sc_cor_pkg_fiber() 11812027Sjungma@eit.uni-kl.de{ 11912027Sjungma@eit.uni-kl.de if( -- instance_count == 0 ) { 12012027Sjungma@eit.uni-kl.de // cleanup the main coroutine 12112027Sjungma@eit.uni-kl.de main_cor.m_fiber = 0; 12212027Sjungma@eit.uni-kl.de# if defined(__GNUC__) && __USING_SJLJ_EXCEPTIONS__ 12312027Sjungma@eit.uni-kl.de // cleanup the current coroutine 12412027Sjungma@eit.uni-kl.de curr_cor = 0; 12512027Sjungma@eit.uni-kl.de# endif 12612027Sjungma@eit.uni-kl.de } 12712027Sjungma@eit.uni-kl.de} 12812027Sjungma@eit.uni-kl.de 12912027Sjungma@eit.uni-kl.de 13012027Sjungma@eit.uni-kl.de// create a new coroutine 13112027Sjungma@eit.uni-kl.de 13212027Sjungma@eit.uni-kl.desc_cor* 13312027Sjungma@eit.uni-kl.desc_cor_pkg_fiber::create( std::size_t stack_size, sc_cor_fn* fn, void* arg ) 13412027Sjungma@eit.uni-kl.de{ 13512027Sjungma@eit.uni-kl.de sc_cor_fiber* cor = new sc_cor_fiber; 13612027Sjungma@eit.uni-kl.de cor->m_pkg = this; 13712027Sjungma@eit.uni-kl.de cor->m_stack_size = stack_size; 13812027Sjungma@eit.uni-kl.de cor->m_fiber = CreateFiberEx( cor->m_stack_size / 2, cor->m_stack_size, 0, 13912027Sjungma@eit.uni-kl.de (LPFIBER_START_ROUTINE) fn, arg ); 14012027Sjungma@eit.uni-kl.de return cor; 14112027Sjungma@eit.uni-kl.de} 14212027Sjungma@eit.uni-kl.de 14312027Sjungma@eit.uni-kl.de 14412027Sjungma@eit.uni-kl.de// yield to the next coroutine 14512027Sjungma@eit.uni-kl.de 14612027Sjungma@eit.uni-kl.devoid 14712027Sjungma@eit.uni-kl.desc_cor_pkg_fiber::yield( sc_cor* next_cor ) 14812027Sjungma@eit.uni-kl.de{ 14912027Sjungma@eit.uni-kl.de sc_cor_fiber* new_cor = SCAST<sc_cor_fiber*>( next_cor ); 15012027Sjungma@eit.uni-kl.de# if defined(__GNUC__) && __USING_SJLJ_EXCEPTIONS__ 15112027Sjungma@eit.uni-kl.de // Switch SJLJ exception handling function contexts 15212027Sjungma@eit.uni-kl.de _Unwind_SjLj_Register(&curr_cor->m_eh); 15312027Sjungma@eit.uni-kl.de _Unwind_SjLj_Unregister(&new_cor->m_eh); 15412027Sjungma@eit.uni-kl.de curr_cor = new_cor; 15512027Sjungma@eit.uni-kl.de# endif 15612027Sjungma@eit.uni-kl.de SwitchToFiber( new_cor->m_fiber ); 15712027Sjungma@eit.uni-kl.de} 15812027Sjungma@eit.uni-kl.de 15912027Sjungma@eit.uni-kl.de 16012027Sjungma@eit.uni-kl.de// abort the current coroutine (and resume the next coroutine) 16112027Sjungma@eit.uni-kl.de 16212027Sjungma@eit.uni-kl.devoid 16312027Sjungma@eit.uni-kl.desc_cor_pkg_fiber::abort( sc_cor* next_cor ) 16412027Sjungma@eit.uni-kl.de{ 16512027Sjungma@eit.uni-kl.de sc_cor_fiber* new_cor = SCAST<sc_cor_fiber*>( next_cor ); 16612027Sjungma@eit.uni-kl.de# if defined(__GNUC__) && __USING_SJLJ_EXCEPTIONS__ 16712027Sjungma@eit.uni-kl.de // Switch SJLJ exception handling function contexts 16812027Sjungma@eit.uni-kl.de _Unwind_SjLj_Register(&curr_cor->m_eh); 16912027Sjungma@eit.uni-kl.de _Unwind_SjLj_Unregister(&new_cor->m_eh); 17012027Sjungma@eit.uni-kl.de curr_cor = new_cor; 17112027Sjungma@eit.uni-kl.de# endif 17212027Sjungma@eit.uni-kl.de SwitchToFiber( new_cor->m_fiber ); 17312027Sjungma@eit.uni-kl.de} 17412027Sjungma@eit.uni-kl.de 17512027Sjungma@eit.uni-kl.de 17612027Sjungma@eit.uni-kl.de// get the main coroutine 17712027Sjungma@eit.uni-kl.de 17812027Sjungma@eit.uni-kl.desc_cor* 17912027Sjungma@eit.uni-kl.desc_cor_pkg_fiber::get_main() 18012027Sjungma@eit.uni-kl.de{ 18112027Sjungma@eit.uni-kl.de return &main_cor; 18212027Sjungma@eit.uni-kl.de} 18312027Sjungma@eit.uni-kl.de 18412027Sjungma@eit.uni-kl.de} // namespace sc_core 18512027Sjungma@eit.uni-kl.de 18612027Sjungma@eit.uni-kl.de 18712027Sjungma@eit.uni-kl.de// $Log: sc_cor_fiber.cpp,v $ 18812027Sjungma@eit.uni-kl.de// Revision 1.9 2011/09/08 16:12:45 acg 18912027Sjungma@eit.uni-kl.de// Philipp A. Hartmann: make sure we don't try to make a thread a fiber if 19012027Sjungma@eit.uni-kl.de// its already a fiber. 19112027Sjungma@eit.uni-kl.de// 19212027Sjungma@eit.uni-kl.de// Revision 1.8 2011/08/26 20:46:09 acg 19312027Sjungma@eit.uni-kl.de// Andy Goodrich: moved the modification log to the end of the file to 19412027Sjungma@eit.uni-kl.de// eliminate source line number skew when check-ins are done. 19512027Sjungma@eit.uni-kl.de// 19612027Sjungma@eit.uni-kl.de// Revision 1.7 2011/06/25 17:08:39 acg 19712027Sjungma@eit.uni-kl.de// Andy Goodrich: Jerome Cornet's changes to use libtool to build the 19812027Sjungma@eit.uni-kl.de// library. 19912027Sjungma@eit.uni-kl.de// 20012027Sjungma@eit.uni-kl.de// Revision 1.6 2011/02/18 20:27:14 acg 20112027Sjungma@eit.uni-kl.de// Andy Goodrich: Updated Copyrights. 20212027Sjungma@eit.uni-kl.de// 20312027Sjungma@eit.uni-kl.de// Revision 1.5 2011/02/13 21:47:37 acg 20412027Sjungma@eit.uni-kl.de// Andy Goodrich: update copyright notice. 20512027Sjungma@eit.uni-kl.de// 20612027Sjungma@eit.uni-kl.de// Revision 1.4 2011/01/19 23:21:50 acg 20712027Sjungma@eit.uni-kl.de// Andy Goodrich: changes for IEEE 1666 2011 20812027Sjungma@eit.uni-kl.de// 20912027Sjungma@eit.uni-kl.de// Revision 1.3 2009/05/22 16:06:29 acg 21012027Sjungma@eit.uni-kl.de// Andy Goodrich: process control updates. 21112027Sjungma@eit.uni-kl.de// 21212027Sjungma@eit.uni-kl.de// Revision 1.2 2008/05/22 17:06:25 acg 21312027Sjungma@eit.uni-kl.de// Andy Goodrich: updated copyright notice to include 2008. 21412027Sjungma@eit.uni-kl.de// 21512027Sjungma@eit.uni-kl.de// Revision 1.1.1.1 2006/12/15 20:20:05 acg 21612027Sjungma@eit.uni-kl.de// SystemC 2.3 21712027Sjungma@eit.uni-kl.de// 21812027Sjungma@eit.uni-kl.de// Revision 1.3 2006/01/13 18:44:29 acg 21912027Sjungma@eit.uni-kl.de// Added $Log to record CVS changes into the source. 22012027Sjungma@eit.uni-kl.de// 22112027Sjungma@eit.uni-kl.de 22212027Sjungma@eit.uni-kl.de#endif 22312027Sjungma@eit.uni-kl.de 22412027Sjungma@eit.uni-kl.de// Taf! 225