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_mutex.cpp -- The sc_mutex primitive channel class.
2312027Sjungma@eit.uni-kl.de
2412027Sjungma@eit.uni-kl.de  Original Author: Martin Janssen, Synopsys, Inc., 2001-05-21
2512027Sjungma@eit.uni-kl.de
2612027Sjungma@eit.uni-kl.de  CHANGE LOG IS AT THE END OF THE FILE
2712027Sjungma@eit.uni-kl.de *****************************************************************************/
2812027Sjungma@eit.uni-kl.de
2912027Sjungma@eit.uni-kl.de#include "sysc/communication/sc_mutex.h"
3012027Sjungma@eit.uni-kl.de#include "sysc/kernel/sc_simcontext.h"
3112027Sjungma@eit.uni-kl.de
3212027Sjungma@eit.uni-kl.denamespace sc_core {
3312027Sjungma@eit.uni-kl.de
3412027Sjungma@eit.uni-kl.de// ----------------------------------------------------------------------------
3512027Sjungma@eit.uni-kl.de//  CLASS : sc_mutex
3612027Sjungma@eit.uni-kl.de//
3712027Sjungma@eit.uni-kl.de//  The sc_mutex primitive channel class.
3812027Sjungma@eit.uni-kl.de// ----------------------------------------------------------------------------
3912027Sjungma@eit.uni-kl.de
4012027Sjungma@eit.uni-kl.de// constructors
4112027Sjungma@eit.uni-kl.de
4212027Sjungma@eit.uni-kl.desc_mutex::sc_mutex()
4312027Sjungma@eit.uni-kl.de: sc_object( sc_gen_unique_name( "mutex" ) ),
4412027Sjungma@eit.uni-kl.de  m_owner( 0 ),
4512027Sjungma@eit.uni-kl.de  m_free( (std::string(SC_KERNEL_EVENT_PREFIX)+"_free_event").c_str() )
4612027Sjungma@eit.uni-kl.de{}
4712027Sjungma@eit.uni-kl.de
4812027Sjungma@eit.uni-kl.desc_mutex::sc_mutex( const char* name_ )
4912027Sjungma@eit.uni-kl.de: sc_object( name_ ),
5012027Sjungma@eit.uni-kl.de  m_owner( 0 ),
5112027Sjungma@eit.uni-kl.de  m_free( (std::string(SC_KERNEL_EVENT_PREFIX)+"_free_event").c_str() )
5212027Sjungma@eit.uni-kl.de{}
5312027Sjungma@eit.uni-kl.de
5412027Sjungma@eit.uni-kl.de
5512027Sjungma@eit.uni-kl.de// destructor
5612027Sjungma@eit.uni-kl.de
5712027Sjungma@eit.uni-kl.desc_mutex::~sc_mutex()
5812027Sjungma@eit.uni-kl.de{}
5912027Sjungma@eit.uni-kl.de
6012027Sjungma@eit.uni-kl.de// interface methods
6112027Sjungma@eit.uni-kl.de
6212027Sjungma@eit.uni-kl.de// blocks until mutex could be locked
6312027Sjungma@eit.uni-kl.de
6412027Sjungma@eit.uni-kl.deint
6512027Sjungma@eit.uni-kl.desc_mutex::lock()
6612027Sjungma@eit.uni-kl.de{
6712027Sjungma@eit.uni-kl.de    if ( m_owner == sc_get_current_process_b()) return 0;
6812027Sjungma@eit.uni-kl.de    while( in_use() ) {
6912027Sjungma@eit.uni-kl.de	sc_core::wait( m_free, sc_get_curr_simcontext() );
7012027Sjungma@eit.uni-kl.de    }
7112027Sjungma@eit.uni-kl.de    m_owner = sc_get_current_process_b();
7212027Sjungma@eit.uni-kl.de    return 0;
7312027Sjungma@eit.uni-kl.de}
7412027Sjungma@eit.uni-kl.de
7512027Sjungma@eit.uni-kl.de
7612027Sjungma@eit.uni-kl.de// returns -1 if mutex could not be locked
7712027Sjungma@eit.uni-kl.de
7812027Sjungma@eit.uni-kl.deint
7912027Sjungma@eit.uni-kl.desc_mutex::trylock()
8012027Sjungma@eit.uni-kl.de{
8112027Sjungma@eit.uni-kl.de    if ( m_owner == sc_get_current_process_b()) return 0;
8212027Sjungma@eit.uni-kl.de    if( in_use() ) {
8312027Sjungma@eit.uni-kl.de	return -1;
8412027Sjungma@eit.uni-kl.de    }
8512027Sjungma@eit.uni-kl.de    m_owner = sc_get_current_process_b();
8612027Sjungma@eit.uni-kl.de    return 0;
8712027Sjungma@eit.uni-kl.de}
8812027Sjungma@eit.uni-kl.de
8912027Sjungma@eit.uni-kl.de
9012027Sjungma@eit.uni-kl.de// returns -1 if mutex was not locked by caller
9112027Sjungma@eit.uni-kl.de
9212027Sjungma@eit.uni-kl.deint
9312027Sjungma@eit.uni-kl.desc_mutex::unlock()
9412027Sjungma@eit.uni-kl.de{
9512027Sjungma@eit.uni-kl.de    if( m_owner != sc_get_current_process_b() ) {
9612027Sjungma@eit.uni-kl.de	return -1;
9712027Sjungma@eit.uni-kl.de    }
9812027Sjungma@eit.uni-kl.de    m_owner = 0;
9912027Sjungma@eit.uni-kl.de    m_free.notify();
10012027Sjungma@eit.uni-kl.de    return 0;
10112027Sjungma@eit.uni-kl.de}
10212027Sjungma@eit.uni-kl.de
10312027Sjungma@eit.uni-kl.de} // namespace sc_core
10412027Sjungma@eit.uni-kl.de
10512027Sjungma@eit.uni-kl.de// $Log: sc_mutex.cpp,v $
10612027Sjungma@eit.uni-kl.de// Revision 1.7  2011/08/26 20:45:40  acg
10712027Sjungma@eit.uni-kl.de//  Andy Goodrich: moved the modification log to the end of the file to
10812027Sjungma@eit.uni-kl.de//  eliminate source line number skew when check-ins are done.
10912027Sjungma@eit.uni-kl.de//
11012027Sjungma@eit.uni-kl.de// Revision 1.6  2011/03/28 13:02:29  acg
11112027Sjungma@eit.uni-kl.de//  Andy Goodrich: removed sc_event in sc_mutex class from the object
11212027Sjungma@eit.uni-kl.de//  hierarchy since it is considered a "kernel" event.
11312027Sjungma@eit.uni-kl.de//
11412027Sjungma@eit.uni-kl.de// Revision 1.5  2011/02/18 20:23:45  acg
11512027Sjungma@eit.uni-kl.de//  Andy Goodrich: Copyright update.
11612027Sjungma@eit.uni-kl.de//
11712027Sjungma@eit.uni-kl.de// Revision 1.4  2010/11/02 16:31:01  acg
11812027Sjungma@eit.uni-kl.de//  Andy Goodrich: changed object derivation to use sc_object rather than
11912027Sjungma@eit.uni-kl.de//  sc_prim_channel as the parent class.
12012027Sjungma@eit.uni-kl.de//
12112027Sjungma@eit.uni-kl.de// Revision 1.3  2008/11/13 15:29:46  acg
12212027Sjungma@eit.uni-kl.de//  David C. Black, ESLX, Inc: lock & trylock now allow owner to apply
12312027Sjungma@eit.uni-kl.de//  lock more than once without incident. Previous behavior locked up the
12412027Sjungma@eit.uni-kl.de//  owning process.
12512027Sjungma@eit.uni-kl.de//
12612027Sjungma@eit.uni-kl.de// Revision 1.2  2008/05/20 16:46:18  acg
12712027Sjungma@eit.uni-kl.de//  Andy Goodrich: added checks for multiple writers.
12812027Sjungma@eit.uni-kl.de//
12912027Sjungma@eit.uni-kl.de// Revision 1.1.1.1  2006/12/15 20:20:04  acg
13012027Sjungma@eit.uni-kl.de// SystemC 2.3
13112027Sjungma@eit.uni-kl.de//
13212027Sjungma@eit.uni-kl.de// Revision 1.4  2006/03/21 00:00:27  acg
13312027Sjungma@eit.uni-kl.de//   Andy Goodrich: changed name of sc_get_current_process_base() to be
13412027Sjungma@eit.uni-kl.de//   sc_get_current_process_b() since its returning an sc_process_b instance.
13512027Sjungma@eit.uni-kl.de//
13612027Sjungma@eit.uni-kl.de// Revision 1.3  2006/01/13 18:47:42  acg
13712027Sjungma@eit.uni-kl.de// Added $Log command so that CVS comments are reproduced in the source.
13812027Sjungma@eit.uni-kl.de//
13912027Sjungma@eit.uni-kl.de
14012027Sjungma@eit.uni-kl.de// Taf!
141