mirror of https://github.com/aria2/aria2
2010-03-03 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net>
Rewritten SocketBuffer. Old implementation uses single std::string to store data and erase sent data, which is costly. New implementation uses deque to hold each data to avoid to mutate string. * src/SocketBuffer.cc * src/SocketBuffer.hpull/1/head
parent
48c809d441
commit
5d05ef0e75
|
@ -1,3 +1,12 @@
|
|||
2010-03-03 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net>
|
||||
|
||||
Rewritten SocketBuffer. Old implementation uses single std::string
|
||||
to store data and erase sent data, which is costly. New
|
||||
implementation uses deque to hold each data to avoid to mutate
|
||||
string.
|
||||
* src/SocketBuffer.cc
|
||||
* src/SocketBuffer.h
|
||||
|
||||
2010-03-03 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net>
|
||||
|
||||
Removed unused FileEntry::extracted
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
/*
|
||||
* aria2 - The high speed download utility
|
||||
*
|
||||
* Copyright (C) 2006 Tatsuhiro Tsujikawa
|
||||
* Copyright (C) 2010 Tatsuhiro Tsujikawa
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
|
@ -44,13 +44,13 @@
|
|||
namespace aria2 {
|
||||
|
||||
SocketBuffer::SocketBuffer(const SharedHandle<SocketCore>& socket):
|
||||
_socket(socket) {}
|
||||
_socket(socket), _offset(0) {}
|
||||
|
||||
SocketBuffer::~SocketBuffer() {}
|
||||
|
||||
void SocketBuffer::feedSendBuffer(const std::string& data)
|
||||
{
|
||||
_sendbuf += data;
|
||||
_bufq.push_back(data);
|
||||
}
|
||||
|
||||
ssize_t SocketBuffer::feedAndSend(const std::string& data)
|
||||
|
@ -61,21 +61,31 @@ ssize_t SocketBuffer::feedAndSend(const std::string& data)
|
|||
|
||||
ssize_t SocketBuffer::send()
|
||||
{
|
||||
if(_sendbuf.empty()) {
|
||||
return 0;
|
||||
size_t totalslen = 0;
|
||||
while(!_bufq.empty()) {
|
||||
const std::string& data = _bufq[0];
|
||||
const size_t size = data.size();
|
||||
ssize_t r = size-_offset;
|
||||
ssize_t slen = _socket->writeData(data.data()+_offset, r);
|
||||
if(slen == 0 && !_socket->wantRead() && !_socket->wantWrite()) {
|
||||
throw DL_ABORT_EX(StringFormat(EX_SOCKET_SEND,
|
||||
"Connection closed.").str());
|
||||
}
|
||||
totalslen += slen;
|
||||
if(slen < r) {
|
||||
_offset += slen;
|
||||
break;
|
||||
} else {
|
||||
_offset = 0;
|
||||
_bufq.pop_front();
|
||||
}
|
||||
}
|
||||
ssize_t len = _socket->writeData(_sendbuf.c_str(),
|
||||
_sendbuf.size());
|
||||
if(len == 0 && !_socket->wantRead() && !_socket->wantWrite()) {
|
||||
throw DL_ABORT_EX(StringFormat(EX_SOCKET_SEND, "Connection closed.").str());
|
||||
}
|
||||
_sendbuf.erase(0, len);
|
||||
return len;
|
||||
return totalslen;
|
||||
}
|
||||
|
||||
bool SocketBuffer::sendBufferIsEmpty() const
|
||||
{
|
||||
return _sendbuf.empty();
|
||||
return _bufq.empty();
|
||||
}
|
||||
|
||||
} // namespace aria2
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
/*
|
||||
* aria2 - The high speed download utility
|
||||
*
|
||||
* Copyright (C) 2006 Tatsuhiro Tsujikawa
|
||||
* Copyright (C) 2010 Tatsuhiro Tsujikawa
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
|
@ -36,8 +36,11 @@
|
|||
#define _D_SOCKET_BUFFER_H_
|
||||
|
||||
#include "common.h"
|
||||
#include "SharedHandle.h"
|
||||
|
||||
#include <string>
|
||||
#include <deque>
|
||||
|
||||
#include "SharedHandle.h"
|
||||
|
||||
namespace aria2 {
|
||||
|
||||
|
@ -47,18 +50,29 @@ class SocketBuffer {
|
|||
private:
|
||||
SharedHandle<SocketCore> _socket;
|
||||
|
||||
std::string _sendbuf;
|
||||
std::deque<std::string> _bufq;
|
||||
|
||||
// Offset of data in _bufq[0]. SocketBuffer tries to send _bufq[0],
|
||||
// but it cannot always send whole data. In this case, offset points
|
||||
// to the data to be sent in the next send() call.
|
||||
size_t _offset;
|
||||
public:
|
||||
SocketBuffer(const SharedHandle<SocketCore>& socket);
|
||||
|
||||
~SocketBuffer();
|
||||
|
||||
// Feeds data into queue. This function doesn't send data.
|
||||
void feedSendBuffer(const std::string& data);
|
||||
|
||||
// Feeds data into queue and sends data in queue. This function is
|
||||
// equivalent to call feedSendBuffer() and send() sequentially.
|
||||
// Returns the number of bytes sent.
|
||||
ssize_t feedAndSend(const std::string& data);
|
||||
|
||||
// Sends data in queue. Returns the number of bytes sent.
|
||||
ssize_t send();
|
||||
|
||||
// Returns true if queue is empty.
|
||||
bool sendBufferIsEmpty() const;
|
||||
|
||||
};
|
||||
|
|
Loading…
Reference in New Issue