Make FlatpakRemoteState refcounted

This is needed to fix a memory leak

Closes: #1964
Approved by: mwleeds
This commit is contained in:
Alexander Larsson
2018-08-13 18:18:51 +02:00
committed by Atomic Bot
parent 45945c5d45
commit cbbc98b50d
4 changed files with 32 additions and 14 deletions

View File

@@ -62,7 +62,7 @@ static void
remote_dir_pair_free (RemoteDirPair *pair)
{
g_free (pair->remote_name);
flatpak_remote_state_free (pair->state);
flatpak_remote_state_unref (pair->state);
g_object_unref (pair->dir);
g_free (pair);
}

View File

@@ -91,9 +91,11 @@ typedef struct
GError *summary_fetch_error;
GVariant *metadata;
GError *metadata_fetch_error;
int refcount;
} FlatpakRemoteState;
void flatpak_remote_state_free (FlatpakRemoteState *remote_state);
FlatpakRemoteState *flatpak_remote_state_ref (FlatpakRemoteState *remote_state);
void flatpak_remote_state_unref (FlatpakRemoteState *remote_state);
gboolean flatpak_remote_state_ensure_summary (FlatpakRemoteState *self,
GError **error);
gboolean flatpak_remote_state_ensure_metadata (FlatpakRemoteState *self,
@@ -122,7 +124,7 @@ GVariant *flatpak_remote_state_lookup_sparse_cache (FlatpakRemoteState *self,
G_DEFINE_AUTOPTR_CLEANUP_FUNC (FlatpakDir, g_object_unref)
G_DEFINE_AUTOPTR_CLEANUP_FUNC (FlatpakDeploy, g_object_unref)
G_DEFINE_AUTOPTR_CLEANUP_FUNC (FlatpakRelated, flatpak_related_free)
G_DEFINE_AUTOPTR_CLEANUP_FUNC (FlatpakRemoteState, flatpak_remote_state_free)
G_DEFINE_AUTOPTR_CLEANUP_FUNC (FlatpakRemoteState, flatpak_remote_state_unref)
typedef struct
{

View File

@@ -198,21 +198,37 @@ get_config_dir_location (void)
static FlatpakRemoteState *
flatpak_remote_state_new (void)
{
return g_new0 (FlatpakRemoteState, 1);
FlatpakRemoteState *state = g_new0 (FlatpakRemoteState, 1);
state->refcount = 1;
return state;
}
FlatpakRemoteState *
flatpak_remote_state_ref (FlatpakRemoteState *remote_state)
{
g_assert (remote_state->refcount > 0);
remote_state->refcount++;
return remote_state;
}
void
flatpak_remote_state_free (FlatpakRemoteState *remote_state)
flatpak_remote_state_unref (FlatpakRemoteState *remote_state)
{
g_free (remote_state->remote_name);
g_free (remote_state->collection_id);
g_clear_pointer (&remote_state->summary, g_variant_unref);
g_clear_pointer (&remote_state->summary_sig_bytes, g_bytes_unref);
g_clear_error (&remote_state->summary_fetch_error);
g_clear_pointer (&remote_state->metadata, g_variant_unref);
g_clear_error (&remote_state->metadata_fetch_error);
g_assert (remote_state->refcount > 0);
remote_state->refcount--;
g_free (remote_state);
if (remote_state->refcount == 0)
{
g_free (remote_state->remote_name);
g_free (remote_state->collection_id);
g_clear_pointer (&remote_state->summary, g_variant_unref);
g_clear_pointer (&remote_state->summary_sig_bytes, g_bytes_unref);
g_clear_error (&remote_state->summary_fetch_error);
g_clear_pointer (&remote_state->metadata, g_variant_unref);
g_clear_error (&remote_state->metadata_fetch_error);
g_free (remote_state);
}
}
gboolean

View File

@@ -785,7 +785,7 @@ flatpak_transaction_init (FlatpakTransaction *self)
FlatpakTransactionPrivate *priv = flatpak_transaction_get_instance_private (self);
priv->last_op_for_ref = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL);
priv->remote_states = g_hash_table_new_full (g_str_hash, g_str_equal, NULL, (GDestroyNotify) flatpak_remote_state_free);
priv->remote_states = g_hash_table_new_full (g_str_hash, g_str_equal, NULL, (GDestroyNotify) flatpak_remote_state_unref);
priv->added_origin_remotes = g_ptr_array_new_with_free_func (g_free);
priv->extra_dependency_dirs = g_ptr_array_new_with_free_func (g_object_unref);
}