ssize_t ChromiumHTTPDataSource::readAt(off64_t offset, void *data, size_t size) { Mutex::Autolock autoLock(mLock); if (mState != CONNECTED) { return INVALID_OPERATION; } #if 0 char value[PROPERTY_VALUE_MAX]; if (property_get("media.stagefright.disable-net", value, 0) && (!strcasecmp(value, "true") || !strcmp(value, "1"))) { LOG_PRI(ANDROID_LOG_INFO, LOG_TAG, "Simulating that the network is down."); disconnect_l(); return ERROR_IO; } #endif if (offset != mCurrentOffset) { AString tmp = mURI; KeyedVector<String8, String8> tmpHeaders = mHeaders; disconnect_l(); status_t err = connect_l(tmp.c_str(), &tmpHeaders, offset); if (err != OK) { return err; } } mState = READING; int64_t startTimeUs = ALooper::GetNowUs(); mDelegate->initiateRead(data, size); int32_t bandwidth_bps; estimateBandwidth(&bandwidth_bps); int64_t readTimeoutUs = 0; if(bandwidth_bps > 0) { readTimeoutUs = (size * 8000000ll)/bandwidth_bps; } readTimeoutUs += mReadTimeoutUs; while (mState == READING) { //mCondition.wait(mLock); status_t err = mCondition.waitRelative(mLock, readTimeoutUs *1000ll); if(mForceDisconnect) { LOG_PRI(ANDROID_LOG_INFO, LOG_TAG, "disconnected, read return"); return ERROR_IO; } if(err == -ETIMEDOUT) { LOG_PRI(ANDROID_LOG_INFO, LOG_TAG, "Read data timeout," "maybe server didn't response us, return %d", err); return err; } } if (mIOResult < OK) { return mIOResult; } if (mState == CONNECTED) { int64_t delayUs = ALooper::GetNowUs() - startTimeUs; // The read operation was successful, mIOResult contains // the number of bytes read. addBandwidthMeasurement(mIOResult, delayUs); mCurrentOffset += mIOResult; return mIOResult; } return ERROR_IO; }
/** * Computes the min, max, mean, and median values of an array * T[0:n-1] of 'n' long doubles. */ static void printStats (FILE* fp, long double* T, size_t ntrials, size_t ncorrect, size_t nelements){ long double t_min, t_max, t_mean, t_median; assert (ntrials > 0); t_min = T[0]; t_max = T[0]; t_mean = T[0]; t_median = T[0]; for (size_t i = 1; i < ntrials; ++i) { if (T[i] < t_min) t_min = T[i]; if (T[i] > t_max) t_max = T[i]; t_mean += T[i]; } t_mean /= ntrials; std::nth_element(T, T + ntrials/2, T + ntrials); t_median = T[ntrials/2]; fprintf(fp,"{\"ntrials\": %lu, " "\"ncorrect\": %lu, " "\"nelements\": %lu, " "\"min\": %Lf, " "\"max\": %Lf, " "\"mean\": %Lf, " "\"median\": %Lf, " "\"bandwidth\": %Lf}\n", ntrials, ncorrect, nelements, t_min, t_max, t_mean, t_median, estimateBandwidth(nelements, t_mean)); }