Commit 2286ddf0 authored by tapted's avatar tapted Committed by Commit bot

Speculative fix for ui::DisplayLinkMac::StopDisplayLink crashes

The CVDisplayLink is tied to a ScopedTypeRef data member of DisplayLinkMac.
However, there may be other references. Since there's no guarantee that
~DisplayLinkMac() will invoke the last CVDisplayLinkRelease(..) and clear
the callback automatically, clear it explicitly in ~DisplayLinkMac.

BUG=564780

Review URL: https://codereview.chromium.org/1626163002

Cr-Commit-Position: refs/heads/master@{#371648}
parent 5af0ca15
...@@ -86,6 +86,14 @@ DisplayLinkMac::DisplayLinkMac( ...@@ -86,6 +86,14 @@ DisplayLinkMac::DisplayLinkMac(
DisplayLinkMac::~DisplayLinkMac() { DisplayLinkMac::~DisplayLinkMac() {
StopDisplayLink(); StopDisplayLink();
// Usually |display_link_| holds the last reference to CVDisplayLinkRef, but
// that's not guaranteed, so it might not free all resources after the
// destructor completes. Ensure the callback is cleared out regardless to
// avoid possible crashes (see http://crbug.com/564780).
CVReturn ret =
CVDisplayLinkSetOutputCallback(display_link_, nullptr, nullptr);
DCHECK_EQ(kCGErrorSuccess, ret);
DisplayMap::iterator found = display_map_.Get().find(display_id_); DisplayMap::iterator found = display_map_.Get().find(display_id_);
DCHECK(found != display_map_.Get().end()); DCHECK(found != display_map_.Get().end());
DCHECK(found->second == this); DCHECK(found->second == this);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment