Gabe Black has uploaded this change for review. ( https://gem5-review.googlesource.com/c/public/gem5/+/32647 )

Change subject: dev: Use lambdas instead of the Callback type for serial devices.
......................................................................

dev: Use lambdas instead of the Callback type for serial devices.

Issue-on: https://gem5.atlassian.net/browse/GEM5-698
Change-Id: Idb87fa0b90d14981fd61f997285f61b2ef304227
---
M src/dev/serial/serial.cc
M src/dev/serial/serial.hh
M src/dev/serial/uart.cc
M src/dev/serial/uart.hh
M src/dev/virtio/console.cc
M src/dev/virtio/console.hh
6 files changed, 16 insertions(+), 23 deletions(-)



diff --git a/src/dev/serial/serial.cc b/src/dev/serial/serial.cc
index ac1f261..366c388 100644
--- a/src/dev/serial/serial.cc
+++ b/src/dev/serial/serial.cc
@@ -41,8 +41,7 @@
 #include "params/SerialDevice.hh"
 #include "params/SerialNullDevice.hh"

-SerialDevice::SerialDevice(const SerialDeviceParams *p)
-    : SimObject(p), interfaceCallback(nullptr)
+SerialDevice::SerialDevice(const SerialDeviceParams *p) : SimObject(p)
 {
 }

@@ -51,14 +50,14 @@
 }

 void
-SerialDevice::regInterfaceCallback(Callback *c)
+SerialDevice::regInterfaceCallback(const std::function<void()> &callback)
 {
     // This can happen if the user has connected multiple UARTs to the
     // same terminal. In that case, each of them tries to register
     // callbacks.
-    if (interfaceCallback)
-        fatal("A UART has already been associated with this device.\n");
-    interfaceCallback = c;
+    fatal_if(interfaceCallback,
+             "A UART has already been associated with this device.");
+    interfaceCallback = callback;
 }

 void
@@ -67,7 +66,7 @@
     assert(dataAvailable());
     // Registering a callback is optional.
     if (interfaceCallback)
-        interfaceCallback->process();
+        interfaceCallback();
 }


diff --git a/src/dev/serial/serial.hh b/src/dev/serial/serial.hh
index 2ea145d..838c0ab 100644
--- a/src/dev/serial/serial.hh
+++ b/src/dev/serial/serial.hh
@@ -38,7 +38,8 @@
 #ifndef __DEV_SERIAL_HH__
 #define __DEV_SERIAL_HH__

-#include "base/callback.hh"
+#include <functional>
+
 #include "sim/sim_object.hh"

 struct SerialDeviceParams;
@@ -103,9 +104,9 @@
      * method. The interface layer may use this method to register a
      * callback that informs it of pending data.
      *
-     * @param c Callback instance from interface layer.
+     * @param c Callback from interface layer.
      */
-    void regInterfaceCallback(Callback *c);
+    void regInterfaceCallback(const std::function<void()> &callback);

     /**
      * Check if there is pending data from the serial device.
@@ -136,7 +137,7 @@

   private:
     /** Currently regisxtered host interface layer callback */
-    Callback *interfaceCallback;
+    std::function<void()> interfaceCallback;
 };

 /**
diff --git a/src/dev/serial/uart.cc b/src/dev/serial/uart.cc
index 098808c..3e9131c 100644
--- a/src/dev/serial/uart.cc
+++ b/src/dev/serial/uart.cc
@@ -32,13 +32,11 @@

 #include "dev/serial/uart.hh"

-Uart::Uart(const Params *p, Addr pio_size)
-    : BasicPioDevice(p, pio_size),
-      platform(p->platform), device(p->device),
-      callbackDataAvail(this)
+Uart::Uart(const Params *p, Addr pio_size) :
+    BasicPioDevice(p, pio_size), platform(p->platform), device(p->device)
 {
     status = 0;

     // setup serial device callbacks
-    device->regInterfaceCallback(&callbackDataAvail);
+    device->regInterfaceCallback([this]() { dataAvailable(); });
 }
diff --git a/src/dev/serial/uart.hh b/src/dev/serial/uart.hh
index 14ce44e..21ea578 100644
--- a/src/dev/serial/uart.hh
+++ b/src/dev/serial/uart.hh
@@ -70,9 +70,6 @@
      * @return interrupt status
      */
     bool intStatus() { return status ? true : false; }
-
-  protected:
-    MakeCallback<Uart, &Uart::dataAvailable> callbackDataAvail;
 };

 #endif // __UART_HH__
diff --git a/src/dev/virtio/console.cc b/src/dev/virtio/console.cc
index 5aeceb0..1bb6ada 100644
--- a/src/dev/virtio/console.cc
+++ b/src/dev/virtio/console.cc
@@ -45,7 +45,7 @@
     : VirtIODeviceBase(params, ID_CONSOLE, sizeof(Config), F_SIZE),
qRecv(params->system->physProxy, byteOrder, params->qRecvSize, *this), qTrans(params->system->physProxy, byteOrder, params->qTransSize, *this),
-      device(*params->device), callbackDataAvail(qRecv)
+      device(*params->device)
 {
     registerQueue(qRecv);
     registerQueue(qTrans);
@@ -53,7 +53,7 @@
     config.cols = 80;
     config.rows = 24;

-    device.regInterfaceCallback(&callbackDataAvail);
+    device.regInterfaceCallback([this]() { qRecv.trySend(); });
 }


diff --git a/src/dev/virtio/console.hh b/src/dev/virtio/console.hh
index 3691585..d60bc66 100644
--- a/src/dev/virtio/console.hh
+++ b/src/dev/virtio/console.hh
@@ -148,8 +148,6 @@

   protected:
     SerialDevice &device;
-    MakeCallback<VirtIOConsole::TermRecvQueue,
-                 &VirtIOConsole::TermRecvQueue::trySend> callbackDataAvail;
 };

 #endif // __DEV_VIRTIO_CONSOLE_HH__

--
To view, visit https://gem5-review.googlesource.com/c/public/gem5/+/32647
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: Idb87fa0b90d14981fd61f997285f61b2ef304227
Gerrit-Change-Number: 32647
Gerrit-PatchSet: 1
Gerrit-Owner: Gabe Black <gabebl...@google.com>
Gerrit-MessageType: newchange
_______________________________________________
gem5-dev mailing list -- gem5-dev@gem5.org
To unsubscribe send an email to gem5-dev-le...@gem5.org
%(web_page_url)slistinfo%(cgiext)s/%(_internal_name)s

Reply via email to