Gabe Black has submitted this change and it was merged. ( https://gem5-review.googlesource.com/c/public/gem5/+/12617 )

Change subject: systemc: Implement sc_semaphore.
......................................................................

systemc: Implement sc_semaphore.

Change-Id: I778d41bd81880e76caa71dc92359a00127d8f987
Reviewed-on: https://gem5-review.googlesource.com/c/12617
Reviewed-by: Gabe Black <[email protected]>
Maintainer: Gabe Black <[email protected]>
---
M src/systemc/channel/sc_semaphore.cc
M src/systemc/ext/channel/sc_semaphore.hh
2 files changed, 18 insertions(+), 16 deletions(-)

Approvals:
  Gabe Black: Looks good to me, approved; Looks good to me, approved



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: 7
Gerrit-Owner: Gabe Black <[email protected]>
Gerrit-Reviewer: Andreas Sandberg <[email protected]>
Gerrit-Reviewer: Gabe Black <[email protected]>
Gerrit-Reviewer: Giacomo Travaglini <[email protected]>
Gerrit-Reviewer: Jason Lowe-Power <[email protected]>
Gerrit-Reviewer: Matthias Jung <[email protected]>
Gerrit-MessageType: merged
_______________________________________________
gem5-dev mailing list
[email protected]
http://m5sim.org/mailman/listinfo/gem5-dev

Reply via email to