base,cpu,dev: Add a level of indirection for ListenSockets.

This makes room for there to be different implementations for different
types of sockets.

Change-Id: I8c959e2c3400caec8242e693e11330e072bc2c5f
Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/69162
Reviewed-by: Yu-hsin Wang <yuhsingw@google.com>
Tested-by: kokoro <noreply+kokoro@google.com>
Maintainer: Gabe Black <gabe.black@gmail.com>
This commit is contained in:
Gabe Black
2023-03-18 08:59:51 -07:00
committed by Gabe Black
parent 7c614d225b
commit d03bc9d33c
11 changed files with 76 additions and 38 deletions

View File

@@ -245,11 +245,12 @@ class TapListener
void accept();
protected:
ListenSocket listener;
ListenSocketPtr listener;
EtherTapStub *tap;
public:
TapListener(EtherTapStub *t, int p) : listener(t->name(), p), tap(t) {}
TapListener(EtherTapStub *t, int p) :
listener(listenSocketInetConfig(p).build(t->name())), tap(t) {}
~TapListener() { delete event; }
void listen();
@@ -258,9 +259,9 @@ class TapListener
void
TapListener::listen()
{
listener.listen();
listener->listen();
event = new Event(this, listener.getfd(), POLLIN|POLLERR);
event = new Event(this, listener->getfd(), POLLIN|POLLERR);
pollQueue.schedule(event);
}
@@ -272,10 +273,10 @@ TapListener::accept()
// thread.
EventQueue::ScopedMigration migrate(tap->eventQueue());
if (!listener.islistening())
if (!listener->islistening())
panic("TapListener(accept): cannot accept if we're not listening!");
int sfd = listener.accept();
int sfd = listener->accept();
if (sfd != -1)
tap->attach(sfd);
}

View File

@@ -121,7 +121,8 @@ Terminal::DataEvent::process(int revent)
*/
Terminal::Terminal(const Params &p)
: SerialDevice(p), listenEvent(NULL), dataEvent(NULL),
number(p.number), data_fd(-1), listener(p.name, p.port),
number(p.number), data_fd(-1),
listener(listenSocketInetConfig(p.port).build(p.name)),
txbuf(16384), rxbuf(16384), outfile(terminalDump(p))
#if TRACING_ON == 1
, linebuf(16384)
@@ -175,19 +176,19 @@ Terminal::listen()
return;
}
listener.listen();
listener->listen();
listenEvent = new ListenEvent(this, listener.getfd(), POLLIN);
listenEvent = new ListenEvent(this, listener->getfd(), POLLIN);
pollQueue.schedule(listenEvent);
}
void
Terminal::accept()
{
if (!listener.islistening())
if (!listener->islistening())
panic("%s: cannot accept a connection if not listening!", name());
int fd = listener.accept();
int fd = listener->accept();
if (data_fd != -1) {
char message[] = "terminal already attached!\n";
atomic_write(fd, message, sizeof(message));

View File

@@ -101,7 +101,7 @@ class Terminal : public SerialDevice
OutputStream * terminalDump(const TerminalParams &p);
protected:
ListenSocket listener;
ListenSocketPtr listener;
void listen();
void accept();