Multiple sends in one system call for swift.
[swifty.git] / src / libswift / sendrecv.cpp
index 5ea0fc7..1281192 100644 (file)
@@ -18,6 +18,7 @@ using namespace swift;
 using namespace std;
 
 struct event_base *Channel::evbase;
+MessageQueue Channel::messageQueue;
 struct event Channel::evrecv;
 
 #define DEBUGTRAFFIC   0
@@ -200,16 +201,20 @@ void    Channel::Send () {
     dprintf("%s #%u sent %ib %s:%x\n",
             tintstr(),id_,(int)evbuffer_get_length(evb),peer().str(),
             peer_channel_id_);
-    int r = SendTo(socket_,peer(),evb);
-    if (r==-1)
-        print_error("can't send datagram");
-    else
-       raw_bytes_up_ += r;
-    last_send_time_ = NOW;
-    sent_since_recv_++;
-    dgrams_sent_++;
-    evbuffer_free(evb);
-    Reschedule();
+
+       messageQueue.AddBuffer(socket_, evb, peer(), this); 
+}
+
+void Channel::Sent(int bytes, evbuffer *evb, bool tofree)
+{
+       raw_bytes_up_ += bytes;
+       if (tofree) {
+               last_send_time_ = NOW;
+               sent_since_recv_++;
+               dgrams_sent_++;
+               evbuffer_free(evb);
+               Reschedule();
+       }
 }
 
 void    Channel::AddHint (struct evbuffer *evb) {
@@ -338,9 +343,7 @@ bin_t        Channel::AddData (struct evbuffer *evb) {
         dprintf("%s #%u fsent %ib %s:%x\n",
                 tintstr(),id_,(int)evbuffer_get_length(evb),peer().str(),
                 peer_channel_id_);
-       int ret = Channel::SendTo(socket_,peer(),evb); // kind of fragmentation
-       if (ret > 0)
-               raw_bytes_up_ += ret;
+               messageQueue.AddBuffer(socket_, evb, peer(), this, false);
         evbuffer_add_32be(evb, peer_channel_id_);
     }
 
@@ -930,8 +933,8 @@ void    Channel::RecvDatagram (evutil_socket_t socket) {
        for (; i<addr.addr->count; ++i) {
                struct evbuffer *evb = pevb[i];
                Address fromi;
-               fromi.set_ipv4(addr.addr->dests[i].addr);
-               fromi.set_port(addr.addr->dests[i].port);
+               fromi.addr->dests[0].addr = addr.addr->dests[i].addr;
+               fromi.addr->dests[0].port = addr.addr->dests[i].port;
                size_t evboriglen = evbuffer_get_length(evb);
 #define return_log(...) { fprintf(stderr,__VA_ARGS__); evbuffer_free(evb); return; }
                if (evbuffer_get_length(evb)<4)