summary |
shortlog |
log |
commit | commitdiff |
tree
raw |
patch |
inline | side by side (from parent 1:
cda5156)
Currently, the Session class doesn't hold pointers to the signal
data itself but instead fetches the data on demand using the list
of signals it has. As the Session is providing the model in the
MVC paradigm, it owns the data and thus should keep track of it
directly. The signals are (in an ideal world) mere views on that
data, so querying them for the signal data isn't good style.
+ // Remove all stored data
+ {
+ shared_lock<shared_mutex> lock(signals_mutex_);
+ for (const shared_ptr<data::SignalData> d : all_signal_data_)
+ d->clear();
+ }
+ all_signal_data_.clear();
cur_logic_segment_.reset();
for (auto entry : cur_analog_segments_) {
cur_logic_segment_.reset();
for (auto entry : cur_analog_segments_) {
- for (const shared_ptr<data::SignalData> d : get_data())
- d->clear();
+ {
+ shared_lock<shared_mutex> lock(signals_mutex_);
+ for (const shared_ptr<data::SignalData> d : all_signal_data_)
+ d->clear();
+ }
// Begin the session
sampling_thread_ = std::thread(
// Begin the session
sampling_thread_ = std::thread(
sampling_thread_.join();
}
sampling_thread_.join();
}
-set< shared_ptr<data::SignalData> > Session::get_data() const
-{
- shared_lock<shared_mutex> lock(signals_mutex_);
- set< shared_ptr<data::SignalData> > data;
- for (const shared_ptr<view::Signal> sig : signals_) {
- assert(sig);
- data.insert(sig->data());
- }
-
- return data;
-}
-
double Session::get_samplerate() const
{
double samplerate = 0.0;
double Session::get_samplerate() const
{
double samplerate = 0.0;
- for (const shared_ptr<pv::data::SignalData> d : get_data()) {
- assert(d);
- const vector< shared_ptr<pv::data::Segment> > segments =
- d->segments();
- for (const shared_ptr<pv::data::Segment> &s : segments)
- samplerate = std::max(samplerate, s->samplerate());
+ {
+ shared_lock<shared_mutex> lock(signals_mutex_);
+ for (const shared_ptr<pv::data::SignalData> d : all_signal_data_) {
+ assert(d);
+ const vector< shared_ptr<pv::data::Segment> > segments =
+ d->segments();
+ for (const shared_ptr<pv::data::Segment> &s : segments)
+ samplerate = std::max(samplerate, s->samplerate());
+ }
// If there is no sample rate given we use samples as unit
if (samplerate == 0.0)
samplerate = 1.0;
// If there is no sample rate given we use samples as unit
if (samplerate == 0.0)
samplerate = 1.0;
new view::LogicSignal(*this,
device_, channel,
logic_data_));
new view::LogicSignal(*this,
device_, channel,
logic_data_));
+ all_signal_data_.insert(logic_data_);
break;
case SR_CHANNEL_ANALOG:
break;
case SR_CHANNEL_ANALOG:
signal = shared_ptr<view::Signal>(
new view::AnalogSignal(
*this, channel, data));
signal = shared_ptr<view::Signal>(
new view::AnalogSignal(
*this, channel, data));
+ all_signal_data_.insert(data);
// The channel containing most samples should be most accurate
uint64_t sample_count = 0;
// The channel containing most samples should be most accurate
uint64_t sample_count = 0;
- for (const shared_ptr<pv::data::SignalData> d : get_data()) {
- assert(d);
- uint64_t temp_count = 0;
-
- const vector< shared_ptr<pv::data::Segment> > segments =
- d->segments();
- for (const shared_ptr<pv::data::Segment> &s : segments)
- temp_count += s->get_sample_count();
-
- if (temp_count > sample_count)
- sample_count = temp_count;
+ {
+ shared_lock<shared_mutex> lock(signals_mutex_);
+ for (const shared_ptr<pv::data::SignalData> d : all_signal_data_) {
+ assert(d);
+ uint64_t temp_count = 0;
+
+ const vector< shared_ptr<pv::data::Segment> > segments =
+ d->segments();
+ for (const shared_ptr<pv::data::Segment> &s : segments)
+ temp_count += s->get_sample_count();
+
+ if (temp_count > sample_count)
+ sample_count = temp_count;
+ }
}
trigger_event(sample_count / get_samplerate());
}
trigger_event(sample_count / get_samplerate());
- std::set< std::shared_ptr<data::SignalData> > get_data() const;
-
double get_samplerate() const;
const std::unordered_set< std::shared_ptr<view::Signal> >
double get_samplerate() const;
const std::unordered_set< std::shared_ptr<view::Signal> >
mutable boost::shared_mutex signals_mutex_;
std::unordered_set< std::shared_ptr<view::Signal> > signals_;
mutable boost::shared_mutex signals_mutex_;
std::unordered_set< std::shared_ptr<view::Signal> > signals_;
+ std::set< std::shared_ptr<data::SignalData> > all_signal_data_;
mutable std::recursive_mutex data_mutex_;
std::shared_ptr<data::Logic> logic_data_;
mutable std::recursive_mutex data_mutex_;
std::shared_ptr<data::Logic> logic_data_;