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