Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 44e78e10 authored by krhardeep's avatar krhardeep Committed by Hardeep Kaur
Browse files

Page rendering not cancelled exception in renderPage

- Fix concurrency issue in renderPage using synchronization
- Avoid race condition in renderPage by updating callback instead of throwing exception

Test: N/A (manual test)
Bug: 344104578
Flag: EXEMPT No automated test available for this concurrency fix
Change-Id: I5c8f34eebf830e3c0a131d6fb940b1ef848c3a0d
parent beb79048
Loading
Loading
Loading
Loading
+35 −38
Original line number Diff line number Diff line
@@ -654,7 +654,7 @@ public final class PageContentRepository {

        public void renderPage(int pageIndex, RenderSpec renderSpec,
                OnPageContentAvailableCallback callback) {
            // First, check if we have a rendered page for this index.
            synchronized (mPageToRenderTaskMap) {
                RenderedPage renderedPage = mPageContentCache.getRenderedPage(pageIndex);
                if (renderedPage != null && renderedPage.state == RenderedPage.STATE_RENDERED) {
                    // If we have rendered page with same constraints - done.
@@ -679,20 +679,16 @@ public final class PageContentRepository {
                if (renderTask != null && !renderTask.isCancelled()) {
                    // If not rendered and constraints same....
                    if (renderTask.mRenderSpec.equals(renderSpec)) {
                    if (renderTask.mCallback != null) {
                        // If someone else is already waiting for this page - bad state.
                        if (callback != null && renderTask.mCallback != callback) {
                            throw new IllegalStateException("Page rendering not cancelled");
                        }
                    } else {
                        // No callback means we are preloading so just let the argument
                        // callback be attached to our work in progress.
                        renderTask.mCallback = callback;
                    }
                        return;
                    } else {
                        // If not rendered and constraints changed - cancel rendering.
                        try {
                            renderTask.cancel(true);
                            mPageToRenderTaskMap.remove(pageIndex);
                        } catch (Exception e) {
                            Log.e(LOG_TAG, "Error cancelling RenderPageTask ", e);
                        }
                    }
                }

@@ -701,6 +697,7 @@ public final class PageContentRepository {
                mPageToRenderTaskMap.put(pageIndex, renderTask);
                renderTask.executeOnExecutor(AsyncTask.SERIAL_EXECUTOR);
            }
        }

        public void cancelRendering(int pageIndex) {
            RenderPageTask task = mPageToRenderTaskMap.get(pageIndex);