The viewer now adds it's own references and doesn't take references from
the caller. In almost all cases the caller needs to keep it's reference
so that it can remove the object when the plugin is unloaded.
list->next->prev = link;
list->next = link;
object->ref = link;
list->next->prev = link;
list->next = link;
object->ref = link;
g_mutex_unlock(&opengl->objects_lock);
}
g_mutex_unlock(&opengl->objects_lock);
}
{
g_assert(GRITS_IS_OPENGL(_opengl));
GritsOpenGL *opengl = GRITS_OPENGL(_opengl);
{
g_assert(GRITS_IS_OPENGL(_opengl));
GritsOpenGL *opengl = GRITS_OPENGL(_opengl);
+ if (!object->ref)
+ return;
g_mutex_lock(&opengl->objects_lock);
GList *link = object->ref;
/* Just unlink and free it, link->prev is assured */
g_mutex_lock(&opengl->objects_lock);
GList *link = object->ref;
/* Just unlink and free it, link->prev is assured */
if (link->next)
link->next->prev = link->prev;
g_free(link);
if (link->next)
link->next->prev = link->prev;
g_free(link);
+ object->ref = NULL;
+ g_object_unref(object);
g_mutex_unlock(&opengl->objects_lock);
}
g_mutex_unlock(&opengl->objects_lock);
}
g_debug("GritsPlugins: free");
for (GList *cur = plugins->plugins; cur; cur = cur->next) {
GritsPluginStore *store = cur->data;
g_debug("GritsPlugins: free");
for (GList *cur = plugins->plugins; cur; cur = cur->next) {
GritsPluginStore *store = cur->data;
- g_debug("GritsPlugin: freeing %s refs=%d->%d", store->name,
+ g_debug("GritsPlugins: freeing %s refs=%d->%d", store->name,
G_OBJECT(store->plugin)->ref_count,
G_OBJECT(store->plugin)->ref_count-1);
grits_plugins_free_store(store);
G_OBJECT(store->plugin)->ref_count,
G_OBJECT(store->plugin)->ref_count-1);
grits_plugins_free_store(store);
* @object: the object to remove
*
* Remove an object from the viewer.
* @object: the object to remove
*
* Remove an object from the viewer.
- * The objects reference count is decremented.
*/
void grits_viewer_remove(GritsViewer *viewer, GritsObject *object)
{
*/
void grits_viewer_remove(GritsViewer *viewer, GritsObject *object)
{
g_warning("GritsViewer: remove - Unimplemented");
object->viewer = NULL;
klass->remove(viewer, object);
g_warning("GritsViewer: remove - Unimplemented");
object->viewer = NULL;
klass->remove(viewer, object);
- g_object_unref(object);
static void grits_callback_finalize(GObject *cb)
{
g_debug("GritsCallback: finalize");
static void grits_callback_finalize(GObject *cb)
{
g_debug("GritsCallback: finalize");
+ G_OBJECT_CLASS(grits_callback_parent_class)->finalize(cb);
}
static void grits_callback_init(GritsCallback *cb)
{
}
static void grits_callback_init(GritsCallback *cb)
{
grits_viewer_clear_height_func(viewer);
if (LOAD_TEX)
grits_viewer_remove(viewer, GRITS_OBJECT(elev->tiles));
grits_viewer_clear_height_func(viewer);
if (LOAD_TEX)
grits_viewer_remove(viewer, GRITS_OBJECT(elev->tiles));
- else
- g_object_unref(elev->tiles);
+ g_object_unref(elev->tiles);
soup_session_abort(elev->wms->http->soup);
g_thread_pool_free(elev->threads, TRUE, TRUE);
while (gtk_events_pending())
soup_session_abort(elev->wms->http->soup);
g_thread_pool_free(elev->threads, TRUE, TRUE);
while (gtk_events_pending())
if (env->viewer) {
for (GList *cur = env->refs; cur; cur = cur->next)
grits_viewer_remove(env->viewer, cur->data);
if (env->viewer) {
for (GList *cur = env->refs; cur; cur = cur->next)
grits_viewer_remove(env->viewer, cur->data);
- g_list_free(env->refs);
+ g_list_free_full(env->refs, g_object_unref);
g_object_unref(env->viewer);
g_object_unref(env->prefs);
glDeleteTextures(1, &env->tex);
g_object_unref(env->viewer);
g_object_unref(env->prefs);
glDeleteTextures(1, &env->tex);
map->viewer = NULL;
g_signal_handler_disconnect(viewer, map->sigid);
grits_viewer_remove(viewer, GRITS_OBJECT(map->tiles));
map->viewer = NULL;
g_signal_handler_disconnect(viewer, map->sigid);
grits_viewer_remove(viewer, GRITS_OBJECT(map->tiles));
+ g_object_unref(map->tiles);
soup_session_abort(map->tms->http->soup);
//soup_session_abort(map->wms->http->soup);
g_thread_pool_free(map->threads, TRUE, TRUE);
soup_session_abort(map->tms->http->soup);
//soup_session_abort(map->wms->http->soup);
g_thread_pool_free(map->threads, TRUE, TRUE);
sat->viewer = NULL;
g_signal_handler_disconnect(viewer, sat->sigid);
grits_viewer_remove(viewer, GRITS_OBJECT(sat->tiles));
sat->viewer = NULL;
g_signal_handler_disconnect(viewer, sat->sigid);
grits_viewer_remove(viewer, GRITS_OBJECT(sat->tiles));
+ g_object_unref(sat->tiles);
soup_session_abort(sat->wms->http->soup);
g_thread_pool_free(sat->threads, TRUE, TRUE);
while (gtk_events_pending())
soup_session_abort(sat->wms->http->soup);
g_thread_pool_free(sat->threads, TRUE, TRUE);
while (gtk_events_pending())
grits_viewer_remove(viewer, GRITS_OBJECT(test->marker));
grits_viewer_remove(viewer, GRITS_OBJECT(test->poly));
grits_viewer_remove(viewer, GRITS_OBJECT(test->line));
grits_viewer_remove(viewer, GRITS_OBJECT(test->marker));
grits_viewer_remove(viewer, GRITS_OBJECT(test->poly));
grits_viewer_remove(viewer, GRITS_OBJECT(test->line));
+ g_object_unref(test->marker);
+ g_object_unref(test->poly);
+ g_object_unref(test->line);
g_object_unref(viewer);
}
G_OBJECT_CLASS(grits_plugin_test_parent_class)->dispose(_test);
g_object_unref(viewer);
}
G_OBJECT_CLASS(grits_plugin_test_parent_class)->dispose(_test);