diff options
author | Pascal Quantin <pascal.quantin@gmail.com> | 2015-11-15 22:57:43 +0100 |
---|---|---|
committer | Alexis La Goutte <alexis.lagoutte@gmail.com> | 2015-11-16 09:56:46 +0000 |
commit | 2773596970c362a6d81c7e44311781590074c43f (patch) | |
tree | 56bc2bad99653c9967b9589ef8610b1f82f153ee /ui | |
parent | 442314e8b2bdc4ea921bd7136aadb851652f4ce7 (diff) | |
download | wireshark-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.c | 5 | ||||
-rw-r--r-- | ui/qt/sequence_dialog.cpp | 82 | ||||
-rw-r--r-- | ui/qt/sequence_dialog.h | 17 | ||||
-rw-r--r-- | ui/qt/voip_calls_dialog.cpp | 5 | ||||
-rw-r--r-- | ui/qt/voip_calls_dialog.h | 3 | ||||
-rw-r--r-- | ui/voip_calls.c | 7 |
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) |