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