src/Network/TCP.cc
changeset 380 d193dd1d8a7e
parent 378 5589abf5e61b
child 381 9b35bc329d23
--- 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);