Branch: refs/heads/master Author: Thomas Martitz kugel@rockbox.org Committer: Thomas Martitz kugel@rockbox.org Date: Tue, 19 Jan 2016 16:08:56 UTC Commit: 9a38b7ac209dcf319f1b5fa97d6081b96f031b4a https://github.com/geany/geany/commit/9a38b7ac209dcf319f1b5fa97d6081b96f031b...
Log Message: ----------- plugin api: convert TMSourceFile to GBoxed internally
Because the tm_source_file_new() is an exported API, it has to be at least a boxed type to be usable for gobject introspection. The boxed type uses reference counting as opposed to memory duplication.
The obligatory tm_source_file_dup() is not exported (doesn't have to).
Modified Paths: -------------- tagmanager/src/tm_source_file.c tagmanager/src/tm_source_file.h
Modified: tagmanager/src/tm_source_file.c 52 lines changed, 44 insertions(+), 8 deletions(-) =================================================================== @@ -35,6 +35,14 @@ #include "tm_source_file.h" #include "tm_tag.h"
+typedef struct +{ + TMSourceFile public; + guint refcount; +} TMSourceFilePriv; + +#define SOURCE_FILE_NEW(S) ((S) = g_slice_new(TMSourceFilePriv)) +#define SOURCE_FILE_FREE(S) g_slice_free(TMSourceFilePriv, (TMSourceFilePriv *) S)
static TMSourceFile *current_source_file = NULL;
@@ -199,12 +207,26 @@ static gboolean tm_source_file_init(TMSourceFile *source_file, const char *file_ GEANY_API_SYMBOL TMSourceFile *tm_source_file_new(const char *file_name, const char *name) { - TMSourceFile *source_file = g_new(TMSourceFile, 1); - if (TRUE != tm_source_file_init(source_file, file_name, name)) + TMSourceFilePriv *priv; + + SOURCE_FILE_NEW(priv); + if (TRUE != tm_source_file_init(&priv->public, file_name, name)) { - g_free(source_file); + SOURCE_FILE_FREE(priv); return NULL; } + priv->refcount = 1; + return &priv->public; +} + + +static TMSourceFile *tm_source_file_dup(TMSourceFile *source_file) +{ + TMSourceFilePriv *priv = (TMSourceFilePriv *) source_file; + + g_return_val_if_fail(NULL != source_file, NULL); + + g_atomic_int_inc(&priv->refcount); return source_file; }
@@ -223,20 +245,34 @@ static void tm_source_file_destroy(TMSourceFile *source_file) source_file->tags_array = NULL; }
-/** Frees a TMSourceFile structure, including all contents. Before calling this - function the TMSourceFile has to be removed from the TMWorkspace. - @param source_file The source file to free. +/** Decrements the reference count of @a source_file + * + * If the reference count drops to 0, then @a source_file is freed, including all contents. + * Make sure the @a source_file is already removed from any TMWorkSpace before the + * this happens. + * @param source_file The source file to free. + * @see tm_workspace_remove_source_file() */ GEANY_API_SYMBOL void tm_source_file_free(TMSourceFile *source_file) { - if (NULL != source_file) + TMSourceFilePriv *priv = (TMSourceFilePriv *) source_file; + + if (NULL != priv && g_atomic_int_dec_and_test(&priv->refcount)) { tm_source_file_destroy(source_file); - g_free(source_file); + SOURCE_FILE_FREE(priv); } }
+/** Gets the GBoxed-derived GType for TMSourceFile + * + * @return TMSourceFile type . */ +GEANY_API_SYMBOL +GType tm_source_file_get_type(void); + +G_DEFINE_BOXED_TYPE(TMSourceFile, tm_source_file, tm_source_file_dup, tm_source_file_free); + /* Parses the text-buffer or source file and regenarates the tags. @param source_file The source file to parse @param text_buf The text buffer to parse
Modified: tagmanager/src/tm_source_file.h 3 lines changed, 3 insertions(+), 0 deletions(-) =================================================================== @@ -12,6 +12,7 @@
#include <stdio.h> #include <glib.h> +#include <glib-object.h>
#ifndef LIBCTAGS_DEFINED typedef int langType; @@ -44,6 +45,8 @@ typedef struct GPtrArray *tags_array; /**< Sorted tag array obtained by parsing the object */ } TMSourceFile;
+GType tm_source_file_get_type(void); + TMSourceFile *tm_source_file_new(const char *file_name, const char *name);
void tm_source_file_free(TMSourceFile *source_file);
-------------- This E-Mail was brought to you by github_commit_mail.py (Source: https://github.com/geany/infrastructure).