commit eb8f9e5bdffb7503513758e339d3215f1d690485
parent d43c0116bfdc8c3a511e5b638c2bd1908cfa9833
Author: Andrej Kacian <ticho@claws-mail.org>
Date: Tue, 5 Mar 2019 08:40:20 +0100
Add a mutex lock for Litehtml plugin image cache
Diffstat:
2 files changed, 18 insertions(+), 3 deletions(-)
diff --git a/src/plugins/litehtml_viewer/container_linux.cpp b/src/plugins/litehtml_viewer/container_linux.cpp
@@ -35,6 +35,7 @@ container_linux::container_linux(void)
{
m_temp_surface = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, 2, 2);
m_temp_cr = cairo_create(m_temp_surface);
+ g_rec_mutex_init(&m_images_lock);
}
container_linux::~container_linux(void)
@@ -42,6 +43,7 @@ container_linux::~container_linux(void)
clear_images();
cairo_surface_destroy(m_temp_surface);
cairo_destroy(m_temp_cr);
+ g_rec_mutex_clear(&m_images_lock);
}
int container_linux::pt_to_px( int pt )
@@ -184,7 +186,7 @@ void container_linux::draw_background( litehtml::uint_ptr hdc, const litehtml::b
litehtml::tstring url;
make_url(bg.image.c_str(), bg.baseurl.c_str(), url);
- //lock_images_cache();
+ lock_images_cache();
bool found = false;
const image *img_i = NULL;
@@ -245,7 +247,8 @@ void container_linux::draw_background( litehtml::uint_ptr hdc, const litehtml::b
cairo_surface_destroy(img);
}
-// unlock_images_cache();
+
+ unlock_images_cache();
cairo_restore(cr);
}
@@ -653,6 +656,8 @@ void container_linux::fill_ellipse( cairo_t* cr, int x, int y, int width, int he
void container_linux::clear_images()
{
+ lock_images_cache();
+
for(auto i = m_images.begin(); i != m_images.end(); ++i) {
image *img = &(*i);
@@ -662,6 +667,8 @@ void container_linux::clear_images()
}
m_images.clear();
+
+ unlock_images_cache();
}
gint container_linux::clear_images(gint desired_size)
@@ -669,6 +676,8 @@ gint container_linux::clear_images(gint desired_size)
gint size = 0;
gint num = 0;
+ lock_images_cache();
+
/* First, tally up size of all the stored GdkPixbufs and
* deallocate those which make the total size be above
* the desired_size limit. We will remove their list
@@ -698,6 +707,8 @@ gint container_linux::clear_images(gint desired_size)
return false;
});
+ unlock_images_cache();
+
return num;
}
diff --git a/src/plugins/litehtml_viewer/container_linux.h b/src/plugins/litehtml_viewer/container_linux.h
@@ -61,7 +61,9 @@ protected:
cairo_surface_t* m_temp_surface;
cairo_t* m_temp_cr;
images_map m_images;
- cairo_clip_box::vector m_clips;
+ GRecMutex m_images_lock;
+ cairo_clip_box::vector m_clips;
+
public:
container_linux(void);
virtual ~container_linux(void);
@@ -104,4 +106,6 @@ private:
void add_path_arc(cairo_t* cr, double x, double y, double rx, double ry, double a1, double a2, bool neg);
void draw_pixbuf(cairo_t* cr, const GdkPixbuf *bmp, int x, int y, int cx, int cy);
cairo_surface_t* surface_from_pixbuf(const GdkPixbuf *bmp);
+ void lock_images_cache(void);
+ void unlock_images_cache(void);
};