projects
/
pulseview.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Session: Converted data_mutex_ into a std::recursive_mutex
[pulseview.git]
/
pv
/
session.cpp
diff --git
a/pv/session.cpp
b/pv/session.cpp
index 27154d13cd238c8713e4aab4f5415fa773cbd123..e187a4d35245aecefe25b344433346595664c1f4 100644
(file)
--- a/
pv/session.cpp
+++ b/
pv/session.cpp
@@
-60,6
+60,7
@@
using std::lock_guard;
using std::list;
using std::map;
using std::mutex;
using std::list;
using std::map;
using std::mutex;
+using std::recursive_mutex;
using std::set;
using std::shared_ptr;
using std::string;
using std::set;
using std::shared_ptr;
using std::string;
@@
-133,8
+134,7
@@
void Session::set_device(shared_ptr<devices::Device> device)
(shared_ptr<sigrok::Device> device, shared_ptr<Packet> packet) {
data_feed_in(device, packet);
});
(shared_ptr<sigrok::Device> device, shared_ptr<Packet> packet) {
data_feed_in(device, packet);
});
- device_manager_.update_display_name(device_);
- update_signals(device_);
+ update_signals();
decode_traces_.clear();
decode_traces_.clear();
@@
-302,13
+302,20
@@
void Session::set_capture_state(capture_state state)
capture_state_changed(state);
}
capture_state_changed(state);
}
-void Session::update_signals(
shared_ptr<devices::Device> device
)
+void Session::update_signals()
{
{
- assert(device);
+ assert(device
_
);
assert(capture_state_ == Stopped);
assert(capture_state_ == Stopped);
+ const shared_ptr<sigrok::Device> sr_dev = device_->device();
+ if (!sr_dev) {
+ signals_.clear();
+ logic_data_.reset();
+ return;
+ }
+
// Detect what data types we will receive
// Detect what data types we will receive
- auto channels =
device->device()
->channels();
+ auto channels =
sr_dev
->channels();
unsigned int logic_channel_count = std::count_if(
channels.begin(), channels.end(),
[] (shared_ptr<Channel> channel) {
unsigned int logic_channel_count = std::count_if(
channels.begin(), channels.end(),
[] (shared_ptr<Channel> channel) {
@@
-316,7
+323,7
@@
void Session::update_signals(shared_ptr<devices::Device> device)
// Create data containers for the logic data segments
{
// Create data containers for the logic data segments
{
- lock_guard<mutex> data_lock(data_mutex_);
+ lock_guard<
recursive_
mutex> data_lock(data_mutex_);
if (logic_channel_count == 0) {
logic_data_.reset();
if (logic_channel_count == 0) {
logic_data_.reset();
@@
-335,7
+342,7
@@
void Session::update_signals(shared_ptr<devices::Device> device)
unordered_set< shared_ptr<view::Signal> > prev_sigs(signals_);
signals_.clear();
unordered_set< shared_ptr<view::Signal> > prev_sigs(signals_);
signals_.clear();
- for (auto channel :
device->device()
->channels()) {
+ for (auto channel :
sr_dev
->channels()) {
shared_ptr<view::Signal> signal;
// Find the channel in the old signals
shared_ptr<view::Signal> signal;
// Find the channel in the old signals
@@
-358,7
+365,7
@@
void Session::update_signals(shared_ptr<devices::Device> device)
case SR_CHANNEL_LOGIC:
signal = shared_ptr<view::Signal>(
new view::LogicSignal(*this,
case SR_CHANNEL_LOGIC:
signal = shared_ptr<view::Signal>(
new view::LogicSignal(*this,
- device, channel,
+ device
_
, channel,
logic_data_));
break;
logic_data_));
break;
@@
-401,7
+408,12
@@
shared_ptr<view::Signal> Session::signal_from_channel(
void Session::read_sample_rate(shared_ptr<sigrok::Device> device)
{
assert(device);
void Session::read_sample_rate(shared_ptr<sigrok::Device> device)
{
assert(device);
- const auto keys = device->config_keys(ConfigKey::DEVICE_OPTIONS);
+ map< const ConfigKey*, set<sigrok::Capability> > keys;
+
+ try {
+ keys = device->config_keys(ConfigKey::DEVICE_OPTIONS);
+ } catch (const Error) {}
+
const auto iter = keys.find(ConfigKey::SAMPLERATE);
cur_samplerate_ = (iter != keys.end() &&
(*iter).second.find(sigrok::GET) != (*iter).second.end()) ?
const auto iter = keys.find(ConfigKey::SAMPLERATE);
cur_samplerate_ = (iter != keys.end() &&
(*iter).second.find(sigrok::GET) != (*iter).second.end()) ?
@@
-469,7
+481,7
@@
void Session::feed_in_frame_begin()
void Session::feed_in_logic(shared_ptr<Logic> logic)
{
void Session::feed_in_logic(shared_ptr<Logic> logic)
{
- lock_guard<mutex> lock(data_mutex_);
+ lock_guard<
recursive_
mutex> lock(data_mutex_);
if (!logic_data_)
{
if (!logic_data_)
{
@@
-519,7
+531,7
@@
void Session::feed_in_logic(shared_ptr<Logic> logic)
void Session::feed_in_analog(shared_ptr<Analog> analog)
{
void Session::feed_in_analog(shared_ptr<Analog> analog)
{
- lock_guard<mutex> lock(data_mutex_);
+ lock_guard<
recursive_
mutex> lock(data_mutex_);
const vector<shared_ptr<Channel>> channels = analog->channels();
const unsigned int channel_count = channels.size();
const vector<shared_ptr<Channel>> channels = analog->channels();
const unsigned int channel_count = channels.size();
@@
-623,7
+635,7
@@
void Session::data_feed_in(shared_ptr<sigrok::Device> device,
case SR_DF_END:
{
{
case SR_DF_END:
{
{
- lock_guard<mutex> lock(data_mutex_);
+ lock_guard<
recursive_
mutex> lock(data_mutex_);
cur_logic_segment_.reset();
cur_analog_segments_.clear();
}
cur_logic_segment_.reset();
cur_analog_segments_.clear();
}