diff options
| author | 2012-04-17 12:02:26 -0700 | |
|---|---|---|
| committer | 2012-04-17 14:52:13 -0700 | |
| commit | a0fef1c8bb22443402fb3aeda7ce70f7d5775b0a (patch) | |
| tree | b066ac923d302a003e58255dc6da584fdd0b1276 /libs/utils/Threads.cpp | |
| parent | 3aecbb0715cb6928e0530ff1e4caa9c0993cc371 (diff) | |
Fix deadlock when cleaning objects in eglTerminate
When eglTerminate() is called with a window surface still exists, a
deadlock would occur since egl_display_t::terminate() holds a lock
while destroying the window surface, which calls
onWindowSurfaceDestroyed() which attempts to take the same lock.
This change refactors the hibernation code and data into a separate
object with its own lock, separate from the egl_display_t lock. This
avoids the deadlock and better encapsulates the hibernation logic.
The change also fixes a bug discovered incidentally while debugging:
hibernating after calling eglTerminate() succeeds, but will cause
awakens from subsequent eglInitialize() to fail. We will no longer
hibernate a terminated display.
Change-Id: If55e5bb603d4f8953babc439ffc8d8a60af103d9
Diffstat (limited to 'libs/utils/Threads.cpp')
0 files changed, 0 insertions, 0 deletions