sc_join.cpp revision 12027
19241Sandreas.hansson@arm.com/***************************************************************************** 29241Sandreas.hansson@arm.com 39241Sandreas.hansson@arm.com Licensed to Accellera Systems Initiative Inc. (Accellera) under one or 49241Sandreas.hansson@arm.com more contributor license agreements. See the NOTICE file distributed 59241Sandreas.hansson@arm.com with this work for additional information regarding copyright ownership. 69241Sandreas.hansson@arm.com Accellera licenses this file to you under the Apache License, Version 2.0 79241Sandreas.hansson@arm.com (the "License"); you may not use this file except in compliance with the 89241Sandreas.hansson@arm.com License. You may obtain a copy of the License at 99241Sandreas.hansson@arm.com 109241Sandreas.hansson@arm.com http://www.apache.org/licenses/LICENSE-2.0 119241Sandreas.hansson@arm.com 129241Sandreas.hansson@arm.com Unless required by applicable law or agreed to in writing, software 139241Sandreas.hansson@arm.com distributed under the License is distributed on an "AS IS" BASIS, 149241Sandreas.hansson@arm.com WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 159241Sandreas.hansson@arm.com implied. See the License for the specific language governing 169241Sandreas.hansson@arm.com permissions and limitations under the License. 179241Sandreas.hansson@arm.com 189241Sandreas.hansson@arm.com *****************************************************************************/ 199241Sandreas.hansson@arm.com 209241Sandreas.hansson@arm.com/***************************************************************************** 219241Sandreas.hansson@arm.com 229241Sandreas.hansson@arm.com sc_join.cpp -- Join Process Synchronization Implementation 239241Sandreas.hansson@arm.com 249241Sandreas.hansson@arm.com Original Author: Andy Goodrich, Forte Design Systems, 5 May 2003 259241Sandreas.hansson@arm.com 269241Sandreas.hansson@arm.com CHANGE LOG APPEARS AT THE END OF THE FILE 279241Sandreas.hansson@arm.com *****************************************************************************/ 289241Sandreas.hansson@arm.com 299241Sandreas.hansson@arm.com 309241Sandreas.hansson@arm.com#include <cassert> 319241Sandreas.hansson@arm.com#include <cstdlib> 329241Sandreas.hansson@arm.com#include <cstddef> 339241Sandreas.hansson@arm.com 349241Sandreas.hansson@arm.com#include "sysc/kernel/sc_process_handle.h" 359241Sandreas.hansson@arm.com#include "sysc/kernel/sc_simcontext.h" 369241Sandreas.hansson@arm.com#include "sysc/kernel/sc_simcontext_int.h" 379241Sandreas.hansson@arm.com#include "sysc/kernel/sc_kernel_ids.h" 389241Sandreas.hansson@arm.com#include "sysc/kernel/sc_thread_process.h" 399241Sandreas.hansson@arm.com#include "sysc/kernel/sc_join.h" 409241Sandreas.hansson@arm.com 419241Sandreas.hansson@arm.comnamespace sc_core { 429241Sandreas.hansson@arm.com 439241Sandreas.hansson@arm.com//------------------------------------------------------------------------------ 449241Sandreas.hansson@arm.com//"sc_join::sc_join" 459241Sandreas.hansson@arm.com// 469241Sandreas.hansson@arm.com// This is the object instance constructor for this class. 479241Sandreas.hansson@arm.com//------------------------------------------------------------------------------ 489241Sandreas.hansson@arm.comsc_join::sc_join() 499241Sandreas.hansson@arm.com : m_join_event( (std::string(SC_KERNEL_EVENT_PREFIX)+"_join_event").c_str() ) 509241Sandreas.hansson@arm.com , m_threads_n(0) 519241Sandreas.hansson@arm.com{} 529241Sandreas.hansson@arm.com 539241Sandreas.hansson@arm.com//------------------------------------------------------------------------------ 549241Sandreas.hansson@arm.com//"sc_join::add_process - sc_process_b*" 559241Sandreas.hansson@arm.com// 569241Sandreas.hansson@arm.com// This method adds a process to this join object instance. This consists of 579241Sandreas.hansson@arm.com// incrementing the count of processes in the join process and adding this 589241Sandreas.hansson@arm.com// object instance to the supplied thread's monitoring queue. 599241Sandreas.hansson@arm.com// process_p -> thread to be monitored. 609241Sandreas.hansson@arm.com//------------------------------------------------------------------------------ 619241Sandreas.hansson@arm.comvoid sc_join::add_process( sc_process_b* process_p ) 629241Sandreas.hansson@arm.com{ 639241Sandreas.hansson@arm.com sc_thread_handle handle = DCAST<sc_thread_handle>(process_p); 649241Sandreas.hansson@arm.com assert( handle != 0 ); 659241Sandreas.hansson@arm.com m_threads_n++; 669241Sandreas.hansson@arm.com handle->add_monitor( this ); 679241Sandreas.hansson@arm.com} 689241Sandreas.hansson@arm.com 699241Sandreas.hansson@arm.com 709241Sandreas.hansson@arm.com//------------------------------------------------------------------------------ 719241Sandreas.hansson@arm.com//"sc_join::add_process - sc_process_handle" 729241Sandreas.hansson@arm.com// 739241Sandreas.hansson@arm.com// This method adds a process to this join object instance. This consists of 749241Sandreas.hansson@arm.com// incrementing the count of processes in the join process and adding this 759241Sandreas.hansson@arm.com// object instance to the supplied thread's monitoring queue. 769241Sandreas.hansson@arm.com// process_h = handle for process to be monitored. 779241Sandreas.hansson@arm.com//------------------------------------------------------------------------------ 789241Sandreas.hansson@arm.comvoid sc_join::add_process( sc_process_handle process_h ) 799241Sandreas.hansson@arm.com{ 809241Sandreas.hansson@arm.com sc_thread_handle thread_p; // Thread within process_h. 819241Sandreas.hansson@arm.com 829241Sandreas.hansson@arm.com thread_p = process_h.operator sc_thread_handle(); 839241Sandreas.hansson@arm.com if ( thread_p ) 849241Sandreas.hansson@arm.com { 859241Sandreas.hansson@arm.com m_threads_n++; 869241Sandreas.hansson@arm.com thread_p->add_monitor( this ); 879241Sandreas.hansson@arm.com } 889241Sandreas.hansson@arm.com else 899241Sandreas.hansson@arm.com { 909241Sandreas.hansson@arm.com SC_REPORT_ERROR( SC_ID_JOIN_ON_METHOD_HANDLE_, 0 ); 919241Sandreas.hansson@arm.com } 929241Sandreas.hansson@arm.com} 939241Sandreas.hansson@arm.com 949241Sandreas.hansson@arm.com 959241Sandreas.hansson@arm.com//------------------------------------------------------------------------------ 969241Sandreas.hansson@arm.com//"sc_join::signal" 979241Sandreas.hansson@arm.com// 989241Sandreas.hansson@arm.com// This virtual method is called when a process being monitored by this object 999241Sandreas.hansson@arm.com// instance sends a signal. If the signal type is spm_exit and the count of 1009241Sandreas.hansson@arm.com// threads that we are waiting to terminate on goes to zero we fire our join 1019241Sandreas.hansson@arm.com// event. 1029241Sandreas.hansson@arm.com// thread_p -> thread that is signalling. 1039241Sandreas.hansson@arm.com// type = type of signal being sent. 1049241Sandreas.hansson@arm.com//------------------------------------------------------------------------------ 1059241Sandreas.hansson@arm.comvoid sc_join::signal(sc_thread_handle thread_p, int type) 1069241Sandreas.hansson@arm.com{ 1079241Sandreas.hansson@arm.com switch ( type ) 1089241Sandreas.hansson@arm.com { 1099241Sandreas.hansson@arm.com case sc_process_monitor::spm_exit: 1109241Sandreas.hansson@arm.com thread_p->remove_monitor(this); 1119241Sandreas.hansson@arm.com if ( --m_threads_n == 0 ) m_join_event.notify(); 1129241Sandreas.hansson@arm.com break; 1139241Sandreas.hansson@arm.com } 1149241Sandreas.hansson@arm.com} 1159241Sandreas.hansson@arm.com 1169241Sandreas.hansson@arm.com} // namespace sc_core 1179241Sandreas.hansson@arm.com 1189241Sandreas.hansson@arm.com// $Log: sc_join.cpp,v $ 1199241Sandreas.hansson@arm.com// Revision 1.7 2011/08/26 21:45:00 acg 1209241Sandreas.hansson@arm.com// Andy Goodrich: fix internal event naming. 1219241Sandreas.hansson@arm.com// 1229241Sandreas.hansson@arm.com// Revision 1.6 2011/08/26 20:46:09 acg 1239241Sandreas.hansson@arm.com// Andy Goodrich: moved the modification log to the end of the file to 1249241Sandreas.hansson@arm.com// eliminate source line number skew when check-ins are done. 1259241Sandreas.hansson@arm.com// 1269241Sandreas.hansson@arm.com// Revision 1.5 2011/02/18 20:27:14 acg 1279241Sandreas.hansson@arm.com// Andy Goodrich: Updated Copyrights. 1289241Sandreas.hansson@arm.com// 1299241Sandreas.hansson@arm.com// Revision 1.4 2011/02/13 21:47:37 acg 1309241Sandreas.hansson@arm.com// Andy Goodrich: update copyright notice. 1319241Sandreas.hansson@arm.com// 1329241Sandreas.hansson@arm.com// Revision 1.3 2009/07/28 01:10:53 acg 1339241Sandreas.hansson@arm.com// Andy Goodrich: updates for 2.3 release candidate. 1349241Sandreas.hansson@arm.com// 1359241Sandreas.hansson@arm.com// Revision 1.2 2008/05/22 17:06:25 acg 1369241Sandreas.hansson@arm.com// Andy Goodrich: updated copyright notice to include 2008. 1379241Sandreas.hansson@arm.com// 1389241Sandreas.hansson@arm.com// Revision 1.1.1.1 2006/12/15 20:20:05 acg 1399241Sandreas.hansson@arm.com// SystemC 2.3 1409241Sandreas.hansson@arm.com// 1419241Sandreas.hansson@arm.com// Revision 1.3 2006/01/13 18:44:29 acg 1429241Sandreas.hansson@arm.com// Added $Log to record CVS changes into the source. 1439241Sandreas.hansson@arm.com// 1449241Sandreas.hansson@arm.com