--- a/src/Network/TCP.cc Tue Dec 16 20:30:35 2008 +0000
+++ b/src/Network/TCP.cc Tue Dec 16 23:21:26 2008 +0000
@@ -11,6 +11,9 @@
// connect signals
slots.connect(socket->sig_read(), this, &NetworkTCPTransport::on_read);
slots.connect(socket->sig_write(), this, &NetworkTCPTransport::on_write);
+
+ // activate read polling, but leave write polling for later
+ socket->set_poll_read(true);
}
NetworkTCPTransport::~NetworkTCPTransport (void) {
@@ -43,20 +46,21 @@
// log and disconnect
Engine::log(ERROR, "tcp.on_read") << "socket error: " << e.what();
- _sig_disconnect();
+ handle_disconnect();
}
}
void NetworkTCPTransport::on_write (void) {
try {
- // just flush the output buffer
- out.flush_write();
+ // just flush the output buffer, and deactivate output polling if done
+ if (!out.flush_write())
+ socket->set_poll_write(false);
} catch (NetworkSocketError &e) {
// log and disconnect
Engine::log(ERROR, "tcp.on_write") << "socket error: " << e.what();
- _sig_disconnect();
+ handle_disconnect();
}
}
@@ -67,8 +71,9 @@
throw CL_Error("send prefix overflow");
try {
- // just write to the output buffer
- out.write_prefix((char *) packet.get_buf(), prefix);
+ // just write to the output buffer, but activate output polling if needed
+ if (out.write_prefix((char *) packet.get_buf(), prefix))
+ socket->set_poll_write(true);
} catch (NetworkSocketError &e) {
const char *err = e.what();
@@ -79,6 +84,15 @@
throw;
}
}
+
+void NetworkTCPTransport::handle_disconnect (void) {
+ // disable events on our socket
+ socket->set_poll_read(false);
+ socket->set_poll_write(false);
+
+ // signal
+ _sig_disconnect();
+}
/*
* NetworkTCPServer
@@ -97,9 +111,11 @@
// use nonblocking sockets
socket.set_nonblocking(true);
+
+ // activate polling
+ socket.set_poll_read(true);
}
-
void NetworkTCPServer::on_accept (void) {
// accept a new socket
NetworkSocket *client_sock = socket.accept(NULL);