Reduce contention for renderengine's async ops.

RenderEngine was holding a lock when executing work items in a task
queue. The lock was intended for managing the task queue itself since
we're not using a concurrent data structure for the queue, but the lock
was not required to be held while executing work. This was causing
performance issues where if multiple ExternalTextures were destroyed
very closely in time, subsequent requests to unmap the underlying
GrBackendTexture needed to block on prior requests to finish. The
exemplary case is destroying a layer, where many buffers associated with
that layer needed to be freed on the main thread.

The fix in this patch is two-fold:
1. Don't lock anything else with the work queue lock
2. (1) breaks thread-safety for mRunning, so make it atomic which is
sufficient since it's only used for safe destruction.

Bug: 188632264
Bug: 190375955
Test: Perfetto trace of app lifecyle.

Change-Id: Ia238b43cb971fde42a92eab4f8247286d2e2d247
2 files changed