* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
+#ifdef _WIN32
+// Windows: Avoid boost/thread namespace pollution (which includes windows.h).
+#define NOGDI
+#define NORESOURCE
+#endif
+#include <boost/thread/locks.hpp>
+#include <boost/thread/shared_mutex.hpp>
+
#ifdef ENABLE_DECODE
#include <libsigrokdecode/libsigrokdecode.h>
#endif
// Ensure we are not capturing before setting the device
stop_capture();
+ if (device_)
+ device_->close();
+
device_ = std::move(device);
- device_->create();
+ device_->open();
device_->session()->add_datafeed_callback([=]
(shared_ptr<sigrok::Device> device, shared_ptr<Packet> packet) {
data_feed_in(device, packet);
return data;
}
-boost::shared_mutex& Session::signals_mutex() const
-{
- return signals_mutex_;
-}
-
-const unordered_set< shared_ptr<view::Signal> >& Session::signals() const
+const unordered_set< shared_ptr<view::Signal> > Session::signals() const
{
+ shared_lock<shared_mutex> lock(signals_mutex_);
return signals_;
}
cur_samplerate_ = device_->read_config<uint64_t>(ConfigKey::SAMPLERATE);
+ out_of_memory_ = false;
+
try {
device_->start();
} catch(Error e) {
qDebug("SR_DF_END was not received.");
assert(0);
}
+
+ if (out_of_memory_)
+ error_handler(tr("Out of memory, acquisition stopped."));
}
void Session::feed_in_header()
const vector<shared_ptr<Channel>> channels = analog->channels();
const unsigned int channel_count = channels.size();
const size_t sample_count = analog->num_samples() / channel_count;
- const float *data = analog->data_pointer();
+ const float *data = static_cast<const float *>(analog->data_pointer());
bool sweep_beginning = false;
for (auto channel : channels)
break;
case SR_DF_LOGIC:
- feed_in_logic(dynamic_pointer_cast<Logic>(packet->payload()));
+ try {
+ feed_in_logic(dynamic_pointer_cast<Logic>(packet->payload()));
+ } catch (std::bad_alloc) {
+ out_of_memory_ = true;
+ device_->stop();
+ }
break;
case SR_DF_ANALOG:
- feed_in_analog(dynamic_pointer_cast<Analog>(packet->payload()));
+ try {
+ feed_in_analog(dynamic_pointer_cast<Analog>(packet->payload()));
+ } catch (std::bad_alloc) {
+ out_of_memory_ = true;
+ device_->stop();
+ }
break;
case SR_DF_END: