void* S3KeyWriter::UploadThreadFunc(void* data) { MaskThreadSignals(); ThreadParams* params = (ThreadParams*)data; S3KeyWriter* writer = params->keyWriter; try { S3DEBUG("Upload thread start: %" PRIX64 ", part number: %" PRIu64 ", data size: %zu", (uint64_t) pthread_self(), params->currentNumber, params->data.size()); string etag = writer->s3Interface->uploadPartOfData( params->data, writer->params.getS3Url(), params->currentNumber, writer->uploadId); // when unique_lock destructs it will automatically unlock the mutex. UniqueLock threadLock(&writer->mutex); // etag is empty if the query is cancelled by user. if (!etag.empty()) { writer->etagList[params->currentNumber] = etag; } writer->activeThreads--; pthread_cond_broadcast(&writer->cv); S3DEBUG("Upload part finish: %" PRIX64 ", eTag: %s, part number: %" PRIu64, (uint64_t) pthread_self(), etag.c_str(), params->currentNumber); } catch (S3Exception& e) { S3ERROR("Upload thread error: %s", e.getMessage().c_str()); UniqueLock exceptLock(&writer->exceptionMutex); writer->sharedError = true; writer->sharedException = std::current_exception(); // notify the flushBuffer, otherwise it will be locked when trying to create a new thread. writer->activeThreads--; pthread_cond_broadcast(&writer->cv); } delete params; return NULL; }
void* DownloadThreadFunc(void* data) { MaskThreadSignals(); ChunkBuffer* buffer = static_cast<ChunkBuffer*>(data); uint64_t filledSize = 0; S3DEBUG("Downloading thread starts"); do { if (S3QueryIsAbortInProgress()) { S3INFO("Downloading thread is interrupted"); // error is shared between all chunks, so all chunks will stop. buffer->setSharedError(true, S3QueryAbort("Downloading thread is interrupted")); // have to unlock ChunkBuffer::read in some certain conditions, for instance, status is // not ReadyToRead, and read() is waiting for signal stat_cond. buffer->setStatus(ReadyToRead); pthread_cond_signal(buffer->getStatCond()); return NULL; } filledSize = buffer->fill(); if (filledSize != 0) { if (buffer->isError()) { S3DEBUG("Failed to fill downloading buffer"); break; } else { S3DEBUG("Size of filled data is %" PRIu64, filledSize); } } } while (!buffer->isEOF()); S3DEBUG("Downloading thread ended"); return NULL; }