aboutsummaryrefslogtreecommitdiffstats
path: root/epan/expert.c
diff options
context:
space:
mode:
authorStig Bjørlykke <stig@bjorlykke.org>2015-12-10 14:10:17 +0100
committerAnders Broman <a.broman58@gmail.com>2015-12-11 05:17:58 +0000
commitea1789f925f49027e6b2864e6cc846b7016dc13b (patch)
tree6e85ad0ec120dbcca96625db53b1b4da202b1e33 /epan/expert.c
parent9c47cb4254e6aa188cd15c1aebe660a6356d91ca (diff)
Qt: Reload Lua expert infos
Support reloading Lua plugins with expert infos. Use the same delayed deregister logic as for fields. Change-Id: I36efa0820050b3a7afed4de7a8b0fa16805e8dfa Reviewed-on: https://code.wireshark.org/review/12498 Petri-Dish: Stig Bjørlykke <stig@bjorlykke.org> Tested-by: Petri Dish Buildbot <buildbot-no-reply@wireshark.org> Reviewed-by: Anders Broman <a.broman58@gmail.com>
Diffstat (limited to 'epan/expert.c')
-rw-r--r--epan/expert.c40
1 files changed, 38 insertions, 2 deletions
diff --git a/epan/expert.c b/epan/expert.c
index 4a3d692f06..6802997d32 100644
--- a/epan/expert.c
+++ b/epan/expert.c
@@ -68,6 +68,9 @@ static gpa_expertinfo_t gpa_expertinfo;
/* Hash table of abbreviations and IDs */
static GHashTable *gpa_name_map = NULL;
+/* Deregistered expert infos */
+static GPtrArray *deregistered_expertinfos = NULL;
+
const value_string expert_group_vals[] = {
{ PI_CHECKSUM, "Checksum" },
{ PI_SEQUENCE, "Sequence" },
@@ -187,6 +190,7 @@ static void uat_expert_post_update_cb(void)
if((guint)eiindex >= gpa_expertinfo.len && getenv("WIRESHARK_ABORT_ON_DISSECTOR_BUG")) \
g_error("Unregistered expert info! index=%d", eiindex); \
DISSECTOR_ASSERT_HINT((guint)eiindex < gpa_expertinfo.len, "Unregistered expert info!"); \
+ DISSECTOR_ASSERT_HINT(gpa_expertinfo.ei[eiindex] != NULL, "Unregistered expert info!"); \
expinfo = gpa_expertinfo.ei[eiindex];
void
@@ -265,6 +269,7 @@ expert_init(void)
gpa_expertinfo.ei = NULL;
gpa_name_map = g_hash_table_new_full(g_str_hash, g_str_equal, NULL, NULL);
uat_saved_fields = g_array_new(FALSE, FALSE, sizeof(expert_field_info*));
+ deregistered_expertinfos = g_ptr_array_new();
}
void
@@ -293,6 +298,11 @@ expert_cleanup(void)
g_array_free(uat_saved_fields, TRUE);
uat_saved_fields = NULL;
}
+
+ if (deregistered_expertinfos) {
+ g_ptr_array_free(deregistered_expertinfos, FALSE);
+ deregistered_expertinfos = NULL;
+ }
}
@@ -323,9 +333,35 @@ expert_module_t *expert_register_protocol(int id)
return module;
}
-void expert_deregister_protocol (expert_module_t *module)
+void
+expert_deregister_expertinfo (const char *abbrev)
+{
+ expert_field_info *expinfo = (expert_field_info*)g_hash_table_lookup(gpa_name_map, abbrev);
+ if (expinfo) {
+ g_ptr_array_add(deregistered_expertinfos, gpa_expertinfo.ei[expinfo->id]);
+ g_hash_table_steal(gpa_name_map, abbrev);
+ }
+}
+
+void
+expert_deregister_protocol (expert_module_t *module)
+{
+ wmem_free(wmem_epan_scope(), module);
+}
+
+static void
+free_deregistered_expertinfo (gpointer data, gpointer user_data _U_)
+{
+ expert_field_info *expinfo = (expert_field_info *) data;
+ gpa_expertinfo.ei[expinfo->id] = NULL; /* Invalidate this id */
+}
+
+void
+expert_free_deregistered_expertinfos (void)
{
- wmem_free(wmem_epan_scope(), module);
+ g_ptr_array_foreach(deregistered_expertinfos, free_deregistered_expertinfo, NULL);
+ g_ptr_array_free(deregistered_expertinfos, TRUE);
+ deregistered_expertinfos = g_ptr_array_new();
}
static int