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_host_mutex.h -- A "real" mutex for the underlying host system
2312027Sjungma@eit.uni-kl.de
2412027Sjungma@eit.uni-kl.de  Original Author: Philipp A. Hartmann, OFFIS
2512027Sjungma@eit.uni-kl.de
2612027Sjungma@eit.uni-kl.de CHANGE LOG AT THE END OF THE FILE
2712027Sjungma@eit.uni-kl.de *****************************************************************************/
2812027Sjungma@eit.uni-kl.de
2912027Sjungma@eit.uni-kl.de#ifndef SC_HOST_MUTEX_H_INCLUDED_
3012027Sjungma@eit.uni-kl.de#define SC_HOST_MUTEX_H_INCLUDED_
3112027Sjungma@eit.uni-kl.de
3212027Sjungma@eit.uni-kl.de#ifndef SC_INCLUDE_WINDOWS_H
3312027Sjungma@eit.uni-kl.de#  define SC_INCLUDE_WINDOWS_H // include Windows.h, if needed
3412027Sjungma@eit.uni-kl.de#endif
3512027Sjungma@eit.uni-kl.de#include "sysc/kernel/sc_cmnhdr.h"
3612027Sjungma@eit.uni-kl.de#include "sysc/communication/sc_mutex_if.h"
3712027Sjungma@eit.uni-kl.de
3812027Sjungma@eit.uni-kl.de#if defined(WIN32) || defined(_WIN32)
3912027Sjungma@eit.uni-kl.de
4012027Sjungma@eit.uni-kl.de#define SC_MTX_TYPE_ CRITICAL_SECTION
4112027Sjungma@eit.uni-kl.de
4212027Sjungma@eit.uni-kl.de#define SC_MTX_INIT_( Mutex ) \
4312027Sjungma@eit.uni-kl.de    InitializeCriticalSection( &(Mutex) )
4412027Sjungma@eit.uni-kl.de#define SC_MTX_LOCK_( Mutex ) \
4512027Sjungma@eit.uni-kl.de    EnterCriticalSection( &(Mutex) )
4612027Sjungma@eit.uni-kl.de#define SC_MTX_UNLOCK_( Mutex ) \
4712027Sjungma@eit.uni-kl.de    LeaveCriticalSection( &(Mutex) )
4812027Sjungma@eit.uni-kl.de#define SC_MTX_TRYLOCK_( Mutex ) \
4912027Sjungma@eit.uni-kl.de    ( TryEnterCriticalSection( &(Mutex) ) != 0 )
5012027Sjungma@eit.uni-kl.de#define SC_MTX_DESTROY_( Mutex ) \
5112027Sjungma@eit.uni-kl.de    DeleteCriticalSection( &(Mutex) )
5212027Sjungma@eit.uni-kl.de
5312027Sjungma@eit.uni-kl.de#else // use pthread mutex
5412027Sjungma@eit.uni-kl.de
5512027Sjungma@eit.uni-kl.de#include <pthread.h>
5612027Sjungma@eit.uni-kl.de#define SC_MTX_TYPE_ pthread_mutex_t
5712027Sjungma@eit.uni-kl.de
5812027Sjungma@eit.uni-kl.de#if defined(__hpux)
5912027Sjungma@eit.uni-kl.de#  define SC_PTHREAD_NULL_ cma_c_null
6012027Sjungma@eit.uni-kl.de#else // !defined(__hpux)
6112027Sjungma@eit.uni-kl.de#  define SC_PTHREAD_NULL_ NULL
6212027Sjungma@eit.uni-kl.de#endif
6312027Sjungma@eit.uni-kl.de
6412027Sjungma@eit.uni-kl.de#define SC_MTX_INIT_( Mutex ) \
6512027Sjungma@eit.uni-kl.de    pthread_mutex_init( &(Mutex), SC_PTHREAD_NULL_ )
6612027Sjungma@eit.uni-kl.de#define SC_MTX_LOCK_( Mutex ) \
6712027Sjungma@eit.uni-kl.de    pthread_mutex_lock( &(Mutex) )
6812027Sjungma@eit.uni-kl.de#define SC_MTX_UNLOCK_( Mutex ) \
6912027Sjungma@eit.uni-kl.de    pthread_mutex_unlock( &(Mutex) )
7012027Sjungma@eit.uni-kl.de
7112027Sjungma@eit.uni-kl.de#ifdef _XOPEN_SOURCE
7212027Sjungma@eit.uni-kl.de#   define SC_MTX_TRYLOCK_( Mutex ) \
7312027Sjungma@eit.uni-kl.de       ( pthread_mutex_trylock( &(Mutex) ) == 0 )
7412027Sjungma@eit.uni-kl.de#else // no try_lock available
7512027Sjungma@eit.uni-kl.de#   define SC_MTX_TRYLOCK_( Mutex ) \
7612027Sjungma@eit.uni-kl.de       ( false )
7712027Sjungma@eit.uni-kl.de#endif
7812027Sjungma@eit.uni-kl.de
7912027Sjungma@eit.uni-kl.de#define SC_MTX_DESTROY_( Mutex ) \
8012027Sjungma@eit.uni-kl.de    pthread_mutex_destroy( &(Mutex) )
8112027Sjungma@eit.uni-kl.de
8212027Sjungma@eit.uni-kl.de#endif
8312027Sjungma@eit.uni-kl.de
8412027Sjungma@eit.uni-kl.denamespace sc_core {
8512027Sjungma@eit.uni-kl.de
8612027Sjungma@eit.uni-kl.de// ----------------------------------------------------------------------------
8712027Sjungma@eit.uni-kl.de//  CLASS : sc_host_mutex
8812027Sjungma@eit.uni-kl.de//
8912027Sjungma@eit.uni-kl.de//   The sc_host_mutex class, wrapping an OS mutex on the simulation host
9012027Sjungma@eit.uni-kl.de// ----------------------------------------------------------------------------
9112027Sjungma@eit.uni-kl.de
9212027Sjungma@eit.uni-kl.declass sc_host_mutex : public sc_mutex_if
9312027Sjungma@eit.uni-kl.de{
9412027Sjungma@eit.uni-kl.de    typedef SC_MTX_TYPE_ underlying_type;
9512027Sjungma@eit.uni-kl.depublic:
9612027Sjungma@eit.uni-kl.de
9712027Sjungma@eit.uni-kl.de    // constructors and destructor
9812027Sjungma@eit.uni-kl.de
9912027Sjungma@eit.uni-kl.de    sc_host_mutex()
10012027Sjungma@eit.uni-kl.de	{ SC_MTX_INIT_(m_mtx); }
10112027Sjungma@eit.uni-kl.de    virtual ~sc_host_mutex()
10212027Sjungma@eit.uni-kl.de	{ SC_MTX_DESTROY_(m_mtx); }
10312027Sjungma@eit.uni-kl.de
10412027Sjungma@eit.uni-kl.de
10512027Sjungma@eit.uni-kl.de    // interface methods
10612027Sjungma@eit.uni-kl.de
10712027Sjungma@eit.uni-kl.de    // blocks until mutex could be locked
10812027Sjungma@eit.uni-kl.de    virtual int lock()
10912027Sjungma@eit.uni-kl.de	{ SC_MTX_LOCK_(m_mtx); return 0; }
11012027Sjungma@eit.uni-kl.de
11112027Sjungma@eit.uni-kl.de    // returns -1 if mutex could not be locked
11212027Sjungma@eit.uni-kl.de    virtual int trylock()
11312027Sjungma@eit.uni-kl.de	{ return SC_MTX_TRYLOCK_(m_mtx) ? 0 : -1; }
11412027Sjungma@eit.uni-kl.de
11512027Sjungma@eit.uni-kl.de    // should return -1 if mutex was not locked by caller,
11612027Sjungma@eit.uni-kl.de    // but is not yet able to check this
11712027Sjungma@eit.uni-kl.de    virtual int unlock()
11812027Sjungma@eit.uni-kl.de	{ SC_MTX_UNLOCK_(m_mtx); return 0; }
11912027Sjungma@eit.uni-kl.de
12012027Sjungma@eit.uni-kl.deprivate:
12112027Sjungma@eit.uni-kl.de    underlying_type m_mtx;
12212027Sjungma@eit.uni-kl.de};
12312027Sjungma@eit.uni-kl.de
12412027Sjungma@eit.uni-kl.de} // namespace sc_core
12512027Sjungma@eit.uni-kl.de
12612027Sjungma@eit.uni-kl.de#undef SC_MTX_TYPE_
12712027Sjungma@eit.uni-kl.de#undef SC_MTX_INIT_
12812027Sjungma@eit.uni-kl.de#undef SC_MTX_DESTROY_
12912027Sjungma@eit.uni-kl.de#undef SC_MTX_LOCK_
13012027Sjungma@eit.uni-kl.de#undef SC_MTX_TRYLOCK_
13112027Sjungma@eit.uni-kl.de#undef SC_MTX_UNLOCK_
13212027Sjungma@eit.uni-kl.de#undef SC_PTHREAD_NULL_
13312027Sjungma@eit.uni-kl.de
13412027Sjungma@eit.uni-kl.de/*****************************************************************************
13512027Sjungma@eit.uni-kl.de
13612027Sjungma@eit.uni-kl.de  MODIFICATION LOG - modifiers, enter your name, affiliation, date and
13712027Sjungma@eit.uni-kl.de  changes you are making here.
13812027Sjungma@eit.uni-kl.de
13912027Sjungma@eit.uni-kl.de      Name, Affiliation, Date:
14012027Sjungma@eit.uni-kl.de  Description of Modification:
14112027Sjungma@eit.uni-kl.de *****************************************************************************/
14212027Sjungma@eit.uni-kl.de//$Log: sc_host_mutex.h,v $
14312027Sjungma@eit.uni-kl.de//Revision 1.4  2011/08/30 21:53:23  acg
14412027Sjungma@eit.uni-kl.de// Jerome Cornet: include window.h for gnu c in windows case.
14512027Sjungma@eit.uni-kl.de//
14612027Sjungma@eit.uni-kl.de//Revision 1.3  2011/08/07 19:08:01  acg
14712027Sjungma@eit.uni-kl.de// Andy Goodrich: moved logs to end of file so line number synching works
14812027Sjungma@eit.uni-kl.de// better between versions.
14912027Sjungma@eit.uni-kl.de//
15012027Sjungma@eit.uni-kl.de//Revision 1.2  2011/06/25 17:08:38  acg
15112027Sjungma@eit.uni-kl.de// Andy Goodrich: Jerome Cornet's changes to use libtool to build the
15212027Sjungma@eit.uni-kl.de// library.
15312027Sjungma@eit.uni-kl.de//
15412027Sjungma@eit.uni-kl.de//Revision 1.1  2011/04/18 19:04:11  acg
15512027Sjungma@eit.uni-kl.de// Philipp A. Hartmann: first check in of file.
15612027Sjungma@eit.uni-kl.de//
15712027Sjungma@eit.uni-kl.de
15812027Sjungma@eit.uni-kl.de#endif
15912027Sjungma@eit.uni-kl.de
16012027Sjungma@eit.uni-kl.de// Taf!
161