core: Add a mutex to cache data structures in preparation for threading
Conflicts: src/libostree/ostree-repo.c
This commit is contained in:
parent
6cdbedf4e6
commit
26c484faed
|
|
@ -74,8 +74,11 @@ struct _OstreeRepoPrivate {
|
||||||
GFile *remote_cache_dir;
|
GFile *remote_cache_dir;
|
||||||
GFile *config_file;
|
GFile *config_file;
|
||||||
|
|
||||||
|
GMutex cache_lock;
|
||||||
GPtrArray *cached_meta_indexes;
|
GPtrArray *cached_meta_indexes;
|
||||||
GPtrArray *cached_content_indexes;
|
GPtrArray *cached_content_indexes;
|
||||||
|
GHashTable *cached_pack_index_mappings;
|
||||||
|
GHashTable *cached_pack_data_mappings;
|
||||||
|
|
||||||
gboolean inited;
|
gboolean inited;
|
||||||
gboolean in_transaction;
|
gboolean in_transaction;
|
||||||
|
|
@ -85,9 +88,6 @@ struct _OstreeRepoPrivate {
|
||||||
OstreeRepoMode mode;
|
OstreeRepoMode mode;
|
||||||
|
|
||||||
OstreeRepo *parent_repo;
|
OstreeRepo *parent_repo;
|
||||||
|
|
||||||
GHashTable *pack_index_mappings;
|
|
||||||
GHashTable *pack_data_mappings;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
|
@ -107,14 +107,15 @@ ostree_repo_finalize (GObject *object)
|
||||||
g_clear_object (&priv->pack_dir);
|
g_clear_object (&priv->pack_dir);
|
||||||
g_clear_object (&priv->remote_cache_dir);
|
g_clear_object (&priv->remote_cache_dir);
|
||||||
g_clear_object (&priv->config_file);
|
g_clear_object (&priv->config_file);
|
||||||
g_hash_table_destroy (priv->pack_index_mappings);
|
|
||||||
g_hash_table_destroy (priv->pack_data_mappings);
|
|
||||||
if (priv->loose_object_devino_hash)
|
if (priv->loose_object_devino_hash)
|
||||||
g_hash_table_destroy (priv->loose_object_devino_hash);
|
g_hash_table_destroy (priv->loose_object_devino_hash);
|
||||||
if (priv->config)
|
if (priv->config)
|
||||||
g_key_file_free (priv->config);
|
g_key_file_free (priv->config);
|
||||||
ot_clear_ptrarray (&priv->cached_meta_indexes);
|
ot_clear_ptrarray (&priv->cached_meta_indexes);
|
||||||
ot_clear_ptrarray (&priv->cached_content_indexes);
|
ot_clear_ptrarray (&priv->cached_content_indexes);
|
||||||
|
g_hash_table_destroy (priv->cached_pack_index_mappings);
|
||||||
|
g_hash_table_destroy (priv->cached_pack_data_mappings);
|
||||||
|
g_mutex_clear (&priv->cache_lock);
|
||||||
|
|
||||||
G_OBJECT_CLASS (ostree_repo_parent_class)->finalize (object);
|
G_OBJECT_CLASS (ostree_repo_parent_class)->finalize (object);
|
||||||
}
|
}
|
||||||
|
|
@ -215,12 +216,13 @@ ostree_repo_init (OstreeRepo *self)
|
||||||
{
|
{
|
||||||
OstreeRepoPrivate *priv = GET_PRIVATE (self);
|
OstreeRepoPrivate *priv = GET_PRIVATE (self);
|
||||||
|
|
||||||
priv->pack_index_mappings = g_hash_table_new_full (g_str_hash, g_str_equal,
|
g_mutex_init (&priv->cache_lock);
|
||||||
g_free,
|
priv->cached_pack_index_mappings = g_hash_table_new_full (g_str_hash, g_str_equal,
|
||||||
(GDestroyNotify)g_variant_unref);
|
g_free,
|
||||||
priv->pack_data_mappings = g_hash_table_new_full (g_str_hash, g_str_equal,
|
(GDestroyNotify)g_variant_unref);
|
||||||
g_free,
|
priv->cached_pack_data_mappings = g_hash_table_new_full (g_str_hash, g_str_equal,
|
||||||
(GDestroyNotify)g_mapped_file_unref);
|
g_free,
|
||||||
|
(GDestroyNotify)g_mapped_file_unref);
|
||||||
}
|
}
|
||||||
|
|
||||||
OstreeRepo*
|
OstreeRepo*
|
||||||
|
|
@ -1927,6 +1929,7 @@ ostree_repo_list_pack_indexes (OstreeRepo *self,
|
||||||
ot_lptrarray GPtrArray *ret_meta_indexes = NULL;
|
ot_lptrarray GPtrArray *ret_meta_indexes = NULL;
|
||||||
ot_lptrarray GPtrArray *ret_data_indexes = NULL;
|
ot_lptrarray GPtrArray *ret_data_indexes = NULL;
|
||||||
|
|
||||||
|
g_mutex_lock (&priv->cache_lock);
|
||||||
if (priv->cached_meta_indexes)
|
if (priv->cached_meta_indexes)
|
||||||
{
|
{
|
||||||
ret_meta_indexes = g_ptr_array_ref (priv->cached_meta_indexes);
|
ret_meta_indexes = g_ptr_array_ref (priv->cached_meta_indexes);
|
||||||
|
|
@ -1957,6 +1960,7 @@ ostree_repo_list_pack_indexes (OstreeRepo *self,
|
||||||
ot_transfer_out_value (out_meta_indexes, &ret_meta_indexes);
|
ot_transfer_out_value (out_meta_indexes, &ret_meta_indexes);
|
||||||
ot_transfer_out_value (out_data_indexes, &ret_data_indexes);
|
ot_transfer_out_value (out_data_indexes, &ret_data_indexes);
|
||||||
out:
|
out:
|
||||||
|
g_mutex_unlock (&priv->cache_lock);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -3400,7 +3404,9 @@ ostree_repo_load_pack_index (OstreeRepo *self,
|
||||||
ot_lvariant GVariant *ret_variant = NULL;
|
ot_lvariant GVariant *ret_variant = NULL;
|
||||||
ot_lobj GFile *path = NULL;
|
ot_lobj GFile *path = NULL;
|
||||||
|
|
||||||
ret_variant = g_hash_table_lookup (priv->pack_index_mappings, pack_checksum);
|
g_mutex_lock (&priv->cache_lock);
|
||||||
|
|
||||||
|
ret_variant = g_hash_table_lookup (priv->cached_pack_index_mappings, pack_checksum);
|
||||||
if (ret_variant)
|
if (ret_variant)
|
||||||
{
|
{
|
||||||
g_variant_ref (ret_variant);
|
g_variant_ref (ret_variant);
|
||||||
|
|
@ -3414,13 +3420,14 @@ ostree_repo_load_pack_index (OstreeRepo *self,
|
||||||
&ret_variant,
|
&ret_variant,
|
||||||
cancellable, error))
|
cancellable, error))
|
||||||
goto out;
|
goto out;
|
||||||
g_hash_table_insert (priv->pack_index_mappings, g_strdup (pack_checksum),
|
g_hash_table_insert (priv->cached_pack_index_mappings, g_strdup (pack_checksum),
|
||||||
g_variant_ref (ret_variant));
|
g_variant_ref (ret_variant));
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = TRUE;
|
ret = TRUE;
|
||||||
ot_transfer_out_value (out_variant, &ret_variant);
|
ot_transfer_out_value (out_variant, &ret_variant);
|
||||||
out:
|
out:
|
||||||
|
g_mutex_unlock (&priv->cache_lock);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -3447,7 +3454,9 @@ ostree_repo_map_pack_file (OstreeRepo *self,
|
||||||
GMappedFile *map = NULL;
|
GMappedFile *map = NULL;
|
||||||
ot_lobj GFile *path = NULL;
|
ot_lobj GFile *path = NULL;
|
||||||
|
|
||||||
map = g_hash_table_lookup (priv->pack_data_mappings, pack_checksum);
|
g_mutex_lock (&priv->cache_lock);
|
||||||
|
|
||||||
|
map = g_hash_table_lookup (priv->cached_pack_data_mappings, pack_checksum);
|
||||||
if (map == NULL)
|
if (map == NULL)
|
||||||
{
|
{
|
||||||
path = get_pack_data_path (priv->pack_dir, is_meta, pack_checksum);
|
path = get_pack_data_path (priv->pack_dir, is_meta, pack_checksum);
|
||||||
|
|
@ -3456,7 +3465,7 @@ ostree_repo_map_pack_file (OstreeRepo *self,
|
||||||
if (!map)
|
if (!map)
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
g_hash_table_insert (priv->pack_data_mappings, g_strdup (pack_checksum), map);
|
g_hash_table_insert (priv->cached_pack_data_mappings, g_strdup (pack_checksum), map);
|
||||||
ret_data = g_mapped_file_get_contents (map);
|
ret_data = g_mapped_file_get_contents (map);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -3469,6 +3478,7 @@ ostree_repo_map_pack_file (OstreeRepo *self,
|
||||||
if (out_len)
|
if (out_len)
|
||||||
*out_len = ret_len;
|
*out_len = ret_len;
|
||||||
out:
|
out:
|
||||||
|
g_mutex_unlock (&priv->cache_lock);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue