Gabe Black has uploaded this change for review. (
https://gem5-review.googlesource.com/c/public/gem5/+/12617
Change subject: systemc: Implement sc_semaphore.
......................................................................
systemc: Implement sc_semaphore.
Change-Id: I778d41bd81880e76caa71dc92359a00127d8f987
---
M src/systemc/channel/sc_semaphore.cc
M src/systemc/ext/channel/sc_semaphore.hh
2 files changed, 18 insertions(+), 16 deletions(-)
diff --git a/src/systemc/channel/sc_semaphore.cc
b/src/systemc/channel/sc_semaphore.cc
index cfae598..ba52c19 100644
--- a/src/systemc/channel/sc_semaphore.cc
+++ b/src/systemc/channel/sc_semaphore.cc
@@ -34,43 +34,41 @@
namespace sc_core
{
-sc_semaphore::sc_semaphore(int) :
+sc_semaphore::sc_semaphore(int value) :
sc_interface(), sc_semaphore_if(),
- sc_object(sc_gen_unique_name("semaphore"))
+ sc_object(sc_gen_unique_name("semaphore")), _value(value)
{}
-sc_semaphore::sc_semaphore(const char *name, int) :
- sc_interface(), sc_semaphore_if(), sc_object(name)
+sc_semaphore::sc_semaphore(const char *name, int value) :
+ sc_interface(), sc_semaphore_if(), sc_object(name), _value(value)
{}
int
sc_semaphore::wait()
{
- warn("%s not implemented.\n", __PRETTY_FUNCTION__);
+ while (trywait() == -1)
+ ::sc_core::wait(posted);
return 0;
}
int
sc_semaphore::trywait()
{
- warn("%s not implemented.\n", __PRETTY_FUNCTION__);
+ if (!_value)
+ return -1;
+
+ _value--;
return 0;
}
int
sc_semaphore::post()
{
- warn("%s not implemented.\n", __PRETTY_FUNCTION__);
+ if (_value++ == 0)
+ posted.notify();
return 0;
}
-int
-sc_semaphore::get_value() const
-{
- warn("%s not implemented.\n", __PRETTY_FUNCTION__);
- return 0;
-}
-
-const char *sc_semaphore::kind() const { return "sc_semaphore"; }
+int sc_semaphore::get_value() const { return _value; }
} // namespace sc_core
diff --git a/src/systemc/ext/channel/sc_semaphore.hh
b/src/systemc/ext/channel/sc_semaphore.hh
index fb1e825..31af9c7 100644
--- a/src/systemc/ext/channel/sc_semaphore.hh
+++ b/src/systemc/ext/channel/sc_semaphore.hh
@@ -30,6 +30,7 @@
#ifndef __SYSTEMC_EXT_CHANNEL_SC_SEMAPHORE_HH__
#define __SYSTEMC_EXT_CHANNEL_SC_SEMAPHORE_HH__
+#include "../core/sc_event.hh"
#include "../core/sc_object.hh"
#include "sc_semaphore_if.hh"
@@ -47,7 +48,7 @@
virtual int post();
virtual int get_value() const;
- virtual const char *kind() const;
+ virtual const char *kind() const { return "sc_semaphore"; }
private:
// Disabled
@@ -56,6 +57,9 @@
{}
sc_semaphore &operator = (const sc_semaphore &) { return *this; }
+
+ int _value;
+ sc_event posted;
};
} // namespace sc_core
--
To view, visit https://gem5-review.googlesource.com/c/public/gem5/+/12617
To unsubscribe, or for help writing mail filters, visit
https://gem5-review.googlesource.com/settings
Gerrit-Project: public/gem5
Gerrit-Branch: master
Gerrit-Change-Id: I778d41bd81880e76caa71dc92359a00127d8f987
Gerrit-Change-Number: 12617
Gerrit-PatchSet: 1
Gerrit-Owner: Gabe Black <[email protected]>
Gerrit-MessageType: newchange
_______________________________________________
gem5-dev mailing list
[email protected]
http://m5sim.org/mailman/listinfo/gem5-dev