summaryrefslogtreecommitdiff
path: root/ui
diff options
context:
space:
mode:
authorPascal Quantin <pascal.quantin@gmail.com>2015-11-15 22:57:43 +0100
committerAlexis La Goutte <alexis.lagoutte@gmail.com>2015-11-16 09:56:46 +0000
commit2773596970c362a6d81c7e44311781590074c43f (patch)
tree56bc2bad99653c9967b9589ef8610b1f82f153ee /ui
parent442314e8b2bdc4ea921bd7136aadb851652f4ce7 (diff)
downloadwireshark-2773596970c362a6d81c7e44311781590074c43f.tar.gz
Qt: add a reference counter to sequence analysis info
Increment the reference counter each time a flow sequence window is opened. Free seq_analysis_info_t structure once the last flow sequence / VoIP calls / SIP flow window is closed. Bug: 11712 Change-Id: I20fcb922b0516417d4bd74cdf75475dcb31f8b90 Reviewed-on: https://code.wireshark.org/review/11851 Reviewed-by: Pascal Quantin <pascal.quantin@gmail.com> Petri-Dish: Pascal Quantin <pascal.quantin@gmail.com> Tested-by: Petri Dish Buildbot <buildbot-no-reply@wireshark.org> Reviewed-by: Alexis La Goutte <alexis.lagoutte@gmail.com>
Diffstat (limited to 'ui')
-rw-r--r--ui/gtk/voip_calls_dlg.c5
-rw-r--r--ui/qt/sequence_dialog.cpp82
-rw-r--r--ui/qt/sequence_dialog.h17
-rw-r--r--ui/qt/voip_calls_dialog.cpp5
-rw-r--r--ui/qt/voip_calls_dialog.h3
-rw-r--r--ui/voip_calls.c7
6 files changed, 72 insertions, 47 deletions
diff --git a/ui/gtk/voip_calls_dlg.c b/ui/gtk/voip_calls_dlg.c
index 0eeb4e2373..53bc752321 100644
--- a/ui/gtk/voip_calls_dlg.c
+++ b/ui/gtk/voip_calls_dlg.c
@@ -871,6 +871,7 @@ voip_calls_dlg_reset(void *ptr _U_)
/* Clean up memory used by calls tap */
voip_calls_reset_all_taps(voip_calls_get_info());
+ sequence_analysis_list_free(voip_calls_get_info()->graph_analysis);
/* close the graph window if open */
if (graph_analysis_data && graph_analysis_data->dlg.window != NULL) {
@@ -885,6 +886,9 @@ static void
voip_calls_dlg_init_taps(const char *dummy _U_, void* userdata _U_)
{
voip_calls_tapinfo_t* tap_id_base = voip_calls_get_info();
+ if(NULL == tap_id_base->graph_analysis) {
+ tap_id_base->graph_analysis = sequence_analysis_info_new();
+ }
tap_id_base->session = cfile.epan;
#ifdef HAVE_LIBPORTAUDIO
@@ -894,6 +898,7 @@ voip_calls_dlg_init_taps(const char *dummy _U_, void* userdata _U_)
/* Clean up memory used by calls tap */
voip_calls_reset_all_taps(tap_id_base);
+ sequence_analysis_list_free(tap_id_base->graph_analysis);
if (graph_analysis_data == NULL) {
/* init the Graph Analysys */
diff --git a/ui/qt/sequence_dialog.cpp b/ui/qt/sequence_dialog.cpp
index a580c7a0af..37fb64fdb4 100644
--- a/ui/qt/sequence_dialog.cpp
+++ b/ui/qt/sequence_dialog.cpp
@@ -47,24 +47,25 @@
// - Create WSGraph subclasses with common behavior.
// - Help button and text
-SequenceDialog::SequenceDialog(QWidget &parent, CaptureFile &cf, seq_analysis_info_t *sainfo) :
+SequenceDialog::SequenceDialog(QWidget &parent, CaptureFile &cf, SequenceInfo *info) :
WiresharkDialog(parent, cf),
ui(new Ui::SequenceDialog),
- sainfo_(sainfo),
+ info_(info),
num_items_(0),
packet_num_(0),
node_label_w_(20)
{
ui->setupUi(this);
QCustomPlot *sp = ui->sequencePlot;
- setWindowSubtitle(sainfo ? tr("Call Flow") : tr("Flow"));
+ setWindowSubtitle(info_ ? tr("Call Flow") : tr("Flow"));
- if (!sainfo_) {
- sainfo_ = sequence_analysis_info_new();
- sainfo_->type = SEQ_ANALYSIS_ANY;
- sainfo_->all_packets = TRUE;
+ if (!info_) {
+ info_ = new SequenceInfo(sequence_analysis_info_new());
+ info_->sainfo()->type = SEQ_ANALYSIS_ANY;
+ info_->sainfo()->all_packets = TRUE;
} else {
- num_items_ = sequence_analysis_get_nodes(sainfo_);
+ info_->ref();
+ num_items_ = sequence_analysis_get_nodes(info_->sainfo());
}
seq_diagram_ = new SequenceDiagram(sp->yAxis, sp->xAxis2, sp->yAxis2);
@@ -112,9 +113,9 @@ SequenceDialog::SequenceDialog(QWidget &parent, CaptureFile &cf, seq_analysis_in
fcb->addItem(ui->actionFlowTcp->text(), SEQ_ANALYSIS_TCP);
ui->flowComboBox->blockSignals(true);
- ui->flowComboBox->setCurrentIndex(sainfo_->type);
+ ui->flowComboBox->setCurrentIndex(info_->sainfo()->type);
- if (sainfo_->type == SEQ_ANALYSIS_VOIP) {
+ if (info_->sainfo()->type == SEQ_ANALYSIS_VOIP) {
ui->controlFrame->hide();
} else {
ui->flowComboBox->blockSignals(false);
@@ -142,9 +143,7 @@ SequenceDialog::SequenceDialog(QWidget &parent, CaptureFile &cf, seq_analysis_in
SequenceDialog::~SequenceDialog()
{
- if (sainfo_->type != SEQ_ANALYSIS_VOIP) {
- sequence_analysis_info_free(sainfo_);
- }
+ info_->unref();
delete ui;
}
@@ -274,10 +273,10 @@ void SequenceDialog::mouseMoved(QMouseEvent *event)
}
if (hint.isEmpty()) {
- if (!sainfo_) {
+ if (!info_->sainfo()) {
hint += tr("No data");
} else {
- hint += tr("%Ln node(s)", "", sainfo_->num_nodes) + QString(", ")
+ hint += tr("%Ln node(s)", "", info_->sainfo()->num_nodes) + QString(", ")
+ tr("%Ln item(s)", "", num_items_);
}
}
@@ -327,8 +326,8 @@ void SequenceDialog::on_buttonBox_accepted()
save_ok = ui->sequencePlot->saveBmp(file_name);
} else if (extension.compare(jpeg_filter) == 0) {
save_ok = ui->sequencePlot->saveJpg(file_name);
- } else if (extension.compare(ascii_filter) == 0 && !file_closed_ && sainfo_) {
- save_ok = sequence_analysis_dump_to_file(file_name.toUtf8().constData(), sainfo_, cap_file_.capFile(), 0);
+ } else if (extension.compare(ascii_filter) == 0 && !file_closed_ && info_->sainfo()) {
+ save_ok = sequence_analysis_dump_to_file(file_name.toUtf8().constData(), info_->sainfo(), cap_file_.capFile(), 0);
}
// else error dialog?
if (save_ok) {
@@ -340,25 +339,25 @@ void SequenceDialog::on_buttonBox_accepted()
void SequenceDialog::fillDiagram()
{
- if (!sainfo_ || file_closed_) return;
+ if (!info_->sainfo() || file_closed_) return;
QCustomPlot *sp = ui->sequencePlot;
- if (sainfo_->type == SEQ_ANALYSIS_VOIP) {
- seq_diagram_->setData(sainfo_);
+ if (info_->sainfo()->type == SEQ_ANALYSIS_VOIP) {
+ seq_diagram_->setData(info_->sainfo());
} else {
seq_diagram_->clearData();
- sequence_analysis_list_free(sainfo_);
- sequence_analysis_list_get(cap_file_.capFile(), sainfo_);
- num_items_ = sequence_analysis_get_nodes(sainfo_);
- seq_diagram_->setData(sainfo_);
+ sequence_analysis_list_free(info_->sainfo());
+ sequence_analysis_list_get(cap_file_.capFile(), info_->sainfo());
+ num_items_ = sequence_analysis_get_nodes(info_->sainfo());
+ seq_diagram_->setData(info_->sainfo());
}
QFontMetrics vfm = QFontMetrics(sp->xAxis2->labelFont());
char* addr_str;
node_label_w_ = 0;
- for (guint i = 0; i < sainfo_->num_nodes; i++) {
- addr_str = (char*)address_to_display(NULL, &(sainfo_->nodes[i]));
+ for (guint i = 0; i < info_->sainfo()->num_nodes; i++) {
+ addr_str = (char*)address_to_display(NULL, &(info_->sainfo()->nodes[i]));
int label_w = vfm.width(addr_str);
if (node_label_w_ < label_w) {
node_label_w_ = label_w;
@@ -395,7 +394,7 @@ void SequenceDialog::panAxes(int x_pixels, int y_pixels)
void SequenceDialog::resetAxes(bool keep_lower)
{
- if (!sainfo_) return;
+ if (!info_->sainfo()) return;
QCustomPlot *sp = ui->sequencePlot;
// Allow space for labels on the top and port numbers on the left.
@@ -412,7 +411,7 @@ void SequenceDialog::resetAxes(bool keep_lower)
sp->yAxis->setRange(top_pos, range_ratio + top_pos);
double rmin = sp->xAxis2->range().size() / 2;
- ui->horizontalScrollBar->setRange((rmin - 0.5) * 100, (sainfo_->num_nodes - 0.5 - rmin) * 100);
+ ui->horizontalScrollBar->setRange((rmin - 0.5) * 100, (info_->sainfo()->num_nodes - 0.5 - rmin) * 100);
xAxisChanged(sp->xAxis2->range());
rmin = (sp->yAxis->range().size() / 2);
@@ -436,32 +435,32 @@ void SequenceDialog::on_actionGoToPacket_triggered()
void SequenceDialog::on_showComboBox_currentIndexChanged(int index)
{
- if (!sainfo_) return;
+ if (!info_->sainfo()) return;
if (index == 0) {
- sainfo_->all_packets = TRUE;
+ info_->sainfo()->all_packets = TRUE;
} else {
- sainfo_->all_packets = FALSE;
+ info_->sainfo()->all_packets = FALSE;
}
fillDiagram();
}
void SequenceDialog::on_flowComboBox_currentIndexChanged(int index)
{
- if (!sainfo_ || sainfo_->type == SEQ_ANALYSIS_VOIP || index < 0) return;
+ if (!info_->sainfo() || info_->sainfo()->type == SEQ_ANALYSIS_VOIP || index < 0) return;
- sainfo_->type = static_cast<seq_analysis_type>(ui->flowComboBox->itemData(index).toInt());
+ info_->sainfo()->type = static_cast<seq_analysis_type>(ui->flowComboBox->itemData(index).toInt());
fillDiagram();
}
void SequenceDialog::on_addressComboBox_currentIndexChanged(int index)
{
- if (!sainfo_) return;
+ if (!info_->sainfo()) return;
if (index == 0) {
- sainfo_->any_addr = TRUE;
+ info_->sainfo()->any_addr = TRUE;
} else {
- sainfo_->any_addr = FALSE;
+ info_->sainfo()->any_addr = FALSE;
}
fillDiagram();
}
@@ -511,6 +510,17 @@ void SequenceDialog::on_actionMoveDown1_triggered()
panAxes(0, -1);
}
+SequenceInfo::SequenceInfo(seq_analysis_info_t *sainfo) :
+ sainfo_(sainfo),
+ count_(1)
+{
+}
+
+SequenceInfo::~SequenceInfo()
+{
+ sequence_analysis_info_free(sainfo_);
+}
+
/*
* Editor modelines
*
diff --git a/ui/qt/sequence_dialog.h b/ui/qt/sequence_dialog.h
index f87bd2bd66..489ac3c026 100644
--- a/ui/qt/sequence_dialog.h
+++ b/ui/qt/sequence_dialog.h
@@ -43,12 +43,25 @@ class SequenceDialog;
class SequenceDiagram;
+class SequenceInfo
+{
+public:
+ SequenceInfo(seq_analysis_info_t *sainfo = NULL);
+ seq_analysis_info_t * sainfo() { return sainfo_;}
+ void ref() { count_++; }
+ void unref() { if (--count_ == 0) delete this; }
+private:
+ ~SequenceInfo();
+ seq_analysis_info_t *sainfo_;
+ unsigned int count_;
+};
+
class SequenceDialog : public WiresharkDialog
{
Q_OBJECT
public:
- explicit SequenceDialog(QWidget &parent, CaptureFile &cf, seq_analysis_info_t *sainfo = NULL);
+ explicit SequenceDialog(QWidget &parent, CaptureFile &cf, SequenceInfo *info = NULL);
~SequenceDialog();
signals:
@@ -89,7 +102,7 @@ private slots:
private:
Ui::SequenceDialog *ui;
SequenceDiagram *seq_diagram_;
- seq_analysis_info_t *sainfo_;
+ SequenceInfo *info_;
int num_items_;
guint32 packet_num_;
double one_em_;
diff --git a/ui/qt/voip_calls_dialog.cpp b/ui/qt/voip_calls_dialog.cpp
index 6897580bd9..4f29cfd399 100644
--- a/ui/qt/voip_calls_dialog.cpp
+++ b/ui/qt/voip_calls_dialog.cpp
@@ -199,6 +199,7 @@ VoipCallsDialog::VoipCallsDialog(QWidget &parent, CaptureFile &cf, bool all_flow
tapinfo_.fs_option = all_flows ? FLOW_ALL : FLOW_ONLY_INVITES; /* flow show option */
tapinfo_.graph_analysis = sequence_analysis_info_new();
tapinfo_.graph_analysis->type = SEQ_ANALYSIS_VOIP;
+ sequence_info_ = new SequenceInfo(tapinfo_.graph_analysis);
voip_calls_init_all_taps(&tapinfo_);
@@ -216,7 +217,7 @@ VoipCallsDialog::~VoipCallsDialog()
voip_calls_reset_all_taps(&tapinfo_);
voip_calls_remove_all_tap_listeners(&tapinfo_);
- sequence_analysis_info_free(tapinfo_.graph_analysis);
+ sequence_info_->unref();
g_queue_free(tapinfo_.callsinfos);
}
@@ -485,7 +486,7 @@ void VoipCallsDialog::showSequence()
cur_ga_item = g_list_next(cur_ga_item);
}
- SequenceDialog *sequence_dialog = new SequenceDialog(parent_, cap_file_, tapinfo_.graph_analysis);
+ SequenceDialog *sequence_dialog = new SequenceDialog(parent_, cap_file_, sequence_info_);
// XXX This goes away when we close the VoIP Calls dialog.
connect(sequence_dialog, SIGNAL(goToPacket(int)),
this, SIGNAL(goToPacket(int)));
diff --git a/ui/qt/voip_calls_dialog.h b/ui/qt/voip_calls_dialog.h
index 0b4d567878..42dc841629 100644
--- a/ui/qt/voip_calls_dialog.h
+++ b/ui/qt/voip_calls_dialog.h
@@ -37,6 +37,8 @@ struct _capture_file;
class QAbstractButton;
class QTreeWidgetItem;
+class SequenceInfo;
+
namespace Ui {
class VoipCallsDialog;
}
@@ -68,6 +70,7 @@ private:
QWidget &parent_;
voip_calls_tapinfo_t tapinfo_;
+ SequenceInfo *sequence_info_;
QPushButton *prepare_button_;
QPushButton *sequence_button_;
QPushButton *player_button_;
diff --git a/ui/voip_calls.c b/ui/voip_calls.c
index 0357977aee..432f79712b 100644
--- a/ui/voip_calls.c
+++ b/ui/voip_calls.c
@@ -272,13 +272,6 @@ voip_calls_reset_all_taps(voip_calls_tapinfo_t *tapinfo)
if(NULL!=tapinfo->callsinfo_hashtable[SIP_HASH])
g_hash_table_remove_all (tapinfo->callsinfo_hashtable[SIP_HASH]);
- /* free the graph data items first */
- if(NULL == tapinfo->graph_analysis) {
- tapinfo->graph_analysis = sequence_analysis_info_new();
- }
-
- sequence_analysis_list_free(tapinfo->graph_analysis);
-
/* free the strinfo data items first */
list = g_list_first(tapinfo->rtp_stream_list);
while(list)