]> sigrok.org Git - pulseview.git/blobdiff - pv/data/segment.hpp
Session: Fix issue #67 by improving error handling
[pulseview.git] / pv / data / segment.hpp
index f1ff0f527370a80bbf6137d3291ee53715e6698d..f4601d0444c0a9bab0aa88dd9efe3e1996dde9e4 100644 (file)
 
 #include "pv/util.hpp"
 
-#include <thread>
+#include <atomic>
+#include <memory>
 #include <mutex>
-#include <vector>
+#include <thread>
+#include <deque>
+
+#include <QObject>
+
+using std::atomic;
+using std::recursive_mutex;
+using std::deque;
 
 namespace SegmentTest {
 struct SmallSize8Single;
@@ -36,8 +44,9 @@ struct MediumSize32Single;
 struct MaxSize32Single;
 struct MediumSize32Multi;
 struct MaxSize32Multi;
+struct MaxSize32MultiAtOnce;
 struct MaxSize32MultiIterated;
-}
+}  // namespace SegmentTest
 
 namespace pv {
 namespace data {
@@ -45,16 +54,17 @@ namespace data {
 typedef struct {
        uint64_t sample_index, chunk_num, chunk_offs;
        uint8_t* chunk;
-       uint8_t* value;
-} SegmentRawDataIterator;
+} SegmentDataIterator;
 
-class Segment
+class Segment : public QObject
 {
+       Q_OBJECT
+
 private:
        static const uint64_t MaxChunkSize;
 
 public:
-       Segment(uint64_t samplerate, unsigned int unit_size);
+       Segment(uint32_t segment_id, uint64_t samplerate, unsigned int unit_size);
 
        virtual ~Segment();
 
@@ -67,28 +77,41 @@ public:
 
        unsigned int unit_size() const;
 
+       uint32_t segment_id() const;
+
+       void set_complete();
+       bool is_complete() const;
+
        void free_unused_memory();
 
+Q_SIGNALS:
+       void completed();
+
 protected:
        void append_single_sample(void *data);
        void append_samples(void *data, uint64_t samples);
-       uint8_t* get_raw_samples(uint64_t start, uint64_t count) const;
-
-       SegmentRawDataIterator* begin_raw_sample_iteration(uint64_t start);
-       void continue_raw_sample_iteration(SegmentRawDataIterator* it, uint64_t increase);
-       void end_raw_sample_iteration(SegmentRawDataIterator* it);
-
-       mutable std::recursive_mutex mutex_;
-       std::vector<uint8_t*> data_chunks_;
+       const uint8_t* get_raw_sample(uint64_t sample_num) const;
+       void get_raw_samples(uint64_t start, uint64_t count, uint8_t *dest) const;
+
+       SegmentDataIterator* begin_sample_iteration(uint64_t start);
+       void continue_sample_iteration(SegmentDataIterator* it, uint64_t increase);
+       void end_sample_iteration(SegmentDataIterator* it);
+       uint8_t* get_iterator_value(SegmentDataIterator* it);
+       uint64_t get_iterator_valid_length(SegmentDataIterator* it);
+
+       uint32_t segment_id_;
+       mutable recursive_mutex mutex_;
+       deque<uint8_t*> data_chunks_;
        uint8_t* current_chunk_;
        uint64_t used_samples_, unused_samples_;
-       uint64_t sample_count_;
+       atomic<uint64_t> sample_count_;
        pv::util::Timestamp start_time_;
        double samplerate_;
        uint64_t chunk_size_;
        unsigned int unit_size_;
        int iterator_count_;
        bool mem_optimization_requested_;
+       bool is_complete_;
 
        friend struct SegmentTest::SmallSize8Single;
        friend struct SegmentTest::MediumSize8Single;
@@ -98,10 +121,15 @@ protected:
        friend struct SegmentTest::MaxSize32Single;
        friend struct SegmentTest::MediumSize32Multi;
        friend struct SegmentTest::MaxSize32Multi;
+       friend struct SegmentTest::MaxSize32MultiAtOnce;
        friend struct SegmentTest::MaxSize32MultiIterated;
 };
 
 } // namespace data
 } // namespace pv
 
+typedef std::shared_ptr<pv::data::Segment> SharedPtrToSegment;
+
+Q_DECLARE_METATYPE(SharedPtrToSegment);
+
 #endif // PULSEVIEW_PV_DATA_SEGMENT_HPP