diff options
| author | trialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38> | 2018-12-05 20:01:35 +0000 |
|---|---|---|
| committer | trialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38> | 2018-12-05 20:01:35 +0000 |
| commit | d87795831c2eecca3b3cf0a1d70bcc90bcfe05b1 (patch) | |
| tree | c8e36cb2714246aee7382241d4bf70f784fee0a2 /src/plugins | |
| parent | ade1c826f9bccf77e76b47f83609ea253a537892 (diff) | |
| download | qmmp-d87795831c2eecca3b3cf0a1d70bcc90bcfe05b1.tar.gz qmmp-d87795831c2eecca3b3cf0a1d70bcc90bcfe05b1.tar.bz2 qmmp-d87795831c2eecca3b3cf0a1d70bcc90bcfe05b1.zip | |
http: reduced number of allocations
git-svn-id: http://svn.code.sf.net/p/qmmp-dev/code/trunk/qmmp@8491 90c681e8-e032-0410-971d-27865f9a5e38
Diffstat (limited to 'src/plugins')
| -rw-r--r-- | src/plugins/Transports/http/httpstreamreader.cpp | 40 | ||||
| -rw-r--r-- | src/plugins/Transports/http/httpstreamreader.h | 3 |
2 files changed, 34 insertions, 9 deletions
diff --git a/src/plugins/Transports/http/httpstreamreader.cpp b/src/plugins/Transports/http/httpstreamreader.cpp index f139c9ba0..5635534ac 100644 --- a/src/plugins/Transports/http/httpstreamreader.cpp +++ b/src/plugins/Transports/http/httpstreamreader.cpp @@ -48,11 +48,27 @@ static size_t curl_write_data(void *data, size_t size, size_t nmemb, return 0; } - size_t buf_start = dl->stream()->buf_fill; size_t data_size = size * nmemb; + if(dl->stream()->buf_fill + data_size > dl->stream()->buf_size) + { + char *prev = dl->stream()->buf; + dl->stream()->buf = (char *)realloc(dl->stream()->buf, dl->stream()->buf_fill + data_size); + if(!dl->stream()->buf) + { + qWarning("HttpStreamReader: unable to allocate %lu bytes", dl->stream()->buf_fill + data_size); + if(prev) + free(prev); + + dl->stream()->buf_fill = 0; + dl->stream()->buf_size = 0; + dl->stream()->aborted = true; + dl->mutex()->unlock(); + return 0; + } + dl->stream()->buf_size = dl->stream()->buf_fill + data_size; + } + memcpy(dl->stream()->buf + dl->stream()->buf_fill, data, data_size); dl->stream()->buf_fill += data_size; - dl->stream()->buf = (char *)realloc(dl->stream()->buf, dl->stream()->buf_fill); - memcpy(dl->stream()->buf + buf_start, data, data_size); dl->mutex()->unlock(); dl->checkBuffer(); return data_size; @@ -125,6 +141,7 @@ HttpStreamReader::HttpStreamReader(const QString &url, HTTPInputSource *parent) m_url = url; curl_global_init(CURL_GLOBAL_ALL); m_stream.buf_fill = 0; + m_stream.buf_size = 0; m_stream.buf = 0; m_stream.icy_meta_data = false; m_stream.aborted = true; @@ -137,7 +154,7 @@ HttpStreamReader::HttpStreamReader(const QString &url, HTTPInputSource *parent) QSettings settings(Qmmp::configFile(), QSettings::IniFormat); settings.beginGroup("HTTP"); m_codec = QTextCodec::codecForName(settings.value("icy_encoding","UTF-8").toByteArray ()); - m_buffer_size = settings.value("buffer_size",384).toInt() * 1000; + m_prebuffer_size = settings.value("buffer_size",384).toInt() * 1000; if(settings.value("override_user_agent",false).toBool()) m_userAgent = settings.value("user_agent").toString(); if(m_userAgent.isEmpty()) @@ -161,6 +178,7 @@ HttpStreamReader::~HttpStreamReader() curl_global_cleanup(); m_stream.aborted = true; m_stream.buf_fill = 0; + m_stream.buf_size = 0; if (m_stream.buf) free(m_stream.buf); @@ -355,10 +373,16 @@ void HttpStreamReader::run() curl_easy_setopt(m_handle, CURLOPT_HTTP200ALIASES, http200_aliases); curl_easy_setopt(m_handle, CURLOPT_HTTPHEADER, http_headers); m_mutex.lock(); + if(m_stream.buf) + { + free(m_stream.buf); + m_stream.buf = 0; + } m_stream.buf_fill = 0; - m_stream.buf = 0; + m_stream.buf_size = m_prebuffer_size * 2; + m_stream.buf = (char *)malloc(m_stream.buf_size); //initial buffer m_stream.aborted = false; - m_stream.header.clear (); + m_stream.header.clear(); m_ready = false; int return_code; qDebug("HttpStreamReader: starting libcurl"); @@ -394,7 +418,7 @@ void HttpStreamReader::checkBuffer() if(m_stream.aborted || m_ready) return; - if (m_stream.buf_fill > m_buffer_size) + if (m_stream.buf_fill > m_prebuffer_size) { m_ready = true; qDebug("HttpStreamReader: ready"); @@ -413,7 +437,7 @@ void HttpStreamReader::checkBuffer() } else { - StateHandler::instance()->dispatchBuffer(100 * m_stream.buf_fill / m_buffer_size); + StateHandler::instance()->dispatchBuffer(100 * m_stream.buf_fill / m_prebuffer_size); qApp->processEvents(); } } diff --git a/src/plugins/Transports/http/httpstreamreader.h b/src/plugins/Transports/http/httpstreamreader.h index aefda863b..ebb0a657e 100644 --- a/src/plugins/Transports/http/httpstreamreader.h +++ b/src/plugins/Transports/http/httpstreamreader.h @@ -44,6 +44,7 @@ struct HttpStreamData { char *buf; size_t buf_fill; + size_t buf_size; QString content_type; bool aborted; QHash <QString, QByteArray> header; @@ -105,7 +106,7 @@ private: QString m_title; bool m_ready; bool m_meta_sent; - size_t m_buffer_size; + size_t m_prebuffer_size; QTextCodec *m_codec; DownloadThread *m_thread; HTTPInputSource *m_parent; |
