summaryrefslogtreecommitdiff
path: root/src/format
diff options
context:
space:
mode:
authorCyrille Bagard <nocbos@gmail.com>2015-12-29 20:15:04 (GMT)
committerCyrille Bagard <nocbos@gmail.com>2015-12-29 20:15:04 (GMT)
commit64224ffe7d6dc649bdde858ea5c949444eeaa111 (patch)
tree368ff1904d71212017edbed3ef0e6c2b6ee3e857 /src/format
parentecd6b51b126ee473c4942a53d1b17a76dd6b11c3 (diff)
Protected all accesses to the symbols list using read locks.
Diffstat (limited to 'src/format')
-rw-r--r--src/format/format.c15
1 files changed, 15 insertions, 0 deletions
diff --git a/src/format/format.c b/src/format/format.c
index 323e006..63c4deb 100644
--- a/src/format/format.c
+++ b/src/format/format.c
@@ -310,6 +310,7 @@ static void _g_binary_format_remove_symbol(GBinFormat *format, size_t index)
/**
* TODO : envoyer un signal pour avertir les opérandes concernées.
+ * TODO : vérifier les conditions d'accès (verrou).
*/
symbol = format->symbols[index];
@@ -601,6 +602,8 @@ bool g_binary_format_find_symbol_by_label(const GBinFormat *format, const char *
result = false;
+ g_rw_lock_reader_lock(&format->syms_lock);
+
for (i = 0; i < format->symbols_count && !result; i++)
{
cur_lbl = g_binary_symbol_get_label(format->symbols[i]);
@@ -617,6 +620,8 @@ bool g_binary_format_find_symbol_by_label(const GBinFormat *format, const char *
}
+ g_rw_lock_reader_unlock(&format->syms_lock);
+
return result;
}
@@ -646,8 +651,12 @@ static bool _g_binary_format_find_symbol(const GBinFormat *format, const vmpa2t
*symbol = NULL; /* TODO : vérifier les doublons côtés appelants */
+ g_rw_lock_reader_lock(&format->syms_lock);
+
found = bsearch(addr, format->symbols, format->symbols_count, sizeof(GBinSymbol *), fn);
+ g_rw_lock_reader_unlock(&format->syms_lock);
+
if (found != NULL)
{
*symbol = *(GBinSymbol **)found;
@@ -756,6 +765,10 @@ bool g_binary_format_find_next_symbol_at(const GBinFormat *format, const vmpa2t
*symbol = NULL;
+ g_rw_lock_reader_lock(&format->syms_lock);
+
+ /* TODO : ajouter un peu de dichotomie ici ! */
+
for (i = 0; i < format->symbols_count && !result; i++)
{
range = g_binary_symbol_get_range(format->symbols[i]);
@@ -771,6 +784,8 @@ bool g_binary_format_find_next_symbol_at(const GBinFormat *format, const vmpa2t
}
+ g_rw_lock_reader_unlock(&format->syms_lock);
+
return result;
}