diff options
| author | Mathias Agopian <mathias@google.com> | 2010-02-05 18:37:17 -0800 |
|---|---|---|
| committer | Android (Google) Code Review <android-gerrit@google.com> | 2010-02-05 18:37:17 -0800 |
| commit | 2b726af2b8e7f8347d907128d955035a576541f5 (patch) | |
| tree | 6fecf0696e7f63416edf5fb571b1f7b9036ce135 /opengl | |
| parent | 7e64962d0cbb00d7ef8d1110947ca27ff06f988b (diff) | |
| parent | 6099ab701e8a1e5b18c997cd913d17dc478bfed7 (diff) | |
| download | frameworks_base-2b726af2b8e7f8347d907128d955035a576541f5.zip frameworks_base-2b726af2b8e7f8347d907128d955035a576541f5.tar.gz frameworks_base-2b726af2b8e7f8347d907128d955035a576541f5.tar.bz2 | |
Merge "fix [2189862] Race condition in eglIntialize and eglDestroy"
Diffstat (limited to 'opengl')
| -rw-r--r-- | opengl/libs/EGL/egl.cpp | 19 |
1 files changed, 16 insertions, 3 deletions
diff --git a/opengl/libs/EGL/egl.cpp b/opengl/libs/EGL/egl.cpp index d2f8ced..145e25e 100644 --- a/opengl/libs/EGL/egl.cpp +++ b/opengl/libs/EGL/egl.cpp @@ -166,7 +166,8 @@ struct egl_display_t { uint32_t magic; DisplayImpl disp[IMPL_NUM_IMPLEMENTATIONS]; EGLint numTotalConfigs; - volatile int32_t refs; + uint32_t refs; + Mutex lock; egl_display_t() : magic('_dpy'), numTotalConfigs(0) { } ~egl_display_t() { magic = 0; } @@ -644,7 +645,9 @@ EGLBoolean eglInitialize(EGLDisplay dpy, EGLint *major, EGLint *minor) egl_display_t * const dp = get_display(dpy); if (!dp) return setError(EGL_BAD_DISPLAY, EGL_FALSE); - if (android_atomic_inc(&dp->refs) > 0) { + Mutex::Autolock _l(dp->lock); + + if (dp->refs > 0) { if (major != NULL) *major = VERSION_MAJOR; if (minor != NULL) *minor = VERSION_MINOR; return EGL_TRUE; @@ -728,6 +731,7 @@ EGLBoolean eglInitialize(EGLDisplay dpy, EGLint *major, EGLint *minor) } if (res == EGL_TRUE) { + dp->refs++; if (major != NULL) *major = VERSION_MAJOR; if (minor != NULL) *minor = VERSION_MINOR; return EGL_TRUE; @@ -743,7 +747,15 @@ EGLBoolean eglTerminate(EGLDisplay dpy) egl_display_t* const dp = get_display(dpy); if (!dp) return setError(EGL_BAD_DISPLAY, EGL_FALSE); - if (android_atomic_dec(&dp->refs) != 1) + + Mutex::Autolock _l(dp->lock); + + if (dp->refs == 0) { + return setError(EGL_NOT_INITIALIZED, EGL_FALSE); + } + + // this is specific to Android, display termination is ref-counted. + if (dp->refs > 1) return EGL_TRUE; EGLBoolean res = EGL_FALSE; @@ -767,6 +779,7 @@ EGLBoolean eglTerminate(EGLDisplay dpy) // TODO: all egl_object_t should be marked for termination + dp->refs--; dp->numTotalConfigs = 0; clearTLS(); return res; |
