Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Canvas: deleting an image key that is in use #17534

Closed
asajeffrey opened this issue Jun 27, 2017 · 2 comments · Fixed by #17606
Closed

Canvas: deleting an image key that is in use #17534

asajeffrey opened this issue Jun 27, 2017 · 2 comments · Fixed by #17606
Assignees

Comments

@asajeffrey
Copy link
Member

A lovely webrender panic:

stack backtrace:
   0:     0x55f7bd9bd8c4 - backtrace::backtrace::libunwind::trace
                        at /home/ajeffrey/github/asajeffrey/servo/.cargo/registry/src/github.com-1ecc6299db9ec823/backtrace-0.3.2/src/backtrace/libunwind.rs:53
                         - backtrace::backtrace::trace<closure>
                        at /home/ajeffrey/github/asajeffrey/servo/.cargo/registry/src/github.com-1ecc6299db9ec823/backtrace-0.3.2/src/backtrace/mod.rs:42
   1:     0x55f7bd9b5d6f - backtrace::capture::{{impl}}::new
                        at /home/ajeffrey/github/asajeffrey/servo/.cargo/registry/src/github.com-1ecc6299db9ec823/backtrace-0.3.2/src/capture.rs:64
   2:     0x55f7b7f4a346 - servo::main::{{closure}}
                        at /home/ajeffrey/github/asajeffrey/servo/ports/servo/main.rs:129
   3:     0x55f7bda82a2a - std::panicking::rust_panic_with_hook
                        at /checkout/src/libstd/panicking.rs:550
   4:     0x55f7bda828c4 - std::panicking::begin_panic<collections::string::String>
                        at /checkout/src/libstd/panicking.rs:511
   5:     0x55f7bda827f9 - std::panicking::begin_panic_fmt
                        at /checkout/src/libstd/panicking.rs:495
   6:     0x55f7bc202e8e - webrender::resource_cache::{{impl}}::get_image_properties::{{closure}}
                        at /home/ajeffrey/github/asajeffrey/servo/.cargo/git/checkouts/webrender-c3596abe1cf4f320/a787f8e/webrender/src/resource_cache.rs:540
   7:     0x55f7bc113701 - core::option::{{impl}}::unwrap_or_else<&webrender::resource_cache::ImageResource,closure>
                        at /checkout/src/libcore/option.rs:370
   8:     0x55f7bc202c66 - webrender::resource_cache::{{impl}}::get_image_properties
                        at /home/ajeffrey/github/asajeffrey/servo/.cargo/git/checkouts/webrender-c3596abe1cf4f320/a787f8e/webrender/src/resource_cache.rs:539
   9:     0x55f7bc06be68 - webrender::frame::{{impl}}::flatten_item
                        at /home/ajeffrey/github/asajeffrey/servo/.cargo/git/checkouts/webrender-c3596abe1cf4f320/a787f8e/webrender/src/frame.rs:546
  10:     0x55f7bc06da28 - webrender::frame::{{impl}}::flatten_items
                        at /home/ajeffrey/github/asajeffrey/servo/.cargo/git/checkouts/webrender-c3596abe1cf4f320/a787f8e/webrender/src/frame.rs:788
  11:     0x55f7bc06b33e - webrender::frame::{{impl}}::flatten_stacking_context
                        at /home/ajeffrey/github/asajeffrey/servo/.cargo/git/checkouts/webrender-c3596abe1cf4f320/a787f8e/webrender/src/frame.rs:455
  12:     0x55f7bc06d0f9 - webrender::frame::{{impl}}::flatten_item
                        at /home/ajeffrey/github/asajeffrey/servo/.cargo/git/checkouts/webrender-c3596abe1cf4f320/a787f8e/webrender/src/frame.rs:678
  13:     0x55f7bc06da28 - webrender::frame::{{impl}}::flatten_items
                        at /home/ajeffrey/github/asajeffrey/servo/.cargo/git/checkouts/webrender-c3596abe1cf4f320/a787f8e/webrender/src/frame.rs:788
  14:     0x55f7bc06d71b - webrender::frame::{{impl}}::flatten_root
                        at /home/ajeffrey/github/asajeffrey/servo/.cargo/git/checkouts/webrender-c3596abe1cf4f320/a787f8e/webrender/src/frame.rs:757
  15:     0x55f7bc06a599 - webrender::frame::{{impl}}::create
                        at /home/ajeffrey/github/asajeffrey/servo/.cargo/git/checkouts/webrender-c3596abe1cf4f320/a787f8e/webrender/src/frame.rs:347
  16:     0x55f7bbf6b213 - webrender::render_backend::{{impl}}::build_scene
                        at /home/ajeffrey/github/asajeffrey/servo/.cargo/git/checkouts/webrender-c3596abe1cf4f320/a787f8e/webrender/src/render_backend.rs:500
  17:     0x55f7bc1fcdfd - webrender::render_backend::{{impl}}::run::{{closure}}
                        at /home/ajeffrey/github/asajeffrey/servo/.cargo/git/checkouts/webrender-c3596abe1cf4f320/a787f8e/webrender/src/render_backend.rs:251
  18:     0x55f7bc1f8099 - webrender::profiler::{{impl}}::profile<(),closure>
                        at /home/ajeffrey/github/asajeffrey/servo/.cargo/git/checkouts/webrender-c3596abe1cf4f320/a787f8e/webrender/src/profiler.rs:154
  19:     0x55f7bbf69192 - webrender::render_backend::{{impl}}::run
                        at /home/ajeffrey/github/asajeffrey/servo/.cargo/git/checkouts/webrender-c3596abe1cf4f320/a787f8e/webrender/src/render_backend.rs:244
  20:     0x55f7bc21a033 - webrender::renderer::{{impl}}::new::{{closure}}
                        at /home/ajeffrey/github/asajeffrey/servo/.cargo/git/checkouts/webrender-c3596abe1cf4f320/a787f8e/webrender/src/renderer.rs:1158
  21:     0x55f7bc1295ca - std::sys_common::backtrace::__rust_begin_short_backtrace<closure,()>
                        at /checkout/src/libstd/sys_common/backtrace.rs:136
  22:     0x55f7bc12be13 - std::thread::{{impl}}::spawn::{{closure}}::{{closure}}<closure,()>
                        at /checkout/src/libstd/thread/mod.rs:364
  23:     0x55f7bc1d005a - std::panic::{{impl}}::call_once<(),closure>
                        at /checkout/src/libstd/panic.rs:296
  24:     0x55f7bc12da49 - std::panicking::try::do_call<std::panic::AssertUnwindSafe<closure>,()>
                        at /checkout/src/libstd/panicking.rs:454
  25:     0x55f7bda89b8a - panic_unwind::__rust_maybe_catch_panic
                        at /checkout/src/libpanic_unwind/lib.rs:98
  26:     0x55f7bc12c1fc - std::panicking::try<(),std::panic::AssertUnwindSafe<closure>>
                        at /checkout/src/libstd/panicking.rs:433
  27:     0x55f7bc12aef5 - std::panic::catch_unwind<std::panic::AssertUnwindSafe<closure>,()>
                        at /checkout/src/libstd/panic.rs:361
  28:     0x55f7bc12bc3b - std::thread::{{impl}}::spawn::{{closure}}<closure,()>
                        at /checkout/src/libstd/thread/mod.rs:363
  29:     0x55f7bc168113 - alloc::boxed::{{impl}}::call_box<(),closure>
                        at /checkout/src/liballoc/boxed.rs:648
  30:     0x55f7bda81685 - alloc::boxed::{{impl}}::call_once<(),()>
                        at /checkout/src/liballoc/boxed.rs:658
                         - std::sys_common::thread::start_thread
                        at /checkout/src/libstd/sys_common/thread.rs:21
                         - std::sys::imp::thread::{{impl}}::new::thread_start
                        at /checkout/src/libstd/sys/unix/thread.rs:84
  31:     0x7fd8c1d706b9 - start_thread
  32:     0x7fd8c18903dc - clone
  33:                0x0 - <unknown>

The cause is

self.webrender_api.delete_image(image_key);
:

    fn recreate(&mut self, size: Size2D<i32>) {
        self.drawtarget = CanvasPaintThread::create(size);
        // Webrender doesn't let images change size, so we clear the webrender image key.
        if let Some(image_key) = self.image_key.take() {
            self.webrender_api.delete_image(image_key);
        }
    }

The key is being deleted immediately, but it might still be in use by the display list builder. Really, we should flag the key for being deleted in the next epoch, not the current epoch.

@asajeffrey asajeffrey self-assigned this Jun 27, 2017
@asajeffrey asajeffrey changed the title Paint worklets: deleting an image key that is in use Canvas: deleting an image key that is in use Jun 27, 2017
@asajeffrey
Copy link
Member Author

cc @glennw

@asajeffrey
Copy link
Member Author

Looking at the code for html images, it looks like the reason why we're not hitting the problem there is that we're just never removing images from the image cache: #12881.

bors-servo pushed a commit that referenced this issue Jul 17, 2017
…=jdm

Don't delete webrender image keys immediately.

<!-- Please describe your changes on the following line: -->

We currently delete webrender image id's immediately on resizing a canvas, which can cause panics. This PR delays deleting the image id until an epoch has passed.

---
<!-- Thank you for contributing to Servo! Please replace each `[ ]` by `[X]` when the step is complete, and replace `__` with appropriate data: -->
- [X] `./mach build -d` does not report any errors
- [X] `./mach test-tidy` does not report any errors
- [X] These changes fix #17534
- [X] These changes do not require tests because the intermittent failure is already triggered by the css-paint-api tests.

<!-- Also, please make sure that "Allow edits from maintainers" checkbox is checked, so that we can help you if you get stuck somewhere along the way.-->

<!-- Pull requests that do not address these steps are welcome, but they will require additional verification as part of the review process. -->

<!-- Reviewable:start -->
---
This change is [<img src="https://reviewable.io/review_button.svg" height="34" align="absmiddle" alt="Reviewable"/>](https://reviewable.io/reviews/servo/servo/17606)
<!-- Reviewable:end -->
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging a pull request may close this issue.

1 participant