diff options
author | 2009-08-06 20:46:44 -0700 | |
---|---|---|
committer | 2009-08-06 20:46:44 -0700 | |
commit | 42db9dcea2e6b9f60f07a3e9e2d6fbc196082284 (patch) | |
tree | d1b51107d0ec6769baea27330b8d27374c8ef538 /libs/ui/FramebufferNativeWindow.cpp | |
parent | f9694507ec07e3909f41dba051b1bdbdb66002d8 (diff) |
better error handling
Diffstat (limited to 'libs/ui/FramebufferNativeWindow.cpp')
-rw-r--r-- | libs/ui/FramebufferNativeWindow.cpp | 41 |
1 files changed, 32 insertions, 9 deletions
diff --git a/libs/ui/FramebufferNativeWindow.cpp b/libs/ui/FramebufferNativeWindow.cpp index 7b85c7fbab..f6c666df42 100644 --- a/libs/ui/FramebufferNativeWindow.cpp +++ b/libs/ui/FramebufferNativeWindow.cpp @@ -25,6 +25,7 @@ #include <cutils/log.h> #include <cutils/atomic.h> #include <utils/threads.h> +#include <utils/RefBase.h> #include <ui/SurfaceComposerClient.h> #include <ui/Rect.h> @@ -81,10 +82,16 @@ FramebufferNativeWindow::FramebufferNativeWindow() hw_module_t const* module; if (hw_get_module(GRALLOC_HARDWARE_MODULE_ID, &module) == 0) { int stride; - framebuffer_open(module, &fbDev); - gralloc_open(module, &grDev); int err; + err = framebuffer_open(module, &fbDev); + LOGE_IF(err, "couldn't open framebuffer HAL (%s)", strerror(-err)); + + err = gralloc_open(module, &grDev); + LOGE_IF(err, "couldn't open gralloc HAL (%s)", strerror(-err)); + // bail out if we can't initialize the modules + if (!fbDev || !grDev) + return; mUpdateOnDemand = (fbDev->setUpdateRect != 0); @@ -127,11 +134,19 @@ FramebufferNativeWindow::FramebufferNativeWindow() android_native_window_t::query = query; } -FramebufferNativeWindow::~FramebufferNativeWindow() { - grDev->free(grDev, buffers[0]->handle); - grDev->free(grDev, buffers[1]->handle); - gralloc_close(grDev); - framebuffer_close(fbDev); +FramebufferNativeWindow::~FramebufferNativeWindow() +{ + if (grDev) { + if (buffers[0] != NULL) + grDev->free(grDev, buffers[0]->handle); + if (buffers[1] != NULL) + grDev->free(grDev, buffers[1]->handle); + gralloc_close(grDev); + } + + if (fbDev) { + framebuffer_close(fbDev); + } } status_t FramebufferNativeWindow::setUpdateRectangle(const Rect& r) @@ -216,6 +231,7 @@ int FramebufferNativeWindow::query(android_native_window_t* window, *value = fb->format; return NO_ERROR; } + *value = 0; return BAD_VALUE; } @@ -223,9 +239,16 @@ int FramebufferNativeWindow::query(android_native_window_t* window, }; // namespace android // ---------------------------------------------------------------------------- +using namespace android; EGLNativeWindowType android_createDisplaySurface(void) { - return new android::FramebufferNativeWindow(); + FramebufferNativeWindow* w; + w = new FramebufferNativeWindow(); + if (w->getDevice() == NULL) { + // get a ref so it can be destroyed when we exit this block + sp<FramebufferNativeWindow> ref(w); + return NULL; + } + return (EGLNativeWindowType)w; } - |