void CurlDownloadManager::downloadThread(void* data) { CurlDownloadManager* downloadManager = reinterpret_cast<CurlDownloadManager*>(data); while (downloadManager->runThread()) { downloadManager->updateHandleList(); // Retry 'select' if it was interrupted by a process signal. int rc = 0; do { fd_set fdread; fd_set fdwrite; fd_set fdexcep; int maxfd = 0; const int selectTimeoutMS = 5; struct timeval timeout; timeout.tv_sec = 0; timeout.tv_usec = selectTimeoutMS * 1000; // select waits microseconds FD_ZERO(&fdread); FD_ZERO(&fdwrite); FD_ZERO(&fdexcep); curl_multi_fdset(downloadManager->getMultiHandle(), &fdread, &fdwrite, &fdexcep, &maxfd); // When the 3 file descriptors are empty, winsock will return -1 // and bail out, stopping the file download. So make sure we // have valid file descriptors before calling select. if (maxfd >= 0) rc = ::select(maxfd + 1, &fdread, &fdwrite, &fdexcep, &timeout); } while (rc == -1 && errno == EINTR); int activeDownloadCount = 0; while (curl_multi_perform(downloadManager->getMultiHandle(), &activeDownloadCount) == CURLM_CALL_MULTI_PERFORM) { } int messagesInQueue = 0; CURLMsg* msg = curl_multi_info_read(downloadManager->getMultiHandle(), &messagesInQueue); if (!msg) { downloadManager->stopThreadIfIdle(); continue; } CurlDownload* download = 0; CURLcode err = curl_easy_getinfo(msg->easy_handle, CURLINFO_PRIVATE, &download); if (msg->msg == CURLMSG_DONE) { if (msg->data.result == CURLE_OK) callOnMainThread(MainThreadTask(CurlDownload::downloadFinishedCallback, download)); else callOnMainThread(MainThreadTask(CurlDownload::downloadFailedCallback, download)); downloadManager->removeFromCurl(msg->easy_handle); } downloadManager->stopThreadIfIdle(); } }
void NuiMayaOpenGLThreadProvider::enqueue(NuiOpenGLThread::Task* task) { // Enqueue the task for main thread execution assert(task); TevaluationManager::theOne().enqueueOnMainthread( TdgContext::fsNormal, MainThreadTask(task)); }
void CurlDownload::didReceiveHeader(const String& header) { MutexLocker locker(m_mutex); if (header == "\r\n" || header == "\n") { long httpCode = 0; CURLcode err = curl_easy_getinfo(m_curlHandle, CURLINFO_RESPONSE_CODE, &httpCode); if (httpCode >= 200 && httpCode < 300) { const char* url = 0; err = curl_easy_getinfo(m_curlHandle, CURLINFO_EFFECTIVE_URL, &url); m_response.setURL(URL(ParsedURLString, url)); m_response.setMimeType(extractMIMETypeFromMediaType(m_response.httpHeaderField("Content-Type"))); m_response.setTextEncodingName(extractCharsetFromMediaType(m_response.httpHeaderField("Content-Type"))); m_response.setSuggestedFilename(filenameFromHTTPContentDisposition(m_response.httpHeaderField("Content-Disposition"))); callOnMainThread(MainThreadTask(receivedResponseCallback, this)); } } else { int splitPos = header.find(":"); if (splitPos != -1) m_response.setHTTPHeaderField(header.left(splitPos), header.substring(splitPos+1).stripWhiteSpace()); } }
void CurlDownload::didReceiveData(void* data, int size) { MutexLocker locker(m_mutex); callOnMainThread(MainThreadTask(receivedDataCallback, this, size)); writeDataToFile(static_cast<const char*>(data), size); }