Skip to content

Instantly share code, notes, and snippets.

@thejohnfreeman
Last active March 24, 2020 18:37
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save thejohnfreeman/3495f758f901e696df898475cb61cbfc to your computer and use it in GitHub Desktop.
Save thejohnfreeman/3495f758f901e696df898475cb61cbfc to your computer and use it in GitHub Desktop.
Reactor vs Proactor
void proact(Proactor& proactor, Socket& socket) {
proactor.recv(socket, [](char* buffer, int size) {
// Call me when you've read the socket and give me what you read.
});
}
class ReactorAsProactor : public Proactor {
public:
ReactorAsProactor(private Reactor& reactor) {}
template <typename Handler>
void recv(Socket& socket, Handler const& handler) {
this.reactor.recv(socket, [&]() {
char buffer[256];
int size;
do {
size = socket.read(buffer, 256);
handler(buffer, size);
} while (size == 256);
});
}
};
void react(Reactor& reactor, Socket& socket) {
reactor.recv(socket, [&]() {
// Call me when the socket is ready for reading.
char buffer[256];
int size;
do {
size = socket.read(buffer, 256);
} while (size == 256);
});
}
class ProactorAsReactor : public Reactor {
public:
ProactorAsReactor(private Proactor& proactor) {} // C#/TypeScript-style shorthand
template <typename Handler>
void recv(Socket& socket, Handler const& handler) {
this.proactor.recv(socket, [](char* buffer, int size) {
socket.unread(buffer, size); // Socket is our own abstraction, so we can do this.
handler();
});
}
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment