From 19fbeb515aacbf954dba1d4066007736b1252c0e Mon Sep 17 00:00:00 2001 From: Gabe Black Date: Tue, 11 Sep 2018 01:51:27 -0700 Subject: [PATCH] systemc: Implement sc_mutex. Change-Id: I8a5bd03b46d44aeca3bba15a01a5f2180b4ed5c7 Reviewed-on: https://gem5-review.googlesource.com/c/12618 Reviewed-by: Gabe Black Maintainer: Gabe Black --- src/systemc/channel/sc_mutex.cc | 16 +++++++++++----- src/systemc/ext/channel/sc_mutex.hh | 7 ++++++- 2 files changed, 17 insertions(+), 6 deletions(-) diff --git a/src/systemc/channel/sc_mutex.cc b/src/systemc/channel/sc_mutex.cc index 80d086f55..9c5e9c20c 100644 --- a/src/systemc/channel/sc_mutex.cc +++ b/src/systemc/channel/sc_mutex.cc @@ -28,6 +28,7 @@ */ #include "base/logging.hh" +#include "systemc/core/scheduler.hh" #include "systemc/ext/channel/sc_mutex.hh" #include "systemc/ext/core/sc_module.hh" // for sc_gen_unique_name @@ -45,24 +46,29 @@ sc_mutex::sc_mutex(const char *name) : int sc_mutex::lock() { - warn("%s not implemented.\n", __PRETTY_FUNCTION__); + while (trylock() == -1) + wait(unlockEvent); return 0; } int sc_mutex::trylock() { - warn("%s not implemented.\n", __PRETTY_FUNCTION__); + if (holder.valid()) + return -1; + holder = ::sc_gem5::scheduler.current(); return 0; } int sc_mutex::unlock() { - warn("%s not implemented.\n", __PRETTY_FUNCTION__); + if (holder != ::sc_gem5::scheduler.current()) + return -1; + + holder = nullptr; + unlockEvent.notify(); return 0; } -const char *sc_mutex::kind() const { return "sc_mutex"; } - } // namespace sc_core diff --git a/src/systemc/ext/channel/sc_mutex.hh b/src/systemc/ext/channel/sc_mutex.hh index af35bdd65..12205da9b 100644 --- a/src/systemc/ext/channel/sc_mutex.hh +++ b/src/systemc/ext/channel/sc_mutex.hh @@ -30,7 +30,9 @@ #ifndef __SYSTEMC_EXT_CHANNEL_SC_MUTEX_HH__ #define __SYSTEMC_EXT_CHANNEL_SC_MUTEX_HH__ +#include "../core/sc_event.hh" #include "../core/sc_object.hh" +#include "../core/sc_process_handle.hh" #include "sc_mutex_if.hh" namespace sc_core @@ -46,12 +48,15 @@ class sc_mutex : public sc_mutex_if, public sc_object virtual int trylock(); virtual int unlock(); - virtual const char *kind() const; + virtual const char *kind() const { return "sc_mutex"; } private: // Disabled sc_mutex(const sc_mutex &) : sc_interface(), sc_mutex_if(), sc_object() {} sc_mutex &operator = (const sc_mutex &) { return *this; } + + sc_process_handle holder; + sc_event unlockEvent; }; } // namespace sc_core -- 2.30.2