diff options
Diffstat (limited to 'libs')
| -rw-r--r-- | libs/androidfw/BackupHelpers.cpp | 21 | ||||
| -rw-r--r-- | libs/hwui/DisplayListRenderer.cpp | 2 | ||||
| -rw-r--r-- | libs/hwui/DisplayListRenderer.h | 3 | ||||
| -rw-r--r-- | libs/hwui/ShadowTessellator.cpp | 1 | ||||
| -rw-r--r-- | libs/hwui/TessellationCache.cpp | 1 | ||||
| -rw-r--r-- | libs/hwui/thread/Signal.h | 6 | ||||
| -rw-r--r-- | libs/hwui/thread/TaskManager.cpp | 7 |
7 files changed, 30 insertions, 11 deletions
diff --git a/libs/androidfw/BackupHelpers.cpp b/libs/androidfw/BackupHelpers.cpp index 227de3b..9300794 100644 --- a/libs/androidfw/BackupHelpers.cpp +++ b/libs/androidfw/BackupHelpers.cpp @@ -478,7 +478,8 @@ void send_tarfile_chunk(BackupDataWriter* writer, const char* buffer, size_t siz } int write_tarfile(const String8& packageName, const String8& domain, - const String8& rootpath, const String8& filepath, BackupDataWriter* writer) + const String8& rootpath, const String8& filepath, off_t* outSize, + BackupDataWriter* writer) { // In the output stream everything is stored relative to the root const char* relstart = filepath.string() + rootpath.length(); @@ -488,6 +489,7 @@ int write_tarfile(const String8& packageName, const String8& domain, // If relpath is empty, it means this is the top of one of the standard named // domain directories, so we should just skip it if (relpath.length() == 0) { + *outSize = 0; return 0; } @@ -517,12 +519,25 @@ int write_tarfile(const String8& packageName, const String8& domain, return err; } + // very large files need a pax extended size header + if (s.st_size > 077777777777LL) { + needExtended = true; + } + String8 fullname; // for pax later on String8 prefix; const int isdir = S_ISDIR(s.st_mode); if (isdir) s.st_size = 0; // directories get no actual data in the tar stream + // Report the size, including a rough tar overhead estimation: 512 bytes for the + // overall tar file-block header, plus 2 blocks if using the pax extended format, + // plus the raw content size rounded up to a multiple of 512. + *outSize = 512 + (needExtended ? 1024 : 0) + 512*((s.st_size + 511)/512); + + // Measure case: we've returned the size; now return without moving data + if (!writer) return 0; + // !!! TODO: use mmap when possible to avoid churning the buffer cache // !!! TODO: this will break with symlinks; need to use readlink(2) int fd = open(filepath.string(), O_RDONLY); @@ -560,10 +575,6 @@ int write_tarfile(const String8& packageName, const String8& domain, snprintf(buf + 116, 8, "0%lo", (unsigned long)s.st_gid); // [ 124 : 12 ] file size in bytes - if (s.st_size > 077777777777LL) { - // very large files need a pax extended size header - needExtended = true; - } snprintf(buf + 124, 12, "%011llo", (isdir) ? 0LL : s.st_size); // [ 136 : 12 ] last mod time as a UTC time_t diff --git a/libs/hwui/DisplayListRenderer.cpp b/libs/hwui/DisplayListRenderer.cpp index 2a673f4..8757e15 100644 --- a/libs/hwui/DisplayListRenderer.cpp +++ b/libs/hwui/DisplayListRenderer.cpp @@ -484,7 +484,7 @@ void DisplayListRenderer::drawRects(const float* rects, int count, const SkPaint } void DisplayListRenderer::setDrawFilter(SkDrawFilter* filter) { - mDrawFilter.reset(filter); + mDrawFilter.reset(SkSafeRef(filter)); } void DisplayListRenderer::insertReorderBarrier(bool enableReorder) { diff --git a/libs/hwui/DisplayListRenderer.h b/libs/hwui/DisplayListRenderer.h index 48ecd69..53fd1ad 100644 --- a/libs/hwui/DisplayListRenderer.h +++ b/libs/hwui/DisplayListRenderer.h @@ -296,8 +296,9 @@ private: // so that we don't need to modify the paint every time we access it. SkTLazy<SkPaint> filteredPaint; if (mDrawFilter.get()) { - paint = filteredPaint.init(); + filteredPaint.set(*paint); mDrawFilter->filter(filteredPaint.get(), SkDrawFilter::kPaint_Type); + paint = filteredPaint.get(); } // compute the hash key for the paint and check the cache. diff --git a/libs/hwui/ShadowTessellator.cpp b/libs/hwui/ShadowTessellator.cpp index 9509c48..30d3f41 100644 --- a/libs/hwui/ShadowTessellator.cpp +++ b/libs/hwui/ShadowTessellator.cpp @@ -197,6 +197,7 @@ bool ShadowTessellator::isClockwisePath(const SkPath& path) { case SkPath::kLine_Verb: arrayForDirection.add((Vector2){pts[1].x(), pts[1].y()}); break; + case SkPath::kConic_Verb: case SkPath::kQuad_Verb: arrayForDirection.add((Vector2){pts[1].x(), pts[1].y()}); arrayForDirection.add((Vector2){pts[2].x(), pts[2].y()}); diff --git a/libs/hwui/TessellationCache.cpp b/libs/hwui/TessellationCache.cpp index 66de333..d9d06bf 100644 --- a/libs/hwui/TessellationCache.cpp +++ b/libs/hwui/TessellationCache.cpp @@ -380,6 +380,7 @@ void TessellationCache::precacheShadows(const Matrix4* drawTransform, const Rect const Vector3& lightCenter, float lightRadius) { ShadowDescription key(casterPerimeter, drawTransform); + if (mShadowCache.get(key)) return; sp<ShadowTask> task = new ShadowTask(drawTransform, localClip, opaque, casterPerimeter, transformXY, transformZ, lightCenter, lightRadius); if (mShadowProcessor == nullptr) { diff --git a/libs/hwui/thread/Signal.h b/libs/hwui/thread/Signal.h index dcf5449..d4cfeeb 100644 --- a/libs/hwui/thread/Signal.h +++ b/libs/hwui/thread/Signal.h @@ -30,8 +30,10 @@ public: ~Signal() { } void signal() { - Mutex::Autolock l(mLock); - mSignaled = true; + { + Mutex::Autolock l(mLock); + mSignaled = true; + } mCondition.signal(mType); } diff --git a/libs/hwui/thread/TaskManager.cpp b/libs/hwui/thread/TaskManager.cpp index c69b2fd..f0ed0bb 100644 --- a/libs/hwui/thread/TaskManager.cpp +++ b/libs/hwui/thread/TaskManager.cpp @@ -109,8 +109,11 @@ bool TaskManager::WorkerThread::addTask(TaskWrapper task) { return false; } - Mutex::Autolock l(mLock); - ssize_t index = mTasks.add(task); + ssize_t index; + { + Mutex::Autolock l(mLock); + index = mTasks.add(task); + } mSignal.signal(); return index >= 0; |
