[libgis] Improve threading
- From: Andy Spencer <andys src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [libgis] Improve threading
- Date: Fri, 10 Sep 2010 03:16:38 +0000 (UTC)
commit d91172dc0108351719bc3e8097357349c0389378
Author: Andy Spencer <andy753421 gmail com>
Date: Mon Apr 26 04:51:27 2010 +0000
Improve threading
- Clean up some gdk_thread_{enter,leave} calls
- Fix bug in gis_viewer_add (linked list handling)
- Call gtk_gl_init from gis-test (not sure if this is important)
src/gis-opengl.c | 26 ++++++++++++--------------
src/gis-test.c | 2 ++
src/gis-viewer.c | 1 -
3 files changed, 14 insertions(+), 15 deletions(-)
---
diff --git a/src/gis-opengl.c b/src/gis-opengl.c
index 9501781..694a33e 100644
--- a/src/gis-opengl.c
+++ b/src/gis-opengl.c
@@ -441,7 +441,9 @@ static gboolean on_expose(GisOpenGL *opengl, GdkEventExpose *event, gpointer _)
roam_sphere_draw(opengl->sphere);
//roam_sphere_draw_normals(opengl->sphere);
#else
+ g_mutex_lock(opengl->objects_lock);
g_tree_foreach(opengl->objects, _draw_level, opengl);
+ g_mutex_unlock(opengl->objects_lock);
if (opengl->wireframe) {
glClear(GL_DEPTH_BUFFER_BIT);
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
@@ -462,7 +464,6 @@ static gboolean on_key_press(GisOpenGL *opengl, GdkEventKey *event, gpointer _)
event->keyval, event->state, GDK_plus);
guint kv = event->keyval;
- gdk_threads_leave();
/* Testing */
if (kv == GDK_w) {
opengl->wireframe = !opengl->wireframe;
@@ -473,10 +474,7 @@ static gboolean on_key_press(GisOpenGL *opengl, GdkEventKey *event, gpointer _)
else if (kv == GDK_p) roam_sphere_merge_one(opengl->sphere);
else if (kv == GDK_r) roam_sphere_split_merge(opengl->sphere);
else if (kv == GDK_u) roam_sphere_update_errors(opengl->sphere);
- gdk_threads_enter();
gtk_widget_queue_draw(GTK_WIDGET(opengl));
-#else
- gdk_threads_enter();
#endif
return FALSE;
}
@@ -506,12 +504,10 @@ static void on_view_changed(GisOpenGL *opengl,
static gboolean on_idle(GisOpenGL *opengl)
{
//g_debug("GisOpenGL: on_idle");
- gdk_threads_enter();
g_mutex_lock(opengl->sphere_lock);
if (roam_sphere_split_merge(opengl->sphere))
gtk_widget_queue_draw(GTK_WIDGET(opengl));
g_mutex_unlock(opengl->sphere_lock);
- gdk_threads_leave();
return TRUE;
}
@@ -610,8 +606,8 @@ static gpointer gis_opengl_add(GisViewer *_opengl, GisObject *object,
{
g_assert(GIS_IS_OPENGL(_opengl));
GisOpenGL *opengl = GIS_OPENGL(_opengl);
- _load_object(opengl, object);
g_mutex_lock(opengl->objects_lock);
+ _load_object(opengl, object);
struct RenderLevel *level = g_tree_lookup(opengl->objects, (gpointer)key);
if (!level) {
level = g_new0(struct RenderLevel, 1);
@@ -619,23 +615,25 @@ static gpointer gis_opengl_add(GisViewer *_opengl, GisObject *object,
}
GList *list = sort ? &level->sorted : &level->unsorted;
/* Put the link in the list */
- GList *next = g_new0(GList, 1);
- next->data = object;
- next->prev = list;
- next->next = list->next;
- list->next = next;
+ GList *link = g_new0(GList, 1);
+ link->data = object;
+ link->prev = list;
+ link->next = list->next;
+ if (list->next)
+ list->next->prev = link;
+ list->next = link;
g_mutex_unlock(opengl->objects_lock);
- return next;
+ return link;
}
static GisObject *gis_opengl_remove(GisViewer *_opengl, gpointer _link)
{
g_assert(GIS_IS_OPENGL(_opengl));
GisOpenGL *opengl = GIS_OPENGL(_opengl);
+ g_mutex_lock(opengl->objects_lock);
GList *link = _link;
GisObject *object = link->data;
_unload_object(opengl, object);
- g_mutex_lock(opengl->objects_lock);
/* Just unlink and free it, link->prev is assured */
link->prev->next = link->next;
if (link->next)
diff --git a/src/gis-test.c b/src/gis-test.c
index 7e973c1..53df1ea 100644
--- a/src/gis-test.c
+++ b/src/gis-test.c
@@ -17,6 +17,7 @@
#include <config.h>
#include <gtk/gtk.h>
+#include <gtk/gtkgl.h>
#include <gdk/gdkkeysyms.h>
#include "gis.h"
@@ -60,6 +61,7 @@ int main(int argc, char **argv)
g_thread_init(NULL);
gdk_threads_init();
gtk_init(&argc, &argv);
+ gtk_gl_init(&argc, &argv);
prefs = gis_prefs_new(NULL, NULL);
plugins = gis_plugins_new(g_getenv("GIS_PLUGIN_PATH"), prefs);
diff --git a/src/gis-viewer.c b/src/gis-viewer.c
index f02d078..b89c37f 100644
--- a/src/gis-viewer.c
+++ b/src/gis-viewer.c
@@ -102,7 +102,6 @@ static gboolean on_key_press(GisViewer *viewer, GdkEventKey *event, gpointer _)
double lat, lon, elev, pan;
gis_viewer_get_location(viewer, &lat, &lon, &elev);
pan = MIN(elev/(EARTH_R/2), 30);
- gdk_threads_leave();
switch (event->keyval) {
case GDK_Left: case GDK_h: gis_viewer_pan(viewer, 0, -pan, 0); break;
case GDK_Down: case GDK_j: gis_viewer_pan(viewer, -pan, 0, 0); break;
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]