diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/systemc/channel/sc_mutex.cc | 16 | ||||
-rw-r--r-- | 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 |