barbieri pushed a commit to branch master.

http://git.enlightenment.org/core/efl.git/commit/?id=587a1710619c099bc9ffe706195518155144315b

commit 587a1710619c099bc9ffe706195518155144315b
Author: Gustavo Sverzut Barbieri <gustavo.barbi...@intel.com>
Date:   Thu Mar 6 02:16:03 2014 -0300

    evas/fb: expose and call fb_freemode() and fb_cleanup()
    
    properly clean memory and restore framebuffer on error conditions.
    
    @fix
---
 src/modules/evas/engines/fb/evas_fb.h      | 4 ++++
 src/modules/evas/engines/fb/evas_fb_main.c | 9 +++++++--
 src/modules/evas/engines/fb/evas_outbuf.c  | 7 +++++--
 3 files changed, 16 insertions(+), 4 deletions(-)

diff --git a/src/modules/evas/engines/fb/evas_fb.h 
b/src/modules/evas/engines/fb/evas_fb.h
index 76ab30b..97c2cff 100644
--- a/src/modules/evas/engines/fb/evas_fb.h
+++ b/src/modules/evas/engines/fb/evas_fb.h
@@ -41,6 +41,8 @@ struct _fb_mode
 /* init a framebuffer (and switch to) vt number vt. If vt == 0 use current   */
 /* vt                                                                        */
 void fb_init(int vt, int device);
+/* finishes whatever was done at fb_init() */
+void fb_cleanup(void);
 /* call this afetr setting or getting the fb mode (whichever) to complete    */
 /* the dsetup                                                                */
 int  fb_postinit(FB_Mode *mode);
@@ -64,6 +66,8 @@ FB_Mode *fb_list_modes(unsigned int *num_return);
 FB_Mode *fb_setmode(unsigned int width, unsigned int height, unsigned int 
depth, unsigned int refresh);
 /* returns the current fb mode being used in FB_Mode                         */
 FB_Mode *fb_getmode(void);
+/* free the FB_Mode struct returned by fb_getmode() */
+void fb_freemode(FB_Mode *mode);
 /* changes the bit depth of the current fb mode to depth and returns a new   */
 /* handle to a new fb mode with updated parameters. frees cur_mode for you.  */
 FB_Mode *fb_changedepth(FB_Mode *cur_mode, unsigned int depth);
diff --git a/src/modules/evas/engines/fb/evas_fb_main.c 
b/src/modules/evas/engines/fb/evas_fb_main.c
index 43f088e..2f3a3f9 100644
--- a/src/modules/evas/engines/fb/evas_fb_main.c
+++ b/src/modules/evas/engines/fb/evas_fb_main.c
@@ -36,7 +36,6 @@ static struct fb_cmap            cmap  = { 0, 256, red,  
green,  blue, NULL };
 /* -------------------------------------------------------------------- */
 /* internal function prototypes                                         */
 
-static void fb_cleanup(void);
 //static void fb_cleanup_fork(void);
 //static void fb_setvt(int vtno);
 static void fb_init_palette_332(FB_Mode *mode);
@@ -388,6 +387,12 @@ fb_getmode(void)
    return mode;
 }
 
+void
+fb_freemode(FB_Mode *mode)
+{
+   free(mode);
+}
+
 /* XXX: unused
 static void
 fb_setvt(int vtno)
@@ -583,7 +588,7 @@ fb_postinit(FB_Mode *mode)
   return fb;
 }
 
-static void
+void
 fb_cleanup(void)
 {
    if (fb < 0) return;
diff --git a/src/modules/evas/engines/fb/evas_outbuf.c 
b/src/modules/evas/engines/fb/evas_outbuf.c
index 04985d3..59ee69e 100644
--- a/src/modules/evas/engines/fb/evas_outbuf.c
+++ b/src/modules/evas/engines/fb/evas_outbuf.c
@@ -11,10 +11,10 @@ evas_fb_outbuf_fb_init(void)
 void
 evas_fb_outbuf_fb_free(Outbuf *buf)
 {
-   /* FIXME: implement */
-   WRN("destroying fb info.. not implemented!!!! WARNING. LEAK!");
    if (buf->priv.back_buf)
      evas_cache_image_drop(&buf->priv.back_buf->cache_entry);
+   fb_freemode(buf->priv.fb.fb);
+   fb_cleanup();
    free(buf);
 }
 
@@ -53,6 +53,7 @@ evas_fb_outbuf_fb_setup_fb(int w, int h, int rot, 
Outbuf_Depth depth, int vt_no,
    fb_fd = fb_postinit(buf->priv.fb.fb);
    if (fb_fd < 1)
      {
+        fb_freemode(buf->priv.fb.fb);
         free(buf);
         return NULL;
      }
@@ -104,6 +105,8 @@ evas_fb_outbuf_fb_setup_fb(int w, int h, int rot, 
Outbuf_Depth depth, int vt_no,
                                       buf->rot);
        if (!conv_func)
          {
+             fb_freemode(buf->priv.fb.fb);
+             fb_cleanup();
             free(buf);
             return NULL;
          }

-- 


Reply via email to