ssize_t NuCachedSource2::readAt(off64_t offset, void *data, size_t size) { Mutex::Autolock autoSerializer(mSerializer); ALOGV("readAt offset %lld, size %d", offset, size); Mutex::Autolock autoLock(mLock); // If the request can be completely satisfied from the cache, do so. if (offset >= mCacheOffset && offset + size <= mCacheOffset + mCache->totalSize()) { size_t delta = offset - mCacheOffset; mCache->copy(delta, data, size); #ifdef OMAP_ENHANCEMENT if(offset < mLastAccessPos) { mMinAccessPos = offset; } if(offset + size > mMaxAccessPos) { mMaxAccessPos = offset + size; } mLastAccessPos = offset; #else mLastAccessPos = offset + size; #endif return size; } sp<AMessage> msg = new AMessage(kWhatRead, mReflector->id()); msg->setInt64("offset", offset); msg->setPointer("data", data); msg->setSize("size", size); CHECK(mAsyncResult == NULL); msg->post(); while (mAsyncResult == NULL) { mCondition.wait(mLock); } int32_t result; CHECK(mAsyncResult->findInt32("result", &result)); mAsyncResult.clear(); if (result > 0) { mLastAccessPos = offset + result; #ifdef OMAP_ENHANCEMENT mMinAccessPos = offset + result; mMaxAccessPos = offset + result; #endif } return (ssize_t)result; }
ssize_t NuCachedSource2::readAt(off64_t offset, void *data, size_t size) { Mutex::Autolock autoSerializer(mSerializer); ALOGV("readAt offset %lld, size %zu", offset, size); Mutex::Autolock autoLock(mLock); if (mDisconnecting) { return ERROR_END_OF_STREAM; } // If the request can be completely satisfied from the cache, do so. if (offset >= mCacheOffset && offset + size <= mCacheOffset + mCache->totalSize()) { size_t delta = offset - mCacheOffset; mCache->copy(delta, data, size); mLastAccessPos = offset + size; return size; } sp<AMessage> msg = new AMessage(kWhatRead, mReflector->id()); msg->setInt64("offset", offset); msg->setPointer("data", data); msg->setSize("size", size); CHECK(mAsyncResult == NULL); msg->post(); while (mAsyncResult == NULL && !mDisconnecting) { mCondition.wait(mLock); } if (mDisconnecting) { mAsyncResult.clear(); return ERROR_END_OF_STREAM; } int32_t result; CHECK(mAsyncResult->findInt32("result", &result)); mAsyncResult.clear(); if (result > 0) { mLastAccessPos = offset + result; } return (ssize_t)result; }
status_t ChromiumHTTPDataSource::connect( const char *uri, const KeyedVector<String8, String8> *headers, off64_t offset) { Mutex::Autolock autoSerializer(mSerializer); Mutex::Autolock autoLock(mLock); uid_t uid; if (getUID(&uid)) { mDelegate->setUID(uid); } LOG_PRI(ANDROID_LOG_VERBOSE, LOG_TAG, "connect on behalf of uid %d", uid); return connect_l(uri, headers, offset); }
void ChromiumHTTPDataSource::disconnect() { Mutex::Autolock autoSerializer(mSerializer); Mutex::Autolock autoLock(mLock); disconnect_l(); }