gem5-dev@gem5.org

The gem5 Developer List

View all threads

[M] Change in gem5/gem5[develop]: sim: Define a new MemberEventWrapper event class

GB
Gabriel B. (Gerrit)
Mon, Feb 6, 2023 5:38 PM

Gabriel B. has uploaded this change for review. (
https://gem5-review.googlesource.com/c/public/gem5/+/67653?usp=email )

Change subject: sim: Define a new MemberEventWrapper event class
......................................................................

sim: Define a new MemberEventWrapper event class

This new event class simplifies the use of EventWrapper and aims at
superseeding it. EventWrapper has been redefined in terms of
MemberEventWrapper.

MemberEventWrapper makes use of the new type traits to simplify
template parameterization and encourage its use over SimpleEvent that
often wraps a lambda that merely calls a member function.

Change-Id: Ie59e4c51705b9c2b2faa27097678d7d85f5b99c6

M src/sim/eventq.hh
1 file changed, 42 insertions(+), 21 deletions(-)

diff --git a/src/sim/eventq.hh b/src/sim/eventq.hh
index 62495bf..3eefbd3 100644
--- a/src/sim/eventq.hh
+++ b/src/sim/eventq.hh
@@ -46,7 +46,9 @@

#include "base/debug.hh"
#include "base/flags.hh"
+#include "base/named.hh"
#include "base/trace.hh"
+#include "base/type_traits.hh"
#include "base/types.hh"
#include "base/uncontended_mutex.hh"
#include "debug/Event.hh"
@@ -1071,38 +1073,40 @@
void setCurTick(Tick newVal) { eventq->setCurTick(newVal); }
};

-template <class T, void (T::* F)()>
-class EventWrapper : public Event
+template <auto F>
+class MemberEventWrapper: public Event, public Named
{

  • private:
  • T *object;
  • using T = MemberFunctionClass_t<F>;
  • using R = MemberFunctionReturn_t<F>;
  • static_assert(std::is_same_v<void, R>);
  • static_assert(std::is_same_v<MemberFunctionArgsTuple_t<F>,
    std::tuple<>>);
  • public:
  • EventWrapper(T *obj, bool del = false, Priority p = Default_Pri)
  •    : Event(p), object(obj)
    

+public:

  • MemberEventWrapper(T *object, bool del = false, Priority p =
    Default_Pri):
  •    Event(p),
    
  •    Named(object->name() + ".wrapped_event"),
    
  •    mObject(object)
    {
    
  •    if (del)
    
  •        setFlags(AutoDelete);
    
  •    if (del) setFlags(AutoDelete);
    }
    
  • EventWrapper(T &obj, bool del = false, Priority p = Default_Pri)
  •    : Event(p), object(&obj)
    
  • {
  •    if (del)
    
  •        setFlags(AutoDelete);
    
  • }
  • MemberEventWrapper(T &object, bool del = false, Priority p =
    Default_Pri):
  •    MemberEventWrapper(&object, del, p)
    
  • {}
  • void process() { (object->*F)(); }
  • const std::string
  • name() const
  • {
  •    return object->name() + ".wrapped_event";
    
  • void process() {
  •    gem5_assert(mObject);
    
  •    (mObject->*F)();
    }
    
    const char *description() const { return "EventWrapped"; }
    

+private:

  • T *mObject = nullptr;
    };

+template <class T, void (T::* F)()>
+using EventWrapper = MemberEventWrapper<F>;
+
class EventFunctionWrapper : public Event
{
private:

--
To view, visit
https://gem5-review.googlesource.com/c/public/gem5/+/67653?usp=email
To unsubscribe, or for help writing mail filters, visit
https://gem5-review.googlesource.com/settings

Gerrit-Project: public/gem5
Gerrit-Branch: develop
Gerrit-Change-Id: Ie59e4c51705b9c2b2faa27097678d7d85f5b99c6
Gerrit-Change-Number: 67653
Gerrit-PatchSet: 1
Gerrit-Owner: Gabriel B. gabriel.busnot@arteris.com
Gerrit-MessageType: newchange

Gabriel B. has uploaded this change for review. ( https://gem5-review.googlesource.com/c/public/gem5/+/67653?usp=email ) Change subject: sim: Define a new MemberEventWrapper event class ...................................................................... sim: Define a new MemberEventWrapper event class This new event class simplifies the use of EventWrapper and aims at superseeding it. EventWrapper has been redefined in terms of MemberEventWrapper. MemberEventWrapper makes use of the new type traits to simplify template parameterization and encourage its use over SimpleEvent that often wraps a lambda that merely calls a member function. Change-Id: Ie59e4c51705b9c2b2faa27097678d7d85f5b99c6 --- M src/sim/eventq.hh 1 file changed, 42 insertions(+), 21 deletions(-) diff --git a/src/sim/eventq.hh b/src/sim/eventq.hh index 62495bf..3eefbd3 100644 --- a/src/sim/eventq.hh +++ b/src/sim/eventq.hh @@ -46,7 +46,9 @@ #include "base/debug.hh" #include "base/flags.hh" +#include "base/named.hh" #include "base/trace.hh" +#include "base/type_traits.hh" #include "base/types.hh" #include "base/uncontended_mutex.hh" #include "debug/Event.hh" @@ -1071,38 +1073,40 @@ void setCurTick(Tick newVal) { eventq->setCurTick(newVal); } }; -template <class T, void (T::* F)()> -class EventWrapper : public Event +template <auto F> +class MemberEventWrapper: public Event, public Named { - private: - T *object; + using T = MemberFunctionClass_t<F>; + using R = MemberFunctionReturn_t<F>; + static_assert(std::is_same_v<void, R>); + static_assert(std::is_same_v<MemberFunctionArgsTuple_t<F>, std::tuple<>>); - public: - EventWrapper(T *obj, bool del = false, Priority p = Default_Pri) - : Event(p), object(obj) +public: + MemberEventWrapper(T *object, bool del = false, Priority p = Default_Pri): + Event(p), + Named(object->name() + ".wrapped_event"), + mObject(object) { - if (del) - setFlags(AutoDelete); + if (del) setFlags(AutoDelete); } - EventWrapper(T &obj, bool del = false, Priority p = Default_Pri) - : Event(p), object(&obj) - { - if (del) - setFlags(AutoDelete); - } + MemberEventWrapper(T &object, bool del = false, Priority p = Default_Pri): + MemberEventWrapper(&object, del, p) + {} - void process() { (object->*F)(); } - - const std::string - name() const - { - return object->name() + ".wrapped_event"; + void process() { + gem5_assert(mObject); + (mObject->*F)(); } const char *description() const { return "EventWrapped"; } +private: + T *mObject = nullptr; }; +template <class T, void (T::* F)()> +using EventWrapper = MemberEventWrapper<F>; + class EventFunctionWrapper : public Event { private: -- To view, visit https://gem5-review.googlesource.com/c/public/gem5/+/67653?usp=email To unsubscribe, or for help writing mail filters, visit https://gem5-review.googlesource.com/settings Gerrit-Project: public/gem5 Gerrit-Branch: develop Gerrit-Change-Id: Ie59e4c51705b9c2b2faa27097678d7d85f5b99c6 Gerrit-Change-Number: 67653 Gerrit-PatchSet: 1 Gerrit-Owner: Gabriel B. <gabriel.busnot@arteris.com> Gerrit-MessageType: newchange