fix bug 3313505
Shader cache cleanup could occur in wrong thread
during RS teardown.

Change-Id: Iffed41de046147db30885e6815826e3b640020c1
diff --git a/rsContext.cpp b/rsContext.cpp
index 22c73fe..c437d72 100644
--- a/rsContext.cpp
+++ b/rsContext.cpp
@@ -535,6 +535,7 @@
          mStateFragment.deinit(this);
          mStateFragmentStore.deinit(this);
          mStateFont.deinit(this);
+         mShaderCache.cleanupAll();
     }
     ObjectBase::zeroAllUserRef(this);
     LOGV("destroyWorkerThreadResources 2");
diff --git a/rsShaderCache.cpp b/rsShaderCache.cpp
index 45384c9..b958021 100644
--- a/rsShaderCache.cpp
+++ b/rsShaderCache.cpp
@@ -32,10 +32,7 @@
 }
 
 ShaderCache::~ShaderCache() {
-    for (uint32_t ct=0; ct < mEntries.size(); ct++) {
-        glDeleteProgram(mEntries[ct]->program);
-        free(mEntries[ct]);
-    }
+    cleanupAll();
 }
 
 void ShaderCache::updateUniformArrayData(Context *rsc, Program *prog, uint32_t linkedID,
@@ -251,5 +248,10 @@
 }
 
 void ShaderCache::cleanupAll() {
+    for (uint32_t ct=0; ct < mEntries.size(); ct++) {
+        glDeleteProgram(mEntries[ct]->program);
+        free(mEntries[ct]);
+    }
+    mEntries.clear();
 }